Использование ffmpeg для добавления высоты (в виде черных полос) к видеофайлу без потери качества

У меня есть файл с разрешением 3840x1632, но мой телевизор растягивает картинку по вертикали, чтобы заполнить все 2160 пикселей по высоте. Можно ли использовать ffmpeg для добавления пустой/черной высоты при сохранении качества видео и звука?

Попытался сделать это, что, похоже, сработало (заняло около 2 часов, такая же продолжительность видео), но значительно уменьшило размер файла/качество видео):

ffmpeg -i input.mkv -filter:v "pad=3840:2160:0:280" -c:a copy my_output_video.mkv

Есть ли переключатель, чтобы сказать «оставить все как есть»?

Спасибо!

Ответы (3)

Вам придется вручную установить параметры кодирования.

ffmpeg -i input.mkv -filter:v "pad=3840:2160:0:280,setsar=1" -crf 18 -preset faster -c:a copy my_output_video.mkv

Опция CRF устанавливает компромисс между размером и качеством. Меньшие значения дают лучшее качество, но файлы большего размера. Предустановка увеличит скорость, но при том же качестве размер файла будет больше.

Фильтр setsar был добавлен в качестве меры предосторожности на тот случай, если ваш проигрыватель считывает SAR, хранящийся в файле, и растягивает видео на основе этого значения.

Вы можете выполнять преобразования с помощью -c:v libx264 -crf 0X264, у него есть режим без потерь, в который он входит с помощью -crf 0. Они реализовали реальное кодирование видео без потерь, об этом мало кто знает, но работает отлично.

Я использую это все время.

Будьте готовы - это занимает гигабайты - особенно для видео из реальной жизни (не графика и т. д.)

Выполнение записи экрана для программ и графических изображений в -crf 0— идеальное решение — оно очень хорошо их сжимает и использует относительно небольшую мощность процессора.

Вы также можете контролировать сложность используемого сжатия с помощью предустановок ( fast, veryslow... и т. д.). И вы также можете рекомпрессировать файлы без потерь в более сжатые файлы без потерь.

Для без потерь все то же самое, что и для всех x264, за исключением того, что это настоящий без потерь.

OP намеревается воспроизводить файлы на телевизоре, и большинство декодеров h / w или s / w не поддерживают профиль Hi444, что и crf/qp 0требуется.
@Gyan Да, то, что ты говоришь, правда. За исключением того, что я сказал "трансформации". Идея, которую я представляю - человек не умеет играть с обработкой без потерь. Он может развивать workflow в lossless-форме поэтапно, а потом все это можно на лету перевести в массовую обработку в lossy. Также без потерь можно напрямую сравнивать. Как у меня было два дня назад. Если исходный файл имеет размер 11,8 Гб, то файл в почтовом ящике также будет 11,8 Гб - сразу видно, что вся информация сохранена. & Lossless всегда можно закодировать в lossy.
Вот мое решение с объяснением
ffmpeg -i input.mkv -filter:v "pad=3840:2160:0:280,setsar=1" -c:a copy -c:v libx265 -x265-params lossless=1 my_output_video.mkv
----------111111111----------------2222-3333-4-555----------------------------------------------------------6666666666666666666

Legend
1 - input filename
2 - Target X dimension
3 - Target Y
4 - Bar's target X pos. Best: Floor( (Target X - Current X) / 2) . If the value is 0, no vertical baps will be present.
5 - Bar's target Y pos. Best: Floor( (Target Y - Current Y) / 2) . If the value is 0, no horizontal baps will be present.
6 - output filename

Notes
-c:a copy is to maintain lossless-ness
-x265-params lossless=1 option is for lossless encoding. Adding -crf 0 is not required.
-c:v libx265 - added to reduce output video quality while maintaining lossless-ness
Floor() - means to floor DOWN where applicable (ideally, no non-integer calculations occur)

Мой пример команды для добавления полос от 1660x780 до 1920x1080,

ffmpeg -i input.mp4 -filter:v "pad=1920:1080:130:150,setsar=1" -crf 0 -c:v libx265 -x265-params lossless=1 my_output_video.mp4
Источники,