Преобразование кадров PNG в видео со скоростью 1 FPS

21

У меня есть видеокадры в формате PNG со скоростью 1 FPS, и я пытаюсь преобразовать их в видео с помощью ffmpeg.

Если я сделаю что-то вроде этого:

ffmpeg -i data/input-%4d.png data/output.mp4

Я получаю видео со скоростью 25 кадров в секунду, что в основном является очень быстрой пересылкой ввода (которое записывается со скоростью 1 кадр в секунду).

Если я попробую:

ffmpeg -i data/input-%4d.png -r 1 data/output.mp4

Я получаю то, что VLC не хочет играть :)

Теперь, если я беру первое видео (FF) и применяю фильтр, чтобы замедлить его (например -filter:v 'setpts=24.0*PTS'), я могу заставить его воспроизводиться как видео с 1 FPS, но, конечно, цена равна размеру файла. Я думаю, он генерирует кучу повторяющихся кадров.

Итак, вопрос в том, как создать видео, которое имеет ровно 1 кадр / с и воспроизводит его с такой скоростью? Формат вывода, кстати, не так важен для меня.

Ассаф Лави
источник
Я не уверен, что ffmpegдостаточно умен, чтобы определить видеокодек только из расширения файла формата контейнера .mp4. Попробуйте добавить -vcodec libx264 -vpre hqв командную строку, чтобы сообщить ей кодек и параметры кодирования.
Уоррен Янг
На самом деле все было в порядке, и, как я уже говорил, это работало хорошо и показывало странные результаты только при добавлении -r 1.
Ассаф Лави
Я думаю, что вам может повезти с ответом ffmpeg на stackoverflow.com или superuser.com .
Дэмиен

Ответы:

19

Если вам нужен однострочный текст для FFMPEG, который генерирует видео, которое воспроизводится с частотой 1 кадр в секунду, вам нужно указать частоту кадров для ввода и вывода, например:

ffmpeg -r 1 -i data / input-% 4d.png -pix_fmt yuv420p -r 10 data / output.mp4

В -r 1означает , что видео будет играть в 1 из исходных изображений в секунду.
В -r 10означает , что видео будет воспроизводиться с частотой 10 кадров в секунду.

(Он -pix_fmt yuv420pпредназначен только для обеспечения совместимости с широким спектром программ воспроизведения. Это необходимо, например, для воспроизведения видео с помощью проигрывателя Windows Media.)

Я проверил много разных выходных кадров, и 10 - это наименьшее число, которое вы можете использовать для создания видео, которое будет воспроизводить VLC.

Конечно, приведенная выше команда означает, что каждое исходное изображение умножается, но это более простой метод, чем тот, который вы «замедлили», и в зависимости от кодека он может не воспроизводить видео намного больше, чем истинный 1-FPS. видео.

Чтобы проверить это, я просто произвел настоящее видео с частотой 1 FPS, которое достигло 2,24 КБ. Затем я произвел видео с теми же входными изображениями, но с выходной скоростью 24 кадра в секунду, и оно достигло 5,76 кБ. Это чуть более чем в два раза больше, и нигде в 24 раза больше. :)

AM
источник
+1 на -pix_fmt. Легко забыть, что некоторые люди настаивают на использовании WMP :-)
Smalltown2k
почему вы хотите, чтобы выходной формат был 10 кадров в секунду, а вход только 1? Разве это не создаст на 90% избыточные кадры, которые будут одинаковыми?
Герберт
@ Херберт создает избыточные кадры, чтобы вы могли получить частоту кадров до 10, что делается только для того, чтобы VLC не жаловался и визуально не изменял видео. Кодировщик достаточно умен, чтобы видеть, что все кадры идентичны, поэтому вы не
получите
@chiliNUT ясно, ключевой кадр, который подойдут не всем форматам, но большинству нормальных форматов. Благодарность!
Герберт
5

Используйте оба -framerateи-r

Например, чтобы получить финальное видео, которое выглядит как 1FPS:

ffmpeg -framerate 1 -pattern_type glob -i '*.png' \
    -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

Это похоже на то, что Преобразование кадров PNG в видео со скоростью 1 FPS | Unix & Linux Stack Exchange говорит, но мне нужно было -framerateвместо того, -rчтобы это работало.

Это упоминается в вики по адресу: http://trac.ffmpeg.org/wiki/Slideshow#Framerates

Он устанавливает выходную частоту кадров 30, которую может обрабатывать VLC, и копирует каждое изображение 30 раз, так что выходное видео выглядит со скоростью 1 кадр / с. См. Также: Проблемы с воспроизведением в VLC с низким fps видео из изображений с использованием ffmpeg | Переполнение стека

Затем VLC сможет нормально воспроизводить видео.

Протестировано на Ubuntu 16.10, VLC 2.2.4, ffmpeg 3.0.5, в каталоге с 10 PNG.

Смотрите также: /programming/19267443/vlc-freezes-for-low-1-fps-video-created-from-images-with-ffmpeg

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
источник
Какая разница между -rа -framerate?
Рой
@Royi Я не знаю, за исключением того, что это единственное, что сработало для меня :-) Но если вам удалось извлечь его из manстраниц, дайте мне знать ;-) Значимая цитата: "-r Как опция ввода, игнорировать любые временные метки, хранящиеся в файле, и вместо этого генерировать временные метки, предполагая постоянную частоту кадров fps. Это не то же самое, что опция -framerate, используемая для некоторых форматов ввода, таких как image2 или v4l2 (раньше она была такой же в более старых версиях FFmpeg). Если сомневаетесь, используйте -framerate вместо опции ввода -r. "
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件
3

Что, если вы немного увеличите свой второй пример следующим образом:

$ ffmpeg -r 1 -i data/input-%4d.png -c:v libx264 out.mp4

В -r 1потребности прийти до .png файлов, а не после.

Из документации FFmpeg :

Как правило, параметры применяются к следующему указанному файлу. Следовательно, порядок важен, и вы можете иметь один и тот же параметр в командной строке несколько раз. Каждое вхождение затем применяется к следующему входному или выходному файлу.

SLM
источник
К сожалению, это не работает. Однако упоминание о важности заказа сэкономило мне много времени. Благодарю.
Мохаммед Нурельдин
0

Это ошибка в VLC (которая все еще существует в версии 3.0.6). После некоторых экспериментов я понял, что VLC вылетает для видео с FPS меньше 10 . Так что все видео с 10 FPS или более не должны быть проблемой. Так что в настоящее время нет чистого способа получить видео с 1 FPS, которое можно воспроизводить в VLC ( не сдавайтесь, продолжайте читать ).

Один из обходных путей - как показано в ответе выше - для имитации эффекта 1 FPS путем дублирования изображений (когда у нас фактически FPS равен 10 или более, что нормально для VLC).

Пример: если у вас есть папка с 12 изображениями, и вы хотите сгенерировать видео с 1 FPS (которое можно воспроизводить в VLC), то вам необходимо дублировать каждое изображение несколько раз (скажем, 10 раз), а затем сообщить FFMPEG генерировать видео 10 FPS. Таким образом, мы получим видео с общим количеством кадров 120, где каждое изображение будет воспроизводиться в течение 1 секунды (так как оно дублируется 10 раз), что является просто подделкой для 1 FPS.

Я предпочитаю использовать fpsпараметр, а не-r (который показан в другом ответе), который в некоторых случаях может быть проблематичным (согласно официальной документации ).

ffmpeg -framerate 1 -i "img (%d).jpg" -c:v libvpx-vp9 -vf "fps=10,format=yuv420p" out.mkv

Поскольку входное значение -framerateменьше выходного fps, FFMPEG будет дублировать кадры для достижения желаемой частоты выходного кадра (которая равна 10 в соответствии с приведенной выше командой).

Также важно заметить, что порядок -framerateи -vf fpsважен , так как эта конфигурация будет применяться к следующему упомянутому видео (входному или выходному). То есть согласно официальным документам :

параметры применяются к следующему указанному файлу. Поэтому порядок важен ...

Мухаммед Нурельдин
источник