2016-03-25 2 views
2

У меня есть каталог, содержащий файлы PNG 2001 года. Я могу преобразовать все кадры к mp4 видео с помощью FFmpeg и следующей командой:vframes опция игнорируется в ffmpeg?

ffmpeg -framerate 60 -start_number 0 \ 
-i pic.comp2.%07d.png -c:v libx264 -r 30 \ 
-pix_fmt yuv420p input1ia.mp4 

Это прекрасно работает. Однако я создаю более сложное приложение, которое должно читать только первые 1020 файлов в каталоге (в частности, от 0 до 1019). Некоторые поисковые запросы привели меня к опции -vframes. Моя проблема в том, что она проигнорирована или, по крайней мере, интерпретируется иначе, чем я ожидаю.

Моя модифицированная команда выглядит следующим образом:

ffmpeg -framerate 60 -start_number 0 \ 
-i pic.comp2.%07d.png -vframes 1020 -c:v libx264 
-r 30 -pix_fmt yuv420p input1.mp4 

Похоже, что многие другие люди делают то же самое, как и я не столкнуться с этой проблемой. Поэтому я сделал еще несколько копаний. Я попытался изменить vframes от 1020 до -vframes 20, и это, казалось, работало правильно. Итак, теперь я думаю, что это может быть какое-то несоответствие между -framerate и -r?

полный результирующий видеоролик длится 33 секунды ... что имеет смысл математически.

1 sec 
--------- x 2001 frames = 33.35 seconds 
60 frames 

Вот почему я думал, что определение ~ 1/2 в формате PNG в качестве «конечной точки» приведет к видео первых ~ 16-17 секунд. Но я всегда получаю полноразмерное видео с помощью опции -vframes.

Я предполагаю, что мой ввод -vframes должен быть ошибочным математически, так как работает небольшое количество кадров. Однако я не понимаю, почему.

Самое образованное предположение, которое я могу сделать, это то, что он читает PNG как 60fps (-framerate), но -r делает выходное видео 30fps или еще что-то? Однако, я бы предположил, что полное выходное видео не будет длиться 33 секунды.

ответ

4

Когда скорости ввода и вывода не совпадают, ffmpeg падает или дублирует кадры в соответствии с обычной схемой для достижения выходной скорости. Таким образом, для скорости ввода 60 и скорости вывода 30 половина кадров будет отброшена. С опцией vframes 1020 кадров с выходной частотой 30 должны создавать видео длительностью 1020/30 = 34 секунд.

Чтобы достичь того, чего вы хотите, используйте t вариант

ffmpeg -framerate 60 -start_number 0 -t 17 \ 
-i pic.comp2.%07d.png -c:v libx264 -r 30 \ 
-pix_fmt yuv420p input1ia.mp4 

где 17 является number of frames to be used/input rate

+0

Отлично! Я очень ценю вашу помощь! Это работало именно так, как я хотел. Кроме того, спасибо за подробное объяснение. Я бы не понял, откуда пришли 17. >. < – cooper

Смежные вопросы