Может ли ffmpeg кодировать видео из кадров разных размеров?
У меня есть набор инструментов, который производит кадры, которые обычно 1920x1080, но иногда 1919x1080 или 1920x1079. (Да, это ошибка. Пожалуйста, продолжайте читать.) Когда ffmpeg кодирует видео с него, с помощью команды вроде
ffmpeg -y -r 30 -i foo/%04d.png -vcodec h264 out.mp4
тогда он печатает такие замечания, как
Input stream #0:0 frame changed from size:1919x1080 fmt:rgb24 to size:1920x1080 fmt:rgb24
но эти кадры, а не изменяются размеры и включены в out.mp4
, опущены из out.mp4
,
Можно ли включить эти кадры? Я не нашел упоминания о непостоянном размере фрейма на форумах и в документации, но сам ffmpeg здесь утверждает, что изменяет размер фрейма. (Замечание напечатано в строке 1688 файла ffmpeg.c. Там флаг resample_changed
установлено, что вызывает поля ширины и высоты InputStream *ist
быть исправленным.)
Дэвид Эллиман может сообщать о похожем поведении в ответе на https://stackoverflow.com/questions/18043841/ffmpeg-missing-image-frames-in-generated-video-from-images?rq=1.
4 ответа
Возможно, scale
Видеофильтр может предоставить то, что вы ищете:
ffmpeg -r 30 -i foo/%04d.png -vf "scale=1920:1080,format=yuv420p" -codec:v libx264 out.mp4
Это заставит размер 1920x1080 для каждого кадра. Это может привести к слегка растянутому или сжатому изображению, если ваши входные данные странного размера просто обрезаются, а не масштабируются неправильно. Если это так, рассмотрите возможность использования pad
вместо этого используйте видеофильтр, но имейте в виду, что в результате будет получена сплошная цветная полоса для компенсации недостающих пикселей.
scale
также принимает различные функции, если вы хотите, чтобы с ним поработать. См. Например, изменение размера видео с помощью ffmpeg для размещения в плеере статического размера.
я добавил format=yuv420p
потому что, с входом RGB для libx264, ffmpeg будет пытаться избежать подвыборки цветности, что приведет к плоскому пиксельному формату YUV 4:4:4, который большинство игроков не сможет декодировать.
Попробуйте опустить -r 30
параметр для входной частоты кадров и использования -framerate 30
вместо выходной частоты кадров. У меня была такая же проблема, и это сработало для меня.
Является ли это ошибкой в FFmpeg или что-то, что FFmpeg должно лучше документировать поддержку или отсутствие поддержки, я действительно не вижу вопроса программирования. Вы должны исправить свою ошибку, которая генерирует неправильные размеры кадра, и быть благодарным, что FFmpeg предупредил вас об этой проблеме, так как тихое "исправление" их путем расширения или повторной выборки могло привести к крошечному "дрожанию" в кодированном видео и оставило вас с небольшим дефектом выходное видео и плохое качество сжатия.
Возможно, вам придется указать режим масштабирования для изменения размера для работы. Я взял это из моей реализации.
--custom-anamorphic --display-width 1920 --keep-display-aspect --modulus 8 --crop 0:0:0:0