Как кодировать видео со скоростью 30 кадров в секунду из изображений, снятых со скоростью 7 кадров в секунду

21

Я ничего не знаю о кодировании видео, у меня есть приложение, написанное на OpenGL, и я сохраняю созданные им кадры в pngизображения. Кадры из моего приложения со скоростью 7 кадров в секунду, и я пытаюсь создать видео из них.

Для этого я использую ffmpeg, как это

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

который был взят с этого сайта , однако мне было интересно, возможно ли иметь видео, которое показывает анимацию на 30 FPS?

BRabbit27
источник
Просто настройте -framerateпараметр, чтобы получить желаемые результаты.
nullptr

Ответы:

21

Я использую код ниже, чтобы сделать то же самое.

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

Разбивая команду:

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

Это считывает входные данные со скоростью 30 к / с ( -framerate 30опция) и кодирует их, используя libx264кодек с постоянным коэффициентом скорости 23 ( -crf 23опция).

Саару Линдестёкке
источник
26

Есть две частоты кадров: вход и выход.

По умолчанию частота кадров на входе равна 25, и на выходе будет использоваться та же частота кадров, что и на входе, если вы не укажете обратное.

Одинаковая частота кадров для ввода и вывода

Если вы хотите, чтобы вход и выход имели одинаковую частоту кадров, просто укажите входную частоту кадров. В этом примере будет установлена ​​частота кадров 30000/1001 (видео NTSC):

ffmpeg -framerate 30000/1001 -i input output.mp4
  • Кроме того, в этом примере вы можете использовать ntscвместо 30000/1001, но не использовать, 29.97потому что это не является точным или правильным. Смотрите другие псевдонимы частоты кадров .

  • Поскольку частота кадров на входе по умолчанию равна 25, и если вы устанавливаете только частоту кадров на выходе, то кадры будут отбрасываться или дублироваться для компенсации. Вот почему частота кадров ввода устанавливается в этой ситуации.

Различная частота кадров для ввода и вывода

Иногда вы можете захотеть, чтобы частота входного и выходного кадров различалась. Например, вы можете захотеть вводить кадры с определенной скоростью, а затем дублировать или отбрасывать кадры, чтобы на выходе была другая частота кадров. Возможно, вы захотите сделать это из-за проблем совместимости с вашим контейнером выходного формата, вашим плеером и / или вашим устройством:

ffmpeg -framerate 10 -i input -r 25 output.mp4
  • В этом примере кадры будут продублированы, чтобы перейти от 10 до 25. Вывод консоли сообщит вам, если кадры сбрасываются или дублируются.

  • В файл изображения Demuxer использует -framerate, в то время как частота кадров выхода устанавливается с помощью -r.

  • Возможно, вам придется добавить -pix_fmt yuv420pопцию в некоторых случаях, если вы выводите видео H.264 ( ffmpegконсольный вывод предупредит вас, если вам это нужно). Это будет использовать схему подвыборки цветности, которая совместима со всеми игроками.

llogan
источник
2
FFmpeg версия 3.2.2 говорит мне: Option framerate not found.:-(
Erik
Да ты прав. Но, тем не менее, опция -framerateбольше не существует. Я удалю свой комментарий, поскольку он действительно не имеет ничего общего с преобразованием серии изображений в видео с определенной частотой кадров.
Erik
4
@erik -framerateсуществует. Он используется демультиплексорами изображений и rawvideo, а также некоторыми устройствами ввода, такими как x11grab и v4l2.
Llogan
1
Где этот вариант -framerateзадокументирован? Я прочитал man ffmpegстраницу, но не смог ее найти. Может быть, есть указатель?
Atcold
1
Хорошо, нашел его ... FFMPEG-DEVICES(1).
Atcold
1
ffmpeg -framerate 30 -i img%03d.png output.mp4  

будет достаточно в последней версии ffmpeg.

Tessaracter
источник