3

У меня есть набор инструментов, который производит кадры, которые обычно имеют размеры 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 ответа4

2

Возможно, фильтр видео 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, который большинство игроков не может декодировать.

1

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

0

Возможно, вам придется указать режим масштабирования для изменения размера для работы. Я взял это из моей реализации.

--custom-anamorphic --display-width 1920  --keep-display-aspect --modulus 8 --crop 0:0:0:0
0

Попробуйте опустить параметр -r 30 для входной частоты кадров и вместо этого использовать -framerate 30 для выходной частоты кадров. У меня была такая же проблема, и это сработало для меня.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .