Modifica la frequenza dei fotogrammi di un video MP4 con ffmpeg


8

Ho un video in formato mp4 con una frequenza dei fotogrammi di .33(1 fotogramma per 3 secondi). Voglio aumentare la frequenza dei fotogrammi a 5 fotogrammi / sec. Ho provato il comando seguente ma non fa nulla:

ffmpeg -i <input.mp4> -r 5 <output.mp4>

Qualche idea sul perché ffmpeg stia ignorando l' -ropzione?


Se stai cercando di accelerare / rallentare un video, invece di duplicare / eliminare i frame, vedi superuser.com/questions/854753/… e / o askubuntu.com/questions/370692/…
Peter Cordes

Risposte:


7

So che questa è una vecchia domanda, ma nessuna delle risposte attuali è più raccomandata.

Remuxing (video) senza perdite

Come notato nei commenti c'è un modo per farlo in cui il video non deve essere ricodificato. Richiede il rimodellamento del file in un formato di contenitore diverso MKV e il successivo riposizionamento in un MP4. Ecco un esempio che modifica un video in 12 frame / secondo:

mkvmerge --default-duration 0:12fps --fix-bitstream-timing-information 0 original-video.mp4 -o temp-video.mkv
ffmpeg -i temp-video.mkv -c:v copy slow-video.mp4

Se il video contiene audio si può anche rallentare che verso il basso, senza cambiare il passo, ma è non è una conversione senza perdita di dati. L'esempio che segue presuppone che il video sorgente fosse di 24 fotogrammi / secondo, quindi l'audio doveva essere rallentato alla metà (0,5) velocità usando il filtro atempo di ffmpeg .

mkvmerge --default-duration 0:12fps --fix-bitstream-timing-information 0 original-video.mp4 -o temp-video.mkv
ffmpeg -i temp-video.mkv -c:v copy -c:a aac -filter:a "atempo=0.5" slow-video-with-audio.mp4

Guida Wiki FFMPEG

Questa è la guida dal wiki di ffmpeg . Tieni presente che tutte queste opzioni richiedono la ricodifica del video.

Accelerare / rallentare il video

Puoi cambiare la velocità di un flusso video usando il filtro video setpt. Si noti che nei seguenti esempi, il flusso audio non viene modificato, quindi dovrebbe idealmente essere disabilitato con -an.

Per raddoppiare la velocità del video, puoi utilizzare:

ffmpeg -i input.mkv -filter:v "setpts=0.5*PTS" output.mkv

Il filtro funziona modificando il timestamp di presentazione (PTS) di ciascun fotogramma video. Ad esempio, se ci sono due fotogrammi successivi mostrati nei timestamp 1 e 2 e si desidera velocizzare il video, questi timestamp devono diventare rispettivamente 0,5 e 1. Pertanto, dobbiamo moltiplicarli per 0,5.

Si noti che questo metodo farà cadere i frame per raggiungere la velocità desiderata. È possibile evitare i frame rilasciati specificando un frame rate di output più elevato rispetto all'input. Ad esempio, per passare da un input di 4 FPS a uno che viene velocizzato fino a 4x (16 FPS):

ffmpeg -i input.mkv -r 16 -filter:v "setpts=0.25*PTS" output.mkv

Per rallentare il tuo video, devi utilizzare un moltiplicatore maggiore di 1:

ffmpeg -i input.mkv -filter:v "setpts=2.0*PTS" output.mkv

Liscio

È possibile appianare i video lenti / veloci con il filtro video minterpolate. Questo è anche noto come "interpolazione del movimento" o "flusso ottico".

ffmpeg -i input.mkv -filter "minterpolate='mi_mode=mci:mc_mode=aobmc:vsbmc=1:fps=120'" output.mkv

Altre opzioni includono slowmoVideo e Butterflow. Accelerare / rallentare l'audio

Puoi accelerare o rallentare l'audio con il filtro audio atempo. Per raddoppiare la velocità dell'audio:

ffmpeg -i input.mkv -filter:a "atempo=2.0" -vn output.mkv

Il filtro atempo è limitato all'uso di valori compresi tra 0,5 e 2,0 (quindi può rallentarlo a non meno della metà della velocità originale e accelerare fino a non più del doppio dell'input). Se necessario, puoi aggirare questa limitazione mettendo insieme più filtri atempo. Quanto segue con quadrupla la velocità audio:

ffmpeg -i input.mkv -filter:a "atempo=2.0,atempo=2.0" -vn output.mkv

Utilizzando un filtro grafico complesso, è possibile velocizzare video e audio contemporaneamente:

ffmpeg -i input.mkv -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mkv

1
È possibile accelerare / rallentare semplicemente rifacendo, ma FFmpeg non sa come farlo . ad esempio per mkv, mkvtoolnix può farlo. ad es. mkvmerge --default-duration 0:24000/1001fps --fix-bitstream-timing-information 0 in.mkv -o out.mkv cambiare framerate sul contenitore MKV . Potresti rifare in MKV e tornare in MP4, oppure trovare uno strumento che lo fa direttamente per MP4. xcoding del video è molto dispendioso in termini di CPU e con perdita di dati, quindi è un'opzione orribile.
Peter Cordes,

Totalmente d'accordo sul fatto che si preferisce il rifacimento ad un framerate inferiore poiché si tratta di un approccio senza perdita di risorse che richiede molte meno risorse. In pratica non ho trovato buoni strumenti per farlo con gli MP4. Non ci ho provato molto di recente, ma quando ho scritto questa risposta per la prima volta, ho fatto il rifacimento di MP4-> MKV-> MP4 e non sono riuscito a farlo funzionare con mkvtoolnix, ffmpeg e / o mp4box. Dovrò provare con i parametri che suggerisci.
pseudosavant,

6

Se il file di input non ha un frame rate valido, potrebbe essere necessario impostarlo in modo esplicito

ffmpeg -r 1 -i input.mp4 -r 24 output.mp4

Questo transcodifica quando hai davvero solo bisogno di rimodellare. (A meno che tu non voglia effettivamente duplicare / rilasciare i fotogrammi invece di rallentare / accelerare il video.)
Peter Cordes,

3

Potrei solo rendere effettivo il framerate modificato se il file di input fosse classificato come file "grezzo":

ffmpeg -r 5 -f h264 -i input.h264 -vcodec copy -an output.mkv

Senza specificare -f h264che sarebbe predefinito a 25 fps e non poteva essere modificato. Apparentemente questo perché lo stream non aveva alcuna informazione sul framerate e questo è il framerate predefinito di ffmpeg.

Apparentemente quando si utilizza -rcome opzione di output, duplica o rilascia fotogrammi in modo che il video venga riprodotto alla stessa velocità - in questo caso, non quello che vuoi! Ma cambiando il framerate di input come sopra, il video accelera o rallenta, senza frame persi o duplicati.


1
La mia risposta utile Nessuna ricodifica qui
yota,

1

Tale caratteristica - di cambiare il framerate - è chiamata "conforme" ed è spesso usata per produrre rallentatore o avanzamento veloce come mostrare la crescita di una pianta in pochi minuti. ffmpeg non consente la sovrascrittura / modifica del framerate senza ricodifica . In tal caso, la durata cambierà e l'audio non sarebbe sincronizzato se non fosse riparato separatamente. Ma temo che l'audio non sia interessante nel tuo caso con framerate di .33

Vuoi conformarti perché vuoi solo cambiare il framerate, ma ffmpeg ignora -rsilenziosamentese framerate è specificato nel file di input. Poiché il file di input è in formato .mp4, il suo framerate ha la precedenza-rquando non è necessario ricodificare. Per questo è necessario uno strumento diverso: mencoder.

Supponendo che il tuo file di input non contenga alcun suono - probabilmente vero per qualsiasi video con .33 framerate - ciò di cui hai bisogno è:

$ mencoder -fps 5 -o <output> -ovc copy -nosound <input.mp4>

Si noti che mencoder per impostazione predefinita produce output in formato AVI.


1
Questo è sbagliato. Se rviene specificato come switch di output, ffmpeg produrrà un output a quel framerate specificato, indipendentemente dal framerate dell'input. Se rviene specificato come interruttore di ingresso, ffmpeg duplicherà o rilascerà i frame come necessario per alimentare il numero specificato di frame al secondo di input nel filtro / codificatore.
Gyan,

Il comportamento che descrivi quando rè un interruttore di input contraddice con il mio precedente esperimento sul formato .mp4, la nota di Malvineous (in questa pagina) e la descrizione del bug 403 trac.ffmpeg.org/ticket/403 ; la tua descrizione quando rviene usata sull'output avviene quando ricodifica, mentre lo scenario di OP sembra essere un caso conforme (correggi framerate senza ricodifica) dal fatto che aveva .33 framerate.
Tankman 六四

1
Controlla il rapporto incollato qui . Nota la riga di comando in alto, i metadati di input e output e infine il no. di frame codificati.
Gyan,

1
Concordato sul fatto che l'OP vuole solo conformare il file ma il loro comando dato viene ricodificato poiché gli switch di copia non sono specificati. In quello scenario, ffmpeg dovrebbe generare un nuovo flusso in rfps.
Gyan,

Grazie Mulvya per l'output del campione convincente. Sì, hai ragione sull'uso di -r. Tale utilizzo non ha potuto influenzare i miei precedenti esperimenti in risposta a OP perché, pensando a un caso conforme, non ho mai lasciato cadere il parametro copy da ffmpeg, e -rquindi viene ignorato. Ho scritto una richiesta di funzione: trac.ffmpeg.org/ticket/5170
Tankman 六四

0

Il modo più rapido è creare un file BAT nella directory con le seguenti righe:

@ECHO OFF

for %%f in (*.mp4) do (

echo “fullname: %%f”

del temp.mkv

mkvmerge --default-duration 0:18fps --fix-bitstream-timing-information 0 %%f -o temp.mkv

del %%f

ffmpeg -i temp.mkv -c:v copy %%f

del temp.mkv

)

Devi avere mkvmerge e ffmpeg nella stessa directory. Cambia automaticamente ogni file mp4 in pochi secondi senza perdita di qualità.

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.