Come tagliare a fotogrammi esatti usando ffmpeg?


22

Sto cercando di usare ffmpeg per tagliare file video in momenti precisi. La guida di ffmpeg mostra un'opzione -timecode_frame_start per specificare il frame iniziale ma non riesco a far funzionare questo comando. Il video risultante inizia sempre all'inizio del video originale. Ecco un esempio del comando che sto eseguendo:

ffmpeg -i input.mpg -acodec copy -vcodec copy -timecode_frame_start 200 -vframes 210 -n ouput.mpg

Ho spostato l'opzione timecode_frame_start prima e dopo le altre opzioni senza cambiare i risultati. C'è un'opzione aggiuntiva che devo specificare? Ho provato vari formati di file, mkv, avi, mp4, e non sembra che il problema sia legato al codec. Ecco un file che ho provato:

http://www.seaotter.com/marine/movies/hermit-long-01.mpg

Mi sto perdendo qualcosa?


sembra che questo abbia ricevuto una risposta sulla mailing list (e NB che con la copia di -vcodec non è possibile "realmente" ottenere un taglio specifico del frame, poiché può risincronizzarsi solo su i-frame
rogerdpack

@ user39364 Ho chiesto sulla mailing list e si scopre che questa opzione non fa ciò che l'OP vuole. Ho anche imparato qualcosa di nuovo :)
slhck

Volevo solo notare che ho trovato un metodo per tagliare a fotogrammi esatti utilizzando melt, vedi Tagliare con precisione i file video dalla riga di comando - Super utente
sdaau

Risposte:


46

Ho appena imparato che timecode_frame_startnon funziona così. L'unico modo per iniziare da frame specifici è convertire un numero di frame in ss.mssintassi, oppure hh:mm:ss.ms. Quindi, se il tuo video è a 25 fps e vuoi iniziare con 133 fotogrammi, ne avresti bisogno

133/25 = 5.32

Quindi, corri

ffmpeg -ss 5.32 -i input.mp4 -c:v libx264 -c:a aac out.mp4

Si noti che il taglio su frame esatti con bitstream copy ( -c:v copy) non è possibile poiché non tutti i frame sono codificati e possono essere autonomi.

-ss sarà sempre preciso al frame.

Se si desidera codificare un numero specifico di frame, utilizzare -frames:v, ad esempio:

ffmpeg -ss 5.32 -i input.mp4 -c:v libx264 -c:a aac -frames:v 60 out.mp4

Puoi anche scegliere di utilizzare i filtri video , ma il supporto audio potrebbe non essere esatto. E a quanto pare, la ricerca di cornici non è ancora una caratteristica. Puoi seguire questo thread della mailing list degli utenti di FFmpeg per maggiori informazioni:

puoi usare -vf selectper una selezione accurata dei fotogrammi (qualcosa come -vf 'select=gte(n\,100)'saltare i primi 100 fotogrammi)


3
per i video con drop frame (ad esempio 29,97 fps) che durano più di 10 minuti; come faresti per calcolare con precisione il tempo per un determinato fotogramma?
GFoley83,

il select=gte(n\,100)metodo funziona ma la ricerca sta consumando prestazioni. Se esegui il test codificando solo 30 fotogrammi alla volta, più mi avvicino al video, più ffmpeg impiega più tempo a completare a causa della ricerca.
Adam Grant,

6

L'opzione

-vf select = “ Between (n \, start_frame_num \, end_frame_num ), setpts = PTS-STARTPTS"
per esempio,

-vf select=“between(n\,200\,300),setpts=PTS-STARTPTS"

taglia il video da (include) 200 ° a (include) 300 ° fotogramma, il conteggio delle sequenze inizia da 0.

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.