У меня есть видеокадры в формате 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, который генерирует видео, которое воспроизводится с частотой 1 кадр в секунду, вам нужно указать частоту кадров для ввода и вывода, например:
В
-r 1
означает , что видео будет играть в 1 из исходных изображений в секунду.В
-r 10
означает , что видео будет воспроизводиться с частотой 10 кадров в секунду.(Он
-pix_fmt yuv420p
предназначен только для обеспечения совместимости с широким спектром программ воспроизведения. Это необходимо, например, для воспроизведения видео с помощью проигрывателя Windows Media.)Я проверил много разных выходных кадров, и 10 - это наименьшее число, которое вы можете использовать для создания видео, которое будет воспроизводить VLC.
Конечно, приведенная выше команда означает, что каждое исходное изображение умножается, но это более простой метод, чем тот, который вы «замедлили», и в зависимости от кодека он может не воспроизводить видео намного больше, чем истинный 1-FPS. видео.
Чтобы проверить это, я просто произвел настоящее видео с частотой 1 FPS, которое достигло 2,24 КБ. Затем я произвел видео с теми же входными изображениями, но с выходной скоростью 24 кадра в секунду, и оно достигло 5,76 кБ. Это чуть более чем в два раза больше, и нигде в 24 раза больше. :)
источник
Используйте оба
-framerate
и-r
Например, чтобы получить финальное видео, которое выглядит как 1FPS:
Это похоже на то, что Преобразование кадров 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
источник
-r
а-framerate
?man
страниц, дайте мне знать ;-) Значимая цитата: "-r Как опция ввода, игнорировать любые временные метки, хранящиеся в файле, и вместо этого генерировать временные метки, предполагая постоянную частоту кадров fps. Это не то же самое, что опция -framerate, используемая для некоторых форматов ввода, таких как image2 или v4l2 (раньше она была такой же в более старых версиях FFmpeg). Если сомневаетесь, используйте -framerate вместо опции ввода -r. "Что, если вы немного увеличите свой второй пример следующим образом:
В
-r 1
потребности прийти до .png файлов, а не после.Из документации FFmpeg :
источник
Это ошибка в 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
(который показан в другом ответе), который в некоторых случаях может быть проблематичным (согласно официальной документации ).Поскольку входное значение
-framerate
меньше выходногоfps
, FFMPEG будет дублировать кадры для достижения желаемой частоты выходного кадра (которая равна 10 в соответствии с приведенной выше командой).Также важно заметить, что порядок
-framerate
и-vf fps
важен , так как эта конфигурация будет применяться к следующему упомянутому видео (входному или выходному). То есть согласно официальным документам :источник