Come codificare un video a 30 FPS da immagini scattate a 7 FPS


21

Non ho alcuna conoscenza della codifica video, ho un'applicazione scritta in OpenGL e sto salvando i frame che ha generato in pngimmagini. I frame della mia app sono a 7 FPS e sto cercando di creare un video da quelli.

A tale scopo uso ffmpeg in questo modo

ffmpeg -framerate 30 -i img%03d.png -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

quale è stato preso da questo sito , tuttavia mi chiedevo se è possibile avere un video che mostra l'animazione a 30 FPS?



Basta modificare il -framerateparametro per ottenere i risultati desiderati.
nullptr

Risposte:


21

Sto usando il codice qui sotto per fare la stessa cosa.

ffmpeg -framerate 30 -i img%03d.png -c:v libx264 -pix_fmt yuv420p -crf 23 output.mp4

Abbattere il comando:

ffmpeg             <- call ffmpeg
  -framerate 30    <- set the input framerate to 30
  -i img%03d.png   <- read PNG images with filename img001, img002, img003, etc..
                     img can be changed to another prefix
                     %03d can be changed to %04d for 0001, %05d for 00001 formats, etc...
  -c:v libx264     <- Set the codec to libx264
  -pix_fmt yuv420p <- Set the pixel format to planar YUV 4:2:0, 12bpp
  -crf 23          <- set the Constant Rate Factor to 23 (default value)
  -output.mp4      <- the output filename

Questo legge l'input a 30 fps (l' -framerate 30opzione) e lo codifica utilizzando il libx264codec con fattore di frequenza costante di 23 (l' -crf 23opzione).


26

Ci sono due frame rate da considerare: l'input e l'output.

Per impostazione predefinita, la frequenza dei fotogrammi di input è 25 e l'output utilizzerà la stessa frequenza dei fotogrammi dell'input, a meno che non sia indicato diversamente.

Stesso frame rate per input e output

Se si desidera che l'input e l' output abbiano la stessa frequenza dei fotogrammi, fornire semplicemente la frequenza dei fotogrammi di input. In questo esempio verrà impostata una frequenza fotogrammi di 30000/1001 (video NTSC):

ffmpeg -framerate 30000/1001 -i input output.mp4
  • In alternativa, in questo esempio, è possibile utilizzare ntscinvece di 30000/1001, ma non utilizzare 29.97perché non è accurato o corretto. Vedi altri alias di frame rate .

  • Poiché il frame rate di input predefinito è 25 e se si imposta solo un frame rate di output, i frame verranno eliminati o duplicati per compensare. Questo è il motivo per cui il frame rate di input è impostato in questa situazione.

Frame rate diverso per input e output

A volte potresti voler variare la frequenza dei fotogrammi di input e la frequenza dei fotogrammi di output. Ad esempio, potresti voler inserire i frame a una certa frequenza, quindi duplicare o rilasciare i frame in modo che l'output abbia una frequenza dei frame diversa. Potrebbe essere necessario farlo a causa di problemi di compatibilità con il contenitore del formato di output, il lettore e / o il dispositivo:

ffmpeg -framerate 10 -i input -r 25 output.mp4
  • In questo esempio i frame verranno duplicati per andare da 10 a 25. L'output della console ti dirà se i frame vengono eliminati o duplicati.

  • Il demuxer del file di immagine utilizza -framerate, mentre la frequenza dei fotogrammi di output viene impostata utilizzando -r.

  • In -pix_fmt yuv420palcuni casi potresti dover aggiungere l' opzione se stai producendo video H.264 (l' ffmpegoutput della console ti avviserà se è necessario). Questo utilizzerà uno schema di sottocampionamento chroma compatibile con tutti i giocatori.


2
La versione 3.2.2 di ffmpeg mi dice: Option framerate not found.:-(
erik,

Si hai ragione. Tuttavia, l'opzione -frameratenon esiste più. Eliminerò il mio commento, poiché non ha nulla a che fare con la conversione di una serie di immagini in un video con un determinato framerate.
erik,

4
@erik -framerateesiste. È utilizzato dai demuxer di immagini e rawvideo e da alcuni dispositivi di input come x11grab e v4l2.
Llogan,

1
Dove è -frameratedocumentata l'opzione ? Ho letto la man ffmpegpagina, ma non sono riuscita a trovarla. Qualche puntatore, forse?
Atcold

1
OK, ho trovato ... FFMPEG-DEVICES(1).
Atcold

1
ffmpeg -framerate 30 -i img%03d.png output.mp4  

sarà sufficiente nell'ultima versione di ffmpeg.

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.