Я пытаюсь кодировать .mp4 видео из набора кадров, используя FFMPEG с использованием кодека libx264.
Это команда, которую я запускаю:
/usr/local/bin/ffmpeg -r 24 -i frame_%05d.jpg -vcodec libx264 -y -an video.mp4
Иногда я получаю следующую ошибку:
[libx264 @ 0xa3b85a0] height not divisible by 2 (520x369)
После небольшого поиска кажется, что проблема связана с алгоритмом масштабирования и может быть исправлена добавлением аргумента -vf.
Однако в моем случае я не хочу делать масштабирование. В идеале я хочу сохранить размеры точно такими же, как у рам. Любой совет? Есть ли какое-то соотношение сторон, которое обеспечивает h264?
-vf pad="width=ceil(iw/2)*2:height=ceil(ih/2)*2"
это даже не один из ответов. Правильный ответ на все остальные вопросы - лорд Нэкборд."scale="
вместо"pad="
если он / она не хочет иметь цветные пиксели заполнения?Ответы:
Ответ на оригинальный вопрос, который не хочет масштабировать видео:
Команда:
По сути, .h264 нужны четные размеры, поэтому этот фильтр будет:
Вы можете изменить цвет заполнения, добавив параметр фильтра
:color=white
. Смотрите документацию колодки .источник
-vf pad="width=iw:height=ih+1:x=0:y=0:color=white"
. Документация панели ffmpeg находится здесь: ffmpeg.org/ffmpeg-filters.html#pad-1 .-vf pad="width=ceil(iw/2)*2:height=ceil(ih/2)*2"
.Просто используйте
-2
Из документации фильтра весов :
Примеры
Установите ширину в 1280, и высота будет автоматически рассчитана для сохранения соотношения сторон, а высота будет делиться на 2:
То же, что и выше, но с объявленной высотой; оставляя ширину, которая будет обработана фильтром:
"делится на 2"
В соответствии с требованиями x264, «делимые на 2 для ширины и высоты» необходимы для выходов с субдискретизацией цветности YUV 4: 2: 0. 4: 2: 2 потребуется «делится на 2 по ширине», а 4: 4: 4 не имеет этих ограничений. Однако большинство игроков, не основанных на FFmpeg, могут правильно декодировать только 4: 2: 0, поэтому вы часто видите
ffmpeg
команды с-pix_fmt yuv420p
опцией при выводе видео H.264.Предостережение
К сожалению, вы не можете использовать
-2
как ширину, так и высоту, но если вы уже указали одно измерение, то использовать-2
это простое решение.источник
-vf scale=-2:-2
не работает? В моем случае я хочу максимально сохранить исходный размер файла. То, что сработало для меня, было-vf scale=-2:ih
. Но это не работает, если оба ч / б неравномерны.-2
зависит от объявленного значения другого измерения.Size values less than -1 are not acceptable.
но ответ от @Zbyszek работал отлично.ffmpeg
. Вы можете скачать статическую сборку .Если вы хотите установить некоторую ширину вывода и иметь вывод с тем же соотношением, что и оригинал
и не упасть с этой проблемой, то вы можете использовать
(Только для людей, ищущих, как сделать это с масштабированием)
источник
scale="trunc(oh*a/2)*2:720"
Проблема с
scale
решениями здесь заключается в том, что они искажают исходное изображение / видео, что почти никогда не соответствует желаемому.Вместо этого я обнаружил, что лучшим решением является добавление 1-пиксельной панели к нечетному размеру. (По умолчанию накладка черного цвета, и ее трудно заметить.)
Проблема с другим
pad
решениями заключается в том, что они не обобщаются на произвольные измерения, потому что они всегда дополняют друг .Это решение добавляет 1-пиксельный планшет к высоте и / или ширине, если они нечетные:
Это идеально, потому что он всегда делает правильные вещи, даже если нет необходимости в заполнении.
источник
scale=iw+mod(iw,2):ih+mod(ih,2):flags=neighbor
. Это может только увеличить каждое измерение на 1, если это необходимо, и будет дублировать последнюю строку / столбец.Вероятно, это связано с тем фактом, что видео H264 обычно преобразуется из пространства RGB в пространство YUV как 4: 2: 0 до применения сжатия (хотя само преобразование формата является алгоритмом сжатия с потерями, что приводит к экономии пространства на 50%).
YUV-420 начинается с изображения RGB (красный, зеленый, синий) и преобразует его в YUV (в основном один канал интенсивности и два канала «оттенка»). Затем каналы оттенков подвергаются дополнительной выборке путем создания одного образца оттенка на каждые 2X2 квадрата этого оттенка.
Если у вас есть нечетное количество пикселей RGB по горизонтали или вертикали, у вас будут неполные данные для последнего столбца или строки пикселей в пространстве оттенков субдискретизации кадра YUV.
источник
У лорда Некберда правильный ответ, очень быстрый
Для Android, не забудьте добавить
источник
--disable-asm
в своем сценарии сборки x264 . Это приводит к ненужной и значительной медлительности (вы можете проверить журнал ffmpeg, и если он показываетusing cpu capabilties: none!
, это плохо). Я не уверен, почему они добавили это, но я не разработчик Android.Вы также можете использовать
bitand
функцию вместоtrunc
:бит и (х, 65534)
будет делать так же как
trunc(x/2)*2
и более прозрачно на мой взгляд.(Рассмотрим 65534 магическое число здесь;))
Моя задача состояла в том, чтобы автоматически масштабировать множество видеофайлов до половины разрешения .
scale=-2,ih/2
привести к слегка размытым изображениямпричина:
scale
масштабирует реальные размеры кадрарешение:
объяснение:
setsar=1
означает, что output_dimensions теперь являются окончательными, коррекция соотношения сторон не должна применятьсяКто-то может найти это полезным.
источник