Estrarre "uno su ogni 10 fotogrammi" in un video usando VLC o FFmpeg


12

Sto cercando di estrarre "esattamente 1 fotogramma ogni 10" fotogrammi di un video (ovvero estrarre 1, lasciare 9 quindi ripetere) per scopi scientifici. Il video è di 105 fotogrammi, 3,5 secondi, 29,97 fps (h.264, .mov, prodotto da Nikon D3100).

L'ho caricato qui .

VLC

Il comando seguente dovrebbe produrre 10 fotogrammi, ma produce solo 6 immagini. Ho provato diversi rapporti di scena e nessuno dei due produce il numero corretto di fotogrammi (nemmeno vicino alla correzione).

vlc 1.mov --video-filter=scene --vout=dummy --scene-ratio=10 --scene-prefix=img- --scene-path=. vlc://quit

Qualcuno potrebbe dirmi qual è il problema?

FFmpeg

FFmpeg non sembra avere un comando esattamente per il mio scopo. Il comando seguente estrae 3 fotogrammi ogni secondo, ma poiché l'FPS non è esattamente 30 (piuttosto 2.97), ciò non produrrà risultati corretti per me.

Inoltre, anche FFmpeg non fornisce il numero corretto di frame anche con questo comando. Per 3,5 secondi di video mi aspetto al massimo 10 fotogrammi, ma quello che ottengo sono 12 fotogrammi!

ffmpeg -i 1.mov -y -an -sameq  -r 3 -f image2 -vcodec mjpeg %03d.jpg 

Come posso ottenere quello che voglio?


1
BTW -sameqnon fa quello che probabilmente pensi che faccia, ed è stato rimosso dalla versione corrente (il vero ffmpeg cioè, non sono sicuro che sia nel falso ffmpeg di Ubuntu). Usa invece qscale.
Stib

Risposte:


21

Seleziona 1 fotogramma su ogni 10 fotogrammi

Puoi usare il selectfiltro video ffmpegper fare questo:

ffmpeg -i input.mov -vf "select=not(mod(n\,10))" -vsync vfr -q:v 2 img_%03d.jpg
  • Per l'output JPG è possibile variare la qualità con -q:v. La gamma effettiva va da 2 (migliore qualità) a 31 (peggiore qualità). Non è necessaria questa opzione se si desidera invece eseguire l'output in PNG.

  • Questa uscita volontà img_001.jpg, img_002.jpg, img_003.jpg, etc.


Sembra molto interessante, ma sembra richiedere una versione particolare o qualcosa in più compilato. Ottengo " unrecognized option '-filter:v'" con "Versione FFmpeg SVN-r0.5.1-4: 0.5.1-1ubuntu1.3" (--enable-avfilter --enable-avfilter-lavf --enable-vdpau --enable-bzlib --enable -libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --dableable stripping --disable-vhook --enable-runtime-cpudetect - -enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --enable-shared --disable-static)
mivk,

Inoltre non posso eseguire il comando e ricevere il seguente errore su Windows ffmpeg N-35709-g7d531e8: [select @ 017EBB00] [Eval @ 0022DC08] Missing ')' o troppi argomenti in 'mod (n \, 10))' [ select @ 017EBB00] Errore durante l'analisi dell'espressione 'not (mod (n \, 10))' Errore durante l'inizializzazione del filtro 'select' con args 'not (mod (n \, 10))' Errore durante l'apertura dei filtri!
wmac,

@mivk La tua versione di FFmpeg dal repository di Ubuntu non ha funzionalità di filtro. Dovrai compilare FFmpeg .
Llogan,

1
@wmac Immagino che a Windows non piacciano le virgolette singole. Cambiarli a doppi apici: ".
Llogan,

1
@LordNeckbeard, grazie, funziona correttamente e ha risolto l'intero problema. Apprezzo molto il tuo aiuto.
wmac,

4

L'aspetto più importante della tua domanda è il fatto che il video utilizza 29,97 fotogrammi al secondo, non 30. Pesky NTSC.

Ad ogni modo, penso che sarebbe più semplice estrarre ogni frame e quindi rimuovere quelli che non ti servono:

ffmpeg -i 1.mov -y -f image2 -c:v mjpeg %03d.jpg

Quindi, rimuovi quelli che non ti servono. Poiché ogni decimo fotogramma si concluderà con un 1.jpg, possiamo semplicemente prendere tutti gli altri ...

find . -maxdepth 1 -not -iname "*1.jpg"

... e una volta che sei sicuro che questi sono quelli che vuoi rimuovere:

find . -maxdepth 1 -not -iname "*1.jpg" -exec rm '{}' \;

Se puoi usare mencoder, puoi provare l' framestepopzione, come spiegato nella documentazione , come framestep=10nel tuo caso. Personalmente non ho potuto installarlo / provarlo però.


1
Grazie mille per il tuo aiuto e la tua modifica. Ho provato mencoder e anche quello ha dei problemi! Immagino che abbia qualcosa a che fare con il codec o il contenitore. ffmpeg estrae esattamente 105 fotogrammi con il comando seguente: ffmpeg -i 1.mov -y -an -sameq -f image2 -vcodec mjpeg% 03d.jpg ma mencoder estrae solo 90 fotogrammi !!! con il comando seguente: mplayer -vo png 1.mov L'uso di framestep = 10 produce anche un numero errato di fotogrammi. Sono scioccato dal fatto che tutti e tre (ffmpeg, vlc e mencoder) non siano in grado di svolgere correttamente un compito così semplice. Ho inviato una segnalazione di bug al sito Web VLC. Grazie ancora.
wmac,

0

Se dovessi prima convertire il video in una serie di immagini rgb24 o rgb32 non elaborate, allora potresti essere in grado di ottenere il giusto numero di fotogrammi poiché nella forma originale sembra includere tipi di fotogrammi insoliti che potrebbero non essere affatto immagini ?? ?

Nei Laser Disc originali l'intero video era composto da una serie di immagini con numeri di fotogrammi individuali da 1 a 100.000 o più, e in questo modo è davvero il modo corretto di stabilire una base per conversioni o manipolazioni future.

L'industria è cambiata in questa strana idea di compressione semplicemente per ridurre i fondi stanziati e corrompere vere forme scientifiche di gestione dei numeri.

Devi prima estrarre qualsiasi audio come file wave per non perdere completamente l'audio. Sembra che FFMPEG inserisca informazioni identificative in ogni immagine estratta, perché se provi a mettere insieme le immagini da quelle appena estratte e mescoli altre immagini da altre fonti con la stessa estensione, ffmpeg ignorerà le immagini che hai provato a mettere nel mezzo di tutto .

Con il formato del disco laser, la frequenza dei fotogrammi è semplicemente dettata dalla velocità con cui si presentano le immagini sequenziali e non è controllata in alcun modo dalle immagini stesse.

FFMPEG potrebbe trarre una lezione dalla scienza anziché dall'arte per la corretta gestione e visualizzazione di immagini di qualsiasi tipo. O forse l'intero settore AV stesso. Il settore deve davvero migliorare le capacità dell'hardware e utilizzare dati non elaborati che richiedono molta memoria / archiviazione. Nulla batte i dati grezzi per precisione e accuratezza.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.