Rilascia ogni fotogramma pari o dispari usando FFmpeg?


14

Esiste un modo preciso per acquisire video non elaborati ed estrarre da esso un nuovo video che contiene solo fotogrammi dispari o anche fotogrammi (a scelta)?

Per esempio:

Ho "blah.yuv" con 400 frame (0-399). Voglio creare "blahOdd.yuv" che contiene i frame 1-399 (1,3,5,7 ... 399) e "blahEven" che contiene i frame 0-398 (0,2,4,6 ... 398 ).

Qualche idea su come farlo usando solo FFmpeg?

Risposte:


11

Per funzionare in modo accurato, prima converti il ​​video in bitstream RAW YUV (se non lo è già):

ffmpeg -i input.mp4 -an -vcodec rawvideo -pix_fmt yuv420p rawbitstream.yuv

Passaggio successivo: il selectfiltro accetta un'espressione , dove si ntrova il numero di frame.

ffmpeg -r 2 -s WxH -i rawbitstream.yuv -filter:v select="mod(n-1\,2)" \
-c:v rawvideo -r 1 -format rawvideo -pix_fmt yuv420p -an odd.yuv

ffmpeg -r 2 -s WxH -i rawbitstream.yuv -filter:v select="not(mod(n-1\,2))" \
-c:v rawvideo -r 1 -format rawvideo -pix_fmt yuv420p -an even.yuv

Per ffmpegnon avere frame duplicati, devi forzare metà del framerate dell'input, quindi imposta "2" come input e "1" sull'output. Non dimenticare di sostituire il WxH con le dimensioni effettive della clip perché il bitstream grezzo non ha un'intestazione che trasporta queste informazioni.

Invece di quanto sopra, un'altra possibilità sarebbe quella di aggiungere il setptsfiltro per impostare nuovi timestamp per l'output. Ma fai attenzione poiché lascia cadere i fotogrammi in modo non accurato. Qui, 25 è il frame rate di output effettivo desiderato:

ffmpeg -i input.mp4 -filter:v select="mod(n-1\,2)",setpts="N/(25*TB)" \
-c:v rawvideo -r 12.5 -format rawvideo -pix_fmt yuv420p -an odd.yuv

ffmpeg -i input.mp4 -filter:v select="not(mod(n-1\,2))",setpts="N/(25*TB)" \
-c:v rawvideo -r 12.5 -format rawvideo -pix_fmt yuv420p -an even.yuv

Puoi ovviamente scegliere un altro formato di pixel (uno dei ffmpeg -pix_fmts). Assicurarsi che durante la lettura del file si conoscano le dimensioni e il formato dei pixel:

ffmpeg -f rawvideo -s:v 1280x720 -pix_fmt yuv420p input.yuv …

Grazie, per le nuove versioni di FFMPEG dovrebbe essere -vf anziché -filter: v. Inoltre, dovrebbe essere mod (n-1 \, 2) perché il conteggio n sembra iniziare da 1 mentre il conteggio dei fotogrammi da 0 (altrimenti il ​​primo fotogramma viene duplicato 3 volte). Ma c'è ancora un problema, duplica i fotogrammi mentre voglio liberarmene - ad esempio la clip finale conterrà solo la metà dei fotogrammi.
Mark

-vfè un alias di -filter:v. Non posso provarlo in modo affidabile ora, ma esaminerò più avanti quando tornerò sulla mia macchina. Forse il tinterlacefiltro può fare lo stesso?
slhck,

Ho provato '-r 2 -i blah.yuv -r 1' ma mi mostra un errore Opzione framerate non trovata.
Marco

Ah scusa .. Grattalo, questo non funziona (più?) E solo per le immagini.
slhck,

1
@AnmolSinghJaggi No, questo lascia cadere solo i fotogrammi, ma non sarei sicuro che sia così deterministico (cioè, fa cadere ogni fotogramma dispari). Sarà basato su codici temporali, che potrebbero non essere precisi.
Slhck,

2

Se il tuo ffmpeg è stato creato con il flag AviSynth, credo che tu possa passare un .avsfile.

È possibile verificare eseguendo ffmpege cercando --enable-avisynthnei dati di configurazione . --enable-avisynth

Se si tratta di lì si può usare in questo modo: ffmpeg -i blahEven.avs blahEven.yuv.

Dov'è blahEven.avssemplicemente:

ffvideosource ( "blah.yuv"). SelectEven ()

Per i fotogrammi dispari, utilizzare SelectOdd().

Per un uso più consigliato, consultare la documentazione SelectEvery .


Questa è un'ottima alternativa, ma come ho già detto - sono limitato a usare solo ffmpeg. Il motivo è che fa parte di un sistema automatizzato che creerà solo file .bat, nessuna possibilità per l'aggiunta di AVS.
Segna il

@Mark Stavo pensando che se --enable-avisynthfosse lì, significava che AviSynth era integrato in ffmpeg, ma non ne sono sicuro.
Louis,
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.