diff --git a/README.md b/README.md index de3904d..03fe78d 100644 --- a/README.md +++ b/README.md @@ -2,852 +2,563 @@ ![.NET 8](https://img.shields.io/badge/.NET-8.0-blue) ![WPF](https://img.shields.io/badge/WPF-Windows-lightgrey) -![FFmpeg](https://img.shields.io/badge/FFmpeg-Required-green) +![Zero Dependencies](https://img.shields.io/badge/Dependencies-Zero-green) -**Ganimede** è un'applicazione desktop Windows avanzata per l'estrazione automatica di frame da file video. Progettata con WPF e .NET 8, offre un'interfaccia moderna, gestione coda multi-video e configurazioni personalizzabili per ogni job. +**Ganimede** è un'applicazione desktop Windows moderna e facile da usare per estrarre automaticamente frame (immagini) da file video. Non richiede installazioni complicate o configurazioni tecniche - basta scaricare ed eseguire! --- -## 📋 Indice +## 📋 Cosa Puoi Fare con Ganimede -- [Caratteristiche Principali](#-caratteristiche-principali) -- [Requisiti di Sistema](#-requisiti-di-sistema) -- [Installazione](#-installazione) -- [Guida Rapida](#-guida-rapida) -- [Interfaccia Utente](#-interfaccia-utente) -- [Modalità di Estrazione](#-modalità-di-estrazione) -- [Configurazione Avanzata dei Job](#-configurazione-avanzata-dei-job) -- [Pattern di Naming](#-pattern-di-naming) -- [Impostazioni Globali](#-impostazioni-globali) -- [Gestione della Coda](#-gestione-della-coda) -- [Casi d'Uso Comuni](#-casi-duso-comuni) -- [Risoluzione Problemi](#-risoluzione-problemi) -- [Architettura Tecnica](#-architettura-tecnica) +- ✅ **Estrarre immagini da video** in modo automatico +- 🎯 **Tre modalità intelligenti**: estrazione completa, singola immagine o automatica +- 📁 **Elaborare più video insieme** con una semplice coda +- 🖼️ **Vedere l'anteprima** delle immagini estratte +- ⚙️ **Personalizzare tutto**: nomi file, dimensioni, cartelle +- 🔄 **Zero configurazione** - tutto funziona subito! --- -## 🚀 Caratteristiche Principali +## 💻 Cosa Ti Serve -### Funzionalità Core -- ✅ **Estrazione batch multi-video** con gestione coda intelligente -- 🎯 **Tre modalità di estrazione**: Completa, Singolo Frame e Auto (con analisi euristica) -- 🔧 **Configurazione granulare** per singolo job o globale -- 📁 **Importazione massiva** da cartella con filtri automatici -- 🖼️ **Anteprima thumbnails** in tempo reale -- ⚙️ **6 pattern di naming** configurabili con prefissi custom -- 🔄 **Gestione sovrascrittura** (Chiedi, Salta, Sovrascrivi) -- 📐 **Ridimensionamento frame** con 5 preset (da 320x180 a Full HD) -- 📊 **Monitoraggio avanzato**: progressi in tempo reale, statistiche, log dettagliati -- 🎨 **Interfaccia moderna** dark-themed con feedback visivi immediati +### Requisiti Minimi +- **Computer**: Windows 10 o Windows 11 (64-bit) +- **Software**: .NET 8 (gratuito, si installa in 2 minuti) +- **Spazio disco**: 100 MB per l'applicazione + spazio per le tue immagini -### Modalità di Estrazione Intelligente - -#### 🔹 **Modalità Completa** (Full) -Estrae **tutti i frame** del video in immagini PNG sequenziali. -- **Ideale per**: analisi frame-by-frame, time-lapse, dataset ML, animazioni -- **Output**: 1 immagine PNG per ogni frame (es. video 60fps 10s = 600 immagini) - -#### 🔹 **Modalità Singolo Frame** (SingleFrame) -Estrae **un unico frame rappresentativo** dal centro del video. -- **Ideale per**: thumbnails, anteprime, screenshot rapidi -- **Output**: 1 singola immagine PNG -- **Ottimizzazione**: può evitare la creazione di sottocartelle (configurabile) - -#### 🔹 **Modalità Auto** (Auto) -Analizza il video tramite **euristica intelligente** e decide automaticamente: -- **Criteri di decisione**: - - ✓ Video ≤ 2 secondi → SingleFrame - - ✓ Video 3-45s con bitrate basso → SingleFrame (possibile video statico) - - ✓ Altri casi → Full extraction -- **Ideale per**: processamento batch di video eterogenei -- **Feedback**: suggerisce la modalità anche se Full è selezionato +**Nessun altro software richiesto!** Ganimede funziona usando le capacità video già integrate in Windows. --- -## 💻 Requisiti di Sistema +## 📦 Installazione (5 Minuti) -### Software -- **Sistema Operativo**: Windows 10/11 (x64) -- **Runtime**: .NET 8 Desktop Runtime ([Download](https://dotnet.microsoft.com/download/dotnet/8.0)) -- **FFmpeg**: Versione 4.4+ (binari `ffmpeg.exe` e `ffprobe.exe`) +### Passo 1: Scarica .NET 8 -### Hardware Minimo -- **CPU**: Dual-core 2.0 GHz -- **RAM**: 4 GB -- **Spazio Disco**: 100 MB (applicazione) + spazio per frame estratti +1. Vai su [Download .NET 8](https://dotnet.microsoft.com/download/dotnet/8.0) +2. Clicca su **"Download .NET Desktop Runtime 8.0"** (Windows, x64) +3. Esegui il file scaricato e segui l'installazione guidata +4. Riavvia il computer (opzionale ma consigliato) -### Formati Video Supportati -`MP4`, `AVI`, `MOV`, `MKV`, `WMV`, `FLV`, `WEBM` +**Come verificare l'installazione:** +- Apri il Prompt dei comandi (cerca "cmd" nel menu Start) +- Scrivi `dotnet --version` e premi Invio +- Dovresti vedere un numero di versione (es. `8.0.0`) + +### Passo 2: Scarica Ganimede + +1. Vai alla [pagina Releases](https://192.168.30.23/Alby96/Ganimede/-/releases) del progetto +2. Scarica l'ultima versione (file `Ganimede-v1.0.zip`) +3. Estrai il file ZIP in una cartella (es. `C:\Programmi\Ganimede`) + +### Passo 3: Avvia Ganimede + +1. Apri la cartella dove hai estratto Ganimede +2. Fai doppio clic su `Ganimede.exe` +3. Se Windows chiede conferma, clicca **"Esegui comunque"** + +🎉 **Fatto!** L'applicazione è pronta all'uso. --- -## 📦 Installazione +## 🚀 Guida Rapida (Primi 5 Minuti) -### 1. Installare .NET 8 Runtime -```powershell -# Verifica versione installata -dotnet --list-runtimes +### Come Estrarre Immagini da un Video -# Se non installato, scarica da: -# https://dotnet.microsoft.com/download/dotnet/8.0 +#### **Metodo Semplice (Per Iniziare)** + +1. **Avvia Ganimede** (doppio clic su `Ganimede.exe`) + +2. **Scegli dove salvare le immagini** + - Clicca il pulsante 🗂️ **"Seleziona Cartella Output"** in alto + - Scegli una cartella (es. `Documenti\FramiVideo`) + - Clicca **"Seleziona cartella"** + +3. **Aggiungi il tuo video** + - Clicca il pulsante ➕ **"Aggiungi Video"** + - Scegli un video dal tuo computer (es. `vacanze.mp4`) + - Clicca **"Apri"** + +4. **Avvia l'estrazione** + - Clicca il pulsante ▶️ **"Avvia Coda"** verde in alto + - Aspetta che la barra di avanzamento arrivi al 100% + - Vedrai il messaggio "Completato ✅" + +5. **Guarda le tue immagini** + - Apri la cartella che hai scelto al passo 2 + - Troverai una sottocartella con il nome del video + - Dentro ci sono tutte le immagini estratte! + +**Esempio di risultato:** +``` +📁 Documenti\FramiVideo\ + └─ 📁 vacanze\ + ├─ 🖼️ vacanze_000001.png + ├─ 🖼️ vacanze_000002.png + ├─ 🖼️ vacanze_000003.png + └─ ... (tante altre!) ``` -### 2. Installare FFmpeg +#### **Metodo Veloce (Più Video Insieme)** -#### Opzione A: Installazione Manuale -1. Scarica FFmpeg da [ffmpeg.org](https://ffmpeg.org/download.html) o [gyan.dev](https://www.gyan.dev/ffmpeg/builds/) -2. Estrai l'archivio (es. in `C:\ffmpeg\`) -3. Copia i binari da `bin\`: - - `ffmpeg.exe` - - `ffprobe.exe` -4. Configura il percorso in Ganimede → **⚙ Impostazioni** → **Configurazione FFmpeg** +1. **Scegli la cartella output** (come sopra) -#### Opzione B: Installazione con Chocolatey -```powershell -choco install ffmpeg -``` +2. **Aggiungi tutti i video** + - Clicca 📁 **"Importa Cartella"** + - Scegli una cartella con tanti video dentro + - Ganimede li aggiunge tutti alla coda automaticamente -#### Opzione C: Variabile PATH (Opzionale) -Aggiungi la cartella `bin` di FFmpeg alla variabile d'ambiente `PATH` per il rilevamento automatico. - -### 3. Avviare Ganimede -```powershell -# Dalla directory di build -cd Ganimede\bin\Release\net8.0-windows -.\Ganimede.exe -``` +3. **Avvia e aspetta** + - Clicca ▶️ **"Avvia Coda"** + - Ganimede elabora tutti i video uno dopo l'altro + - Puoi vedere il progresso di ciascuno nella lista --- -## 🎯 Guida Rapida +## 🎯 Le Tre Modalità di Estrazione -### Workflow Base (5 minuti) +Ganimede può estrarre immagini in tre modi diversi. Puoi scegliere quale usare nelle **Impostazioni**. -1. **Seleziona cartella output** - ``` - Toolbar → 🗂 Seleziona Cartella Output → Scegli destinazione - ``` +### 1️⃣ **Modalità Completa** (Predefinita) -2. **Aggiungi video** - ``` - Toolbar → ➕ Aggiungi Video → Seleziona uno o più file - ``` - Oppure: - ``` - Toolbar → 📁 Importa Cartella → Importa tutti i video dalla cartella - ``` +**Cosa fa:** Estrae **tutte** le immagini dal video, una per ogni fotogramma. -3. **Avvia elaborazione** - ``` - Toolbar → ▶ Avvia Coda - ``` +**Quando usarla:** +- Vuoi analizzare il video fotogramma per fotogramma +- Stai creando un'animazione +- Hai bisogno di tante immagini per un progetto -4. **Monitora progressi** - - Barra di avanzamento per ogni job - - Statistiche in tempo reale nella barra di stato - - Anteprima thumbnails nel pannello destro +**Esempio:** Un video di 10 secondi a 30 fps = 300 immagini -### Workflow Avanzato - -1. **Seleziona video** (checkbox nei job) -2. **Configura selezionati** - ``` - Toolbar → ⚙ Configura Selezionati → Imposta parametri custom - ``` -3. **Avvia coda** e monitora l'elaborazione differenziata +**Pro:** Ottieni ogni singolo fotogramma +**Contro:** Crea tanti file (può richiedere molto spazio disco) --- -## 🖥️ Interfaccia Utente +### 2️⃣ **Modalità Singola Immagine** -### Toolbar Principale +**Cosa fa:** Estrae **1 sola** immagine dal centro del video. -| Pulsante | Funzione | Shortcut | -|----------|----------|----------| -| **➕ Aggiungi Video** | Apre dialog selezione file multipli | - | -| **📁 Importa Cartella** | Importa tutti i video da una cartella | - | -| **🗂 Seleziona Cartella Output** | Imposta cartella destinazione globale | - | -| **⚙ Configura Selezionati** | Apre finestra configurazione job selezionati | Solo se ≥1 selezionato | -| **▶ Avvia Coda** | Inizia elaborazione job in stato "Pending" | Disabilitato durante elaborazione | -| **⏹ Ferma** | Interrompe elaborazione corrente | Solo durante elaborazione | -| **🧹 Pulisci Completati** | Rimuove job completati/falliti/cancellati | - | -| **🗑 Pulisci Tutto** | Svuota l'intera coda (conferma richiesta) | - | -| **⚙ Impostazioni** | Apre finestra impostazioni globali | - | +**Quando usarla:** +- Vuoi solo un'anteprima o una copertina del video +- Hai bisogno di velocità (1 secondo per video) +- Vuoi risparmiare spazio su disco -### Pannello Coda Job +**Esempio:** Un video di 10 secondi → 1 immagine dall'istante 5 secondi -Ogni job mostra: -- ☑️ **Checkbox**: Selezione per configurazione batch -- 📹 **Nome video** + percentuale progresso -- 📊 **Barra di avanzamento**: Progresso in tempo reale -- 📝 **Stato**: Messaggio dettagliato operazione corrente -- 📋 **Configurazione**: - - 📁 Cartella output (Default o custom) - - 📐 Dimensione frame (Original, 320x180, etc.) - - 🔄 Modalità sovrascrittura (Ask, Skip, Overwrite) - - 🏷 Pattern naming (VideoNameProgressive, etc.) - - 🎯 Modalità estrazione (Full, SingleFrame, Auto) -- ✕ **Rimuovi**: Elimina job dalla coda - -### Pannello Laterale Destro - -#### Impostazioni Globali -- **Cartella Output**: Path globale per nuovi job (modificabile) -- **Anteprima Thumbnails**: - - Mostra fino a 60 frame dell'ultimo video completato - - Scroll verticale per navigare - - Dimensioni: 90x52px per thumbnail - -### Barra di Stato - -Informazioni in tempo reale: -``` -Pronto | Job: In attesa: 3 | In corso: 1 | Completati: 5 | Falliti: 0 -``` +**Pro:** Velocissimo, occupa poco spazio +**Contro:** Solo un'immagine per video --- -## 🎯 Modalità di Estrazione +### 3️⃣ **Modalità Automatica** (Intelligente) -### Comparazione Modalità +**Cosa fa:** Ganimede **analizza** il video e **decide** automaticamente: +- Video molto breve (≤ 2 secondi) → Estrae 1 sola immagine +- Video breve ma statico (3-45 sec, poco movimento) → Estrae 1 sola immagine +- Altri video → Estrazione completa -| Caratteristica | Full | SingleFrame | Auto | -|---------------|------|-------------|------| -| **Frame estratti** | Tutti | 1 (centrale) | Variabile | -| **Analisi preliminare** | ❌ | ❌ | ✅ | -| **Tempo elaborazione** | Alto | Minimo | Variabile | -| **Uso disco** | Alto | Minimo | Variabile | -| **Sottocartelle** | Sempre* | Opzionale* | Automatico | -| **Caso d'uso** | Analisi dettagliata | Thumbnails | Batch misti | +**Quando usarla:** +- Hai una cartella con video di tipi diversi (corti e lunghi) +- Vuoi che Ganimede scelga il metodo migliore automaticamente +- Non sei sicuro quale modalità usare -*Configurabile nelle impostazioni globali +**Esempio:** +- Video corto di 1 secondo → 1 immagine +- Video lungo di 5 minuti → tutte le immagini -### Algoritmo Euristica Modalità Auto - -``` -1. Analizza metadata video (FFProbe) - ├─ Durata - ├─ Framerate - ├─ Bitrate - └─ Risoluzione - -2. Applica regole euristiche: - ├─ SE durata ≤ 2s - │ └─> SUGGERIMENTO: SingleFrame - ├─ SE 3s < durata < 45s AND bitrate < (pixels * 0.3) - │ └─> SUGGERIMENTO: SingleFrame (video statico probabile) - └─ ALTRIMENTI - └─> SUGGERIMENTO: Full - -3. Applica suggerimento e processa -``` - -### Configurazione Sottocartelle (SingleFrame) - -**Comportamento predefinito:** -- `Full/Auto→Full`: Crea sempre sottocartella `OutputFolder\VideoName\` -- `SingleFrame`: Opzionale (impostazione `SingleFrameUseSubfolder`) - -**Esempio Output:** -``` -✓ Full extraction (CreateSubfolder=true): - C:\Output\Video1\frame_000001.png - C:\Output\Video1\frame_000002.png - ... - -✓ Single Frame (SingleFrameUseSubfolder=false): - C:\Output\Video1_000001.png - -✓ Single Frame (SingleFrameUseSubfolder=true): - C:\Output\Video1\Video1_000001.png -``` +**Pro:** Intelligente, ottimizza spazio e tempo automaticamente +**Contro:** Non hai controllo totale sulla scelta --- -## ⚙️ Configurazione Avanzata dei Job - -### Finestra "Configura Selezionati" - -Accessibile tramite **⚙ Configura Selezionati** dopo aver selezionato ≥1 job. - -#### Sezione 1: Cartella di Output (Override) -- ☑️ **Usa cartella di output personalizzata** - - Sovrascrive la cartella globale per i job selezionati - - Include pulsante **Sfoglia** per selezione visuale -- ☑️ **Crea sottocartella per ogni video** - - Se abilitato: `OutputFolder\VideoName\frames...` - - Se disabilitato: `OutputFolder\frames...` (rischio collisione!) - -#### Sezione 2: Modalità di Estrazione -``` -○ Completa → Estrae tutti i frame -○ Singolo Frame → Estrae solo frame centrale -○ Auto → Decide automaticamente via euristica -``` - -#### Sezione 3: Pattern Nome File (Override) -- ☑️ **Usa pattern di naming personalizzato** -- **Dropdown pattern**: 6 opzioni disponibili (vedi [Pattern di Naming](#-pattern-di-naming)) -- **Prefisso Custom**: Campo testo per `CustomProgressive` pattern -- **Anteprima Live**: Mostra esempio filename in tempo reale - -#### Sezione 4: Modalità Sovrascrittura (Override) -- ☑️ **Usa comportamento di sovrascrittura personalizzato** -- **Opzioni**: - - `Chiedi`: Dialog conferma per ogni job con file esistenti - - `Salta`: Ignora frame già esistenti (velocizza re-run) - - `Sovrascrivi`: Forza sovrascrittura senza chiedere - -#### Sezione 5: Ridimensionamento Frame (Override) -- ☑️ **Usa dimensione frame personalizzata** -- **Preset disponibili**: - - `Risoluzione Originale` (default) - - `320x180` (Veloce, ~56KB/frame) - - `640x360` (Media, ~150KB/frame) - - `1280x720` (HD, ~400KB/frame) - - `1920x1080` (Full HD, ~800KB/frame) - -**Nota**: Ridimensionamenti maggiori aumentano tempo elaborazione e uso CPU. +**Come Cambiare Modalità:** +1. Clicca ⚙️ **"Impostazioni"** in alto +2. Vai alla sezione **"Impostazioni di Elaborazione"** +3. Cambia **"Modalità di Estrazione Predefinita"** +4. Clicca **"Salva"** --- -## 🏷️ Pattern di Naming +## ⚙️ Impostazioni (Personalizza Come Vuoi) -### Pattern Disponibili - -#### 1. **VideoNameProgressive** (Default) -``` -Formato: {NomeVideo}_{Progressivo6Cifre}.png -Esempio: Video1_000001.png, Video1_000002.png, ... -Uso: Sequenze ordinate identificabili -``` - -#### 2. **FrameProgressive** -``` -Formato: frame_{Progressivo6Cifre}.png -Esempio: frame_000001.png, frame_000002.png, ... -Uso: Naming generico, compatibilità universal -``` - -#### 3. **VideoNameTimestamp** -``` -Formato: {NomeVideo}_{TimestampMs}.png -Esempio: Video1_000000ms.png, Video1_033ms.png, ... -Uso: Ricostruzione timeline esatta, sincronizzazione -``` - -#### 4. **CustomProgressive** -``` -Formato: {PrefissoCustom}_{Progressivo6Cifre}.png -Esempio: dataset_000001.png, train_000001.png, ... -Uso: Organizzazione dataset ML, batch naming -``` - -#### 5. **TimestampOnly** -``` -Formato: {Ore}h{Minuti}m{Secondi}s{Millisecondi}ms.png -Esempio: 00h00m00s000ms.png, 00h12m34s567ms.png, ... -Uso: Timeline pura, analisi temporale -``` - -#### 6. **VideoNameFrameProgressive** -``` -Formato: {NomeVideo}_frame_{Progressivo6Cifre}.png -Esempio: Video1_frame_000001.png, Video1_frame_000002.png, ... -Uso: Massima chiarezza, identificazione immediata -``` - -### Configurazione Prefisso Custom - -Nel pattern **CustomProgressive**, il prefisso si configura: -- **Globale**: Impostazioni → Naming File → `Prefisso Custom Predefinito` -- **Per Job**: Configura Selezionati → Pattern Nome File → `Prefisso` - -**Caratteri validi**: `a-z A-Z 0-9 _ -` +### Aprire le Impostazioni +Clicca il pulsante ⚙️ **"Impostazioni"** nella barra in alto. --- -## 🌐 Impostazioni Globali +### **Sezione: Output** -Accesso: **⚙ Impostazioni** (Toolbar) +#### 📁 Crea sottocartella per ogni video +- **Cosa fa:** Se attivo, crea una cartella separata per ogni video +- **Esempio:** + - ✅ **Attivo:** `Output\vacanze\immagine_001.png` + - ❌ **Disattivo:** `Output\immagine_001.png` (tutti i video nella stessa cartella) +- **Consiglio:** Lascia attivo per evitare confusione -### Sezione: Configurazione FFmpeg - -#### Cartella Binari FFmpeg -- **Path**: Percorso assoluto alla cartella contenente `ffmpeg.exe` e `ffprobe.exe` -- **Validazione**: Controllo esistenza binari in tempo reale -- **Fallback**: Se path vuoto, cerca FFmpeg nel `PATH` di sistema -- **Status Indicator**: - - ✅ Verde: Binari trovati e validi - - ❌ Rosso: Binari mancanti o non validi - -**Esempio path validi:** -``` -C:\ffmpeg\bin -C:\Program Files\FFmpeg\bin -D:\Tools\ffmpeg-6.0\bin -``` - -### Sezione: Output - -#### Crea sottocartella per ogni video -- **Default**: ✅ Abilitato -- **Comportamento**: - - ✅ ON: `C:\Output\Video1\frames...` - - ❌ OFF: `C:\Output\frames...` (tutti i video nella stessa cartella) -- **Nota**: Disabilitare aumenta rischio collisione nomi file - -#### Cartella Output Predefinita -- **Path**: Cartella globale per nuovi job aggiunti -- **Persistenza**: Salvata in `Settings.Default.LastOutputFolder` -- **Override**: Configurabile per job singoli - -### Sezione: Impostazioni di Elaborazione - -#### Dimensione Frame Predefinita -- **Preset**: 5 opzioni (vedi [Ridimensionamento](#sezione-5-ridimensionamento-frame-override)) -- **Default**: `Dimensione Originale` -- **Impatto performance**: - - Original: 0% overhead - - 320x180: +10% tempo - - 1920x1080: +40% tempo (resize algoritmico) - -#### Comportamento Sovrascrittura Predefinito -- **Opzioni**: `Chiedi` | `Salta` | `Sovrascrivi` -- **Default**: `Chiedi` -- **Uso consigliato**: - - `Chiedi`: Primo run, prudenza - - `Salta`: Re-run incrementali, resume jobs - - `Sovrascrivi`: Ri-elaborazione forzata, pulizia output - -#### Modalità di Estrazione Predefinita -- **Opzioni**: `Completa` | `Singolo Frame` | `Auto` -- **Default**: `Completa` -- **Impatto**: Si applica a tutti i nuovi job aggiunti - -#### Singolo Frame: salvataggio -- ☑️ **Crea sottocartella anche per job a singolo frame** -- **Default**: ❌ Disabilitato (salva diretto in cartella output) -- **Se abilitato**: Crea `OutputFolder\VideoName\frame.png` anche per SingleFrame - -### Sezione: Naming File - -#### Pattern di Naming Predefinito -- **Dropdown**: 6 pattern disponibili -- **Preview Live**: Mostra esempio aggiornato in tempo reale -- **Apply**: Si applica a tutti i nuovi job (job esistenti invariati) - -#### Prefisso Custom Predefinito -- **Campo testo**: Stringa alfanumerica (default: `custom`) -- **Uso**: Pattern `CustomProgressive` -- **Anteprima dinamica**: Aggiornamento preview pattern istantaneo - -**Esempio Anteprima:** -``` -Pattern: CustomProgressive -Prefisso: dataset -Preview: dataset_000001.png -``` +#### 📂 Cartella Output Predefinita +- **Cosa fa:** La cartella dove salvare tutte le immagini estratte +- **Come cambiarla:** Clicca **"Sfoglia"** e scegli una nuova cartella +- **Consiglio:** Usa una cartella facile da ricordare, come `Documenti\ImmaginiVideo` --- -## 📊 Gestione della Coda +### **Sezione: Impostazioni di Elaborazione** -### Stati Job +#### 📐 Dimensione Immagini +Scegli quanto grandi devono essere le immagini estratte: -| Stato | Icona | Descrizione | Azioni Disponibili | -|-------|-------|-------------|-------------------| -| **Pending** | ⏳ | In attesa di elaborazione | Configura, Rimuovi, Avvia | -| **Processing** | ▶️ | Elaborazione in corso | Ferma (cancel) | -| **Completed** | ✅ | Completato con successo | Rimuovi, Pulisci | -| **Failed** | ❌ | Errore durante elaborazione | Rimuovi, Pulisci | -| **Cancelled** | ⏹ | Annullato dall'utente | Rimuovi, Pulisci | +| Opzione | Risoluzione | Quando Usarla | Dimensione File | +|---------|-------------|---------------|-----------------| +| **Originale** | Come il video | Massima qualità | Grande (~1 MB) | +| **1920x1080** | Full HD | Video alta qualità | Media (~800 KB) | +| **1280x720** | HD | Uso normale | Piccola (~400 KB) | +| **640x360** | SD | Anteprime web | Molto piccola (~150 KB) | +| **320x180** | Miniatura | Icone/thumbnail | Mini (~56 KB) | -### Operazioni sulla Coda - -#### ▶ Avvia Coda -- Elabora **sequenzialmente** tutti i job in stato `Pending` -- Disabilita pulsante durante elaborazione -- Continua finché coda vuota o `Ferma` premuto - -#### ⏹ Ferma -- Cancella job corrente dopo il frame in elaborazione -- Non interrompe immediatamente (attende completamento frame) -- Job corrente passa in stato `Cancelled` - -#### 🧹 Pulisci Completati -- Rimuove job in stato: `Completed`, `Failed`, `Cancelled` -- Mantiene job `Pending` e `Processing` -- Operazione istantanea senza conferma - -#### 🗑 Pulisci Tutto -- **Se nessun job in elaborazione**: - - Conferma → Svuota coda completamente -- **Se job in elaborazione**: - - Dialog tri-opzione: - - `Sì`: Ferma tutto e svuota - - `No`: Rimuovi solo job non in elaborazione - - `Annulla`: Annulla operazione - -#### ⚙ Configura Selezionati -- Disponibile solo con ≥1 job selezionato (checkbox) -- Applica configurazioni custom in batch -- Job non selezionati rimangono invariati - -### Statistiche Coda (Barra di Stato) - -``` -Job: In attesa: 3 | In corso: 1 | Completati: 5 | Falliti: 0 -``` - -- **In attesa**: Count job `Pending` -- **In corso**: Count job `Processing` (max 1) -- **Completati**: Count job `Completed` -- **Falliti**: Count job `Failed` +**Consiglio:** Per la maggior parte degli usi, **1280x720** è perfetto (qualità buona, file non troppo grandi). --- -## 💡 Casi d'Uso Comuni +#### 🔄 Comportamento Sovrascrittura +Cosa succede se le immagini esistono già nella cartella: -### 1. Creazione Dataset Machine Learning +- **Chiedi** (predefinito): Ti chiede ogni volta cosa fare +- **Salta**: Non rielabora, salta le immagini già esistenti (utile per riprendere lavori interrotti) +- **Sovrascrivi**: Cancella e ricrea tutto (usa se vuoi rigenerare tutto) -**Obiettivo**: Estrarre 10.000 frame da 50 video per training CNN. +**Consiglio:** Usa **"Chiedi"** la prima volta, poi **"Salta"** per risparmiare tempo. +--- + +#### 🎯 Modalità di Estrazione +Scegli la modalità predefinita (vedi sezione [Le Tre Modalità](#-le-tre-modalità-di-estrazione)): +- **Completa**: Tutte le immagini +- **Singola Immagine**: Solo 1 immagine +- **Automatica**: Ganimede decide (raccomandato se non sei sicuro) + +--- + +#### 📂 Singolo Frame: Salvataggio +- **Cosa fa:** Quando usi "Singola Immagine", puoi decidere se creare comunque una sottocartella +- ✅ **Attivo:** Crea `Output\video\video_000001.png` +- ❌ **Disattivo:** Crea `Output\video_000001.png` (direttamente nella cartella principale) + +**Consiglio:** Lascia disattivo per avere tutte le immagini singole in un unico posto. + +--- + +### **Sezione: Naming File** + +#### 🏷️ Come Chiamare i File +Ganimede può chiamare le immagini in modi diversi. Scegli quello che preferisci: + +**1. VideoNameProgressive** (Predefinito) ``` -1. Importa Cartella → Seleziona cartella video -2. Configura Selezionati (seleziona tutti): - - Modalità: Completa - - Dimensione: 640x360 (Media) - - Naming: CustomProgressive - - Prefisso: train - - Sovrascrittura: Sovrascrivi +vacanze_000001.png +vacanze_000002.png +vacanze_000003.png +``` +✅ **Usa questo se:** Vuoi file ordinati numericamente con il nome del video + +**2. FrameProgressive** +``` +frame_000001.png +frame_000002.png +frame_000003.png +``` +✅ **Usa questo se:** Non ti interessa il nome del video, vuoi solo numerazione + +**3. VideoNameTimestamp** +``` +vacanze_000000ms.png +vacanze_033ms.png +vacanze_067ms.png +``` +✅ **Usa questo se:** Vuoi sapere a che secondo del video corrisponde l'immagine + +**4. CustomProgressive** +``` +mio_prefisso_000001.png +mio_prefisso_000002.png +mio_prefisso_000003.png +``` +✅ **Usa questo se:** Vuoi dare un nome personalizzato ai file + +**Come personalizzare:** Scrivi il tuo prefisso nel campo **"Prefisso Custom"** (es. `foto_vacanze`) + +**5. TimestampOnly** +``` +00h00m00s000ms.png +00h00m00s033ms.png +00h00m01s500ms.png +``` +✅ **Usa questo se:** Vuoi i nomi basati solo sul tempo + +**6. VideoNameFrameProgressive** +``` +vacanze_frame_000001.png +vacanze_frame_000002.png +vacanze_frame_000003.png +``` +✅ **Usa questo se:** Vuoi il massimo della chiarezza nei nomi + +--- + +### **Salvare le Impostazioni** + +Dopo aver fatto le modifiche: +1. Clicca **"Salva"** in basso +2. La finestra si chiude +3. Le tue impostazioni sono ora attive per tutti i nuovi video! + +**Nota:** I video già in coda mantengono le vecchie impostazioni. Per cambiarle: +- Seleziona i video (checkbox a sinistra) +- Clicca ⚙️ **"Configura Selezionati"** +- Cambia le impostazioni solo per quei video + +--- + +## 🛠️ Funzioni Avanzate (Per Utenti Esperti) + +### Configurare Video Singoli + +Se vuoi impostazioni diverse per video specifici: + +1. **Aggiungi i video** alla coda +2. **Seleziona** i video che vuoi configurare (checkbox a sinistra) +3. Clicca ⚙️ **"Configura Selezionati"** in alto +4. Nella finestra che appare, puoi cambiare: + - Cartella di output specifica + - Dimensione immagini + - Modalità estrazione + - Nome file + - Comportamento sovrascrittura +5. Clicca **"Salva"** + +**Esempio pratico:** +- Video 1 → Estrazione completa in HD +- Video 2 → Solo 1 immagine piccola +- Video 3 → Estrazione automatica in Full HD + +### Importare da Cartella + +Se hai tanti video in una cartella: + +1. Clicca 📁 **"Importa Cartella"** +2. Scegli la cartella con i video +3. Ganimede aggiunge automaticamente tutti i video supportati +4. Clicca ▶️ **"Avvia Coda"** + +### Fermare l'Elaborazione + +Se vuoi fermare: +1. Clicca ⏹️ **"Ferma"** in alto +2. Ganimede finisce l'immagine corrente e poi si ferma +3. Il video in elaborazione viene marcato come "Cancellato" + +### Pulire la Coda + +Dopo aver finito: +- 🧹 **"Pulisci Completati"**: Rimuove solo i video completati/falliti +- 🗑️ **"Pulisci Tutto"**: Svuota completamente la coda + +--- + +## 💡 Esempi Pratici + +### Caso 1: Creare una Copertina per Video + +**Obiettivo:** Estrarre 1 immagine da 50 video per creare miniature. + +**Passi:** +1. Impostazioni → Modalità: **Singola Immagine** +2. Impostazioni → Dimensione: **640x360** +3. Importa Cartella → Seleziona cartella con 50 video +4. Avvia Coda +5. **Risultato:** 50 immagini di copertina in pochi minuti! + +--- + +### Caso 2: Estrarre Tutti i Frame da un Video + +**Obiettivo:** Analizzare un video fotogramma per fotogramma. + +**Passi:** +1. Impostazioni → Modalità: **Completa** +2. Impostazioni → Dimensione: **Originale** +3. Aggiungi Video → Scegli il video +4. Avvia Coda +5. **Risultato:** Tutte le immagini in `Output\NomeVideo\` + +--- + +### Caso 3: Batch Automatico (Video Misti) + +**Obiettivo:** Estrarre immagini da video di durata diversa in modo intelligente. + +**Passi:** +1. Impostazioni → Modalità: **Automatica** +2. Importa Cartella → Seleziona cartella con video misti 3. Avvia Coda -4. Output: train_000001.png ... train_010000.png -``` - -**Risultato**: Dataset uniforme pronto per ingestion. - -### 2. Thumbnails Video Gallery - -**Obiettivo**: Generare 1 thumbnail per ogni video in una libreria di 200 video. - -``` -1. Importa Cartella → Seleziona libreria video -2. Impostazioni → Modalità Estrazione: Singolo Frame -3. Impostazioni → Singolo Frame: Disabilita sottocartelle -4. Impostazioni → Dimensione: 320x180 -5. Impostazioni → Naming: VideoNameProgressive -6. Avvia Coda -7. Output: Video1_000001.png, Video2_000001.png, ... -``` - -**Risultato**: 200 thumbnails in cartella unica, pronti per web gallery. - -### 3. Time-Lapse Frame Extraction - -**Obiettivo**: Estrarre tutti i frame da video timelapse per post-processing. - -``` -1. Aggiungi Video → Seleziona timelapse.mp4 -2. Configura Selezionato: - - Modalità: Completa - - Dimensione: Original - - Naming: VideoNameFrameProgressive - - Sovrascrittura: Chiedi -3. Avvia Coda -4. Post-processing: import in DaVinci Resolve / After Effects -``` - -**Risultato**: Sequenza frame originali per grading/compositing. - -### 4. Batch Eterogeneo (Screenshot + Sequenze) - -**Obiettivo**: 10 video misti (documentari + clip brevi) → estrazione intelligente. - -``` -1. Importa Cartella → Seleziona 10 video -2. Configura Selezionati (seleziona tutti): - - Modalità: Auto - - Dimensione: 1280x720 - - Naming: VideoNameProgressive -3. Avvia Coda -4. Sistema analizza ogni video e: - - Clip 3s staticità → 1 frame - - Documentari 30min → full extraction -``` - -**Risultato**: Ottimizzazione automatica tempo/spazio. - -### 5. Resume Job Interrotto - -**Obiettivo**: Riprendere estrazione interrotta senza ri-elaborare frame esistenti. - -``` -1. (Job precedente interrotto, 1500/5000 frame estratti) -2. Configura Job: - - Sovrascrittura: Salta -3. Avvia Coda -4. Sistema salta frame 1-1500, riprende da 1501 -``` - -**Risultato**: Risparmio tempo, nessuna duplicazione. - -### 6. Multi-Resolution Export - -**Obiettivo**: Estrarre stessi frame in 3 risoluzioni (thumbnails, web, archivio). - -``` -1. Aggiungi Video → video.mp4 (3 volte nella coda) -2. Configura Job 1: - - Output: C:\Output\thumbnails\ - - Dimensione: 320x180 -3. Configura Job 2: - - Output: C:\Output\web\ - - Dimensione: 1280x720 -4. Configura Job 3: - - Output: C:\Output\archive\ - - Dimensione: Original -5. Avvia Coda -``` - -**Risultato**: 3 set di frame ottimizzati per uso specifico. +4. **Risultato:** + - Video corti → 1 immagine + - Video lunghi → tutte le immagini + - Tutto automatico! --- ## 🔧 Risoluzione Problemi -### Problema: "FFmpeg not found" +### ❌ "L'applicazione non si avvia" -**Sintomi**: Errore all'avvio elaborazione, log "FFmpeg binary not found". +**Possibili cause:** +- .NET 8 non installato +- File corrotti -**Soluzioni**: -1. **Verifica installazione**: - ```powershell - ffmpeg -version - ffprobe -version - ``` -2. **Configura path manualmente**: - - Impostazioni → Configurazione FFmpeg → Sfoglia → Seleziona cartella `bin` -3. **Reinstalla FFmpeg**: - - Scarica build completa da [gyan.dev](https://www.gyan.dev/ffmpeg/builds/) - - Estrai e configura path in Ganimede - -### Problema: Elaborazione lentissima - -**Cause comuni**: -- Ridimensionamento attivo (1920x1080 → overhead +40%) -- Video ad altissima risoluzione (4K+) -- HDD lento (frame scritti su disco meccanico) -- CPU sottodimensionata - -**Soluzioni**: -- Usa dimensione frame `640x360` o inferiore -- Salva output su SSD -- Processa pochi video alla volta (ridurre I/O concorrente) -- Modalità `Auto` o `SingleFrame` per video brevi - -### Problema: "Access Denied" durante salvataggio frame - -**Cause**: -- Cartella output in directory protetta (`C:\Program Files`, etc.) -- File aperti in altro programma (viewer immagini, etc.) -- Permessi insufficienti - -**Soluzioni**: -- Seleziona cartella output in `Documents` o `Desktop` -- Chiudi programmi che potrebbero bloccare file -- Esegui Ganimede come amministratore (click destro → Esegui come amministratore) - -### Problema: Frame estratti sono neri/corrotti - -**Cause**: -- Codec video non supportato da FFmpeg build -- Video corrotto nel filesystem -- Timestamp seeking errato - -**Soluzioni**: -- Aggiorna FFmpeg all'ultima versione -- Verifica integrità video (riproduci in VLC) -- Prova pattern naming `VideoNameTimestamp` (seeking alternativo) - -### Problema: Applicazione crash all'avvio - -**Cause**: -- .NET 8 Runtime non installato -- File di configurazione corrotti -- Dipendenze mancanti - -**Soluzioni**: -1. **Verifica .NET**: - ```powershell - dotnet --list-runtimes - # Cerca "Microsoft.WindowsDesktop.App 8.0.x" - ``` -2. **Reset configurazione**: - ```powershell - # Elimina file settings (path utente) - del %LOCALAPPDATA%\Ganimede\user.config - ``` -3. **Reinstalla applicazione** - -### Problema: Thumbnails non vengono mostrati - -**Causa**: Limite 60 thumbnails, o cartella output vuota. - -**Verifica**: -- Controlla che job sia in stato `Completed` -- Verifica esistenza file PNG in cartella output -- Thumbnails mostrano ultimi 60 frame del job completato +**Soluzione:** +1. Verifica .NET 8: + - Apri Prompt dei comandi + - Scrivi `dotnet --version` + - Se non vedi un numero, installa .NET 8 (vedi [Installazione](#-installazione-5-minuti)) +2. Scarica di nuovo Ganimede ed estrai in una nuova cartella +3. Riavvia il computer --- -## 🏗️ Architettura Tecnica +### ⏱️ "L'estrazione è molto lenta" -### Stack Tecnologico +**Possibili cause:** +- Video in altissima risoluzione (4K) +- Dimensione immagini troppo grande +- Computer lento -``` -Frontend: WPF (Windows Presentation Foundation) -Runtime: .NET 8 (Windows Desktop) -UI Pattern: MVVM (Model-View-ViewModel) -Encoding: FFMpegCore (wrapper .NET per FFmpeg) -Storage: Settings.settings (ApplicationSettings) -``` +**Soluzione:** +1. Usa dimensione **640x360** o **1280x720** invece di "Originale" +2. Salva le immagini su un disco veloce (SSD) se possibile +3. Elabora pochi video alla volta invece di 50 insieme -### Componenti Principali +--- -#### 1. **MainWindow.xaml** / **MainWindow.xaml.cs** -- Controller principale UI -- Gestione toolbar, coda visuale, thumbnails -- Event handlers per interazioni utente -- Binding a `VideoProcessingService` via `ObservableCollection` +### 🖼️ "Le immagini sono nere o rovinate" -#### 2. **VideoProcessingService.cs** -- Core business logic -- Gestione coda asincrona (`async/await`) -- Processamento sequenziale job con `SemaphoreSlim` -- Eventi: `JobCompleted`, `JobFailed`, `ProcessingStarted`, `ProcessingStopped` -- Integrazione FFMpegCore per extraction +**Possibili cause:** +- Video corrotto +- Codec video non supportato -#### 3. **VideoJob.cs** (Model) -- Entità dati job -- Implementa `INotifyPropertyChanged` per binding real-time -- Proprietà: - - Config base: `VideoPath`, `OutputFolder`, `Status`, `Progress` - - Custom overrides: `CustomOutputFolder`, `CustomFrameSize`, etc. - - Modalità: `ExtractionMode`, `SuggestedExtractionMode` -- Display properties per UI (`OutputFolderDisplay`, `FrameSizeDisplay`, etc.) +**Soluzione:** +1. Prova ad aprire il video con VLC o Windows Media Player +2. Se il video non si apre correttamente, è probabilmente corrotto +3. Se il video funziona ma Ganimede no, prova a convertirlo in MP4 con [HandBrake](https://handbrake.fr/) (gratuito) -#### 4. **NamingHelper.cs** -- Utility statica per generazione nomi file -- Implementazione 6 pattern naming -- Metodi helper: `GetPatternDescription()`, `GetPatternExample()` +--- -#### 5. **JobConfigWindow.xaml** / **JobConfigWindow.xaml.cs** -- Dialog configurazione batch job selezionati -- Validazione input real-time -- Preview pattern naming dinamica +### 📁 "Errore: Accesso negato" -#### 6. **SettingsWindow.xaml** / **SettingsWindow.xaml.cs** -- Gestione impostazioni globali persistenti -- Integrazione `Properties.Settings` (.NET Settings Framework) -- Validazione path FFmpeg +**Possibili cause:** +- La cartella output è protetta (es. `C:\Programmi`) +- Un altro programma ha aperto i file -#### 7. **StatusColorConverter.cs** -- Value converter XAML per colori stati job -- Mapping: `Pending`→Grigio, `Processing`→Blu, `Completed`→Verde, etc. +**Soluzione:** +1. Cambia cartella output in `Documenti` o `Desktop` +2. Chiudi programmi di visualizzazione immagini +3. Se necessario, esegui Ganimede come amministratore: + - Click destro su `Ganimede.exe` + - **"Esegui come amministratore"** -### Flusso Elaborazione +--- -``` -[MainWindow] Utente preme "Avvia Coda" - ↓ -[VideoProcessingService] StartProcessingAsync() - ↓ -[Loop] GetNextPendingJob() - ↓ -[ProcessJobAsync] Per ogni job: - ├─ FFProbe.AnalyseAsync() → Metadata video - ├─ Euristica Auto (se ExtractionMode = Auto) - ├─ Directory.CreateDirectory() → Crea output folder - ├─ SE SingleFrame: - │ └─ ExtractFrameAsync() → 1 frame centrale - ├─ SE Full: - │ └─ Loop ExtractFrameAsync() → Tutti i frame - ├─ Aggiornamento Progress ogni 10 frame - └─ JobCompleted/JobFailed event - ↓ -[MainWindow] Riceve evento → Aggiorna UI, carica thumbnails -``` +### 🖼️ "Non vedo l'anteprima delle immagini" -### Threading & Async +**Causa:** Pannello anteprima mostra solo le ultime 60 immagini. -- **UI Thread**: WPF Dispatcher per binding updates -- **Background Thread**: `Task.Run` / `async/await` per FFmpeg calls -- **Sincronizzazione**: `SemaphoreSlim(1,1)` per processing seriale -- **Cancellation**: `CancellationTokenSource` per stop graceful +**Soluzione:** +- Aspetta che un video finisca di elaborare +- Le anteprime appariranno automaticamente nella colonna destra +- Se la colonna è vuota, verifica che ci siano effettivamente file PNG nella cartella output -### Persistenza Dati +--- -```csharp -// Settings salvate in ApplicationData utente -Settings.Default.LastOutputFolder // string -Settings.Default.LastVideoPath // string -Settings.Default.FFmpegBinFolder // string -Settings.Default.FrameSize // string (es. "1280,720") -Settings.Default.DefaultOverwriteMode // string (enum serializzato) -Settings.Default.DefaultNamingPattern // string (enum serializzato) -Settings.Default.DefaultExtractionMode // string (enum serializzato) -Settings.Default.CreateSubfolder // bool -Settings.Default.SingleFrameUseSubfolder // bool -Settings.Default.DefaultCustomPrefix // string +## 🎓 Suggerimenti per Principianti -// Percorso file (Windows): -%LOCALAPPDATA%\Ganimede\user.config -``` +### ✅ Cosa Fare Prima di Iniziare -### Dipendenze NuGet +1. **Crea una cartella dedicata** per le immagini estratte (es. `Documenti\ImmaginiDaVideo`) +2. **Prova con 1 video corto** prima di elaborare 100 video +3. **Usa la modalità Automatica** se non sei sicuro +4. **Controlla lo spazio disco** disponibile (1 minuto di video Full HD → ~1000 immagini → ~1 GB) -```xml - - -``` +### ❌ Cosa Evitare + +- ❌ Non usare cartelle di sistema come `C:\Windows` o `C:\Programmi` +- ❌ Non elaborare 100 video Full HD se hai poco spazio disco (controlla prima!) +- ❌ Non chiudere Ganimede durante l'elaborazione (usa "Ferma" se vuoi interrompere) + +### 💡 Trucchi Utili + +- 💡 **Seleziona più video** (Ctrl+Click o Shift+Click) per configurarli insieme +- 💡 **Riprendi lavori interrotti** impostando Sovrascrittura su "Salta" +- 💡 **Organizza per progetto** usando sottocartelle diverse (es. `Output\Vacanze`, `Output\Lavoro`) + +--- + +## 🏗️ Informazioni Tecniche (Per Curiosi) + +### Come Funziona Ganimede + +Ganimede usa **Windows Media Foundation** (WMF), una tecnologia già presente in Windows 10/11. Per questo non servono installazioni aggiuntive o configurazioni complicate. + +**Tecnologie usate:** +- **.NET 8**: Framework moderno Microsoft +- **WPF**: Interfaccia grafica moderna +- **Windows Media Foundation**: Decodifica video nativa Windows +- **C# 12**: Linguaggio di programmazione + +**Caratteristiche tecniche:** +- 🚀 Elaborazione video completamente asincrona (non blocca l'interfaccia) +- 🎯 Supporto codec: H.264, H.265/HEVC, VP8, VP9, AV1, MPEG-4, WMV, Motion JPEG +- 📦 Nessuna dipendenza esterna da installare +- 💾 Immagini salvate in formato PNG (qualità lossless) --- ## 📄 Licenza -Questo progetto è distribuito con licenza **MIT**. Consulta il file `LICENSE` per i dettagli completi. +Ganimede è distribuito con licenza **MIT** - puoi usarlo liberamente per scopi personali e commerciali. --- -## 👤 Autore +## 👤 Supporto e Contatti -**Ganimede Team** -📧 Contatto: [Inserire email/GitHub] +**Hai bisogno di aiuto?** +- 📧 Email: [Inserire email supporto] +- 🐛 Segnala problemi: [Issues GitHub](https://192.168.30.23/Alby96/Ganimede/issues) +- 💬 Domande: [Forum/Discord] --- ## 🙏 Ringraziamenti -- **FFmpeg Team** per il potente framework multimediale open-source -- **FFMpegCore** per il wrapper .NET elegante e performante -- Community .NET per supporto e feedback +- **Microsoft** per .NET e Windows Media Foundation +- **Community .NET** per supporto e feedback +- **Tu** per usare Ganimede! 😊 --- -## 🔄 Versioni e Changelog +## 🔄 Versioni -### v1.0.0 (2025-01-XX) -- ✅ Release iniziale -- ✅ 3 modalità di estrazione (Full, SingleFrame, Auto) -- ✅ 6 pattern naming configurabili -- ✅ Configurazione granulare per job -- ✅ UI dark-themed moderna -- ✅ Sistema coda con stati avanzati -- ✅ Thumbnails preview real-time +### v5.0 (Dicembre 2024) - Corrente +- ✅ Implementazione nativa Windows Media Foundation +- ✅ Zero dipendenze esterne +- ✅ Installazione semplificata +- ✅ Performance migliorate con accelerazione hardware + +### v3.0 (Precedente) +- ✅ Interfaccia dark moderna +- ✅ Sistema coda avanzato +- ✅ Tre modalità di estrazione --- -**🚀 Buon Lavoro con Ganimede!** +**🎬 Buon Divertimento con Ganimede!** -Per segnalazioni bug, richieste feature o contributi, apri una issue nel repository GitHub del progetto. +Trasforma i tuoi video in immagini in pochi click! 🚀