FFMPEG: обрезать видео без потери качества

У меня есть mp4 видео 1920x1080. Я хотел бы обрезать видео до 480x270 без потери качества.

Я использую следующую команду:

ffmpeg -i input.mp4 -filter:v "crop=480:270:200:200" -crf 23 output.mp4

Я также пробовал:

ffmpeg -i input.mp4 -filter:v "crop=480:270:200:100" -c:a copy -qp 0 output.mp4

Я использовал -crf 23 и -qp 0 для обрезки без потерь, но после обрезки видео потеряло качество.

Кто-нибудь знает, как я могу обрезать видео без потери качества?

Ответ 1

Вы не можете выполнять фильтрацию без потери качества при кодировании в формате с потерями, но у вас есть некоторые параметры.

Обрезка с помощью проигрывателя

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

С ffplay и фильтр обрезки:

ffplay -vf "crop=480:270:200:100" input.mp4

С vlc (или cvlc):

vlc input.mp4 --crop=480x270+200+100

Или вы можете обрезать с помощью графического интерфейса VLC: Инструменты > Эффекты и фильтры > Видеоэффекты > Обрезка.

Используйте формат без потерь

ffmpeg может кодировать несколько кодов без потерь: ffv1, huffyuv, ffvhuff, utvideo, libx264 (используя -crf 0 или -qp 0). Выход будет без потерь, но выходной файл будет огромным.

ffmpeg -i input.mp4 -vf "crop=480:270:200:100" -c:v ffv1 -c:a copy output.mkv

или

ffmpeg -i input.mp4 -vf "crop=480:270:200:100" -c:v libx264 -crf 0 -c:a copy output.mp4

Принять некоторые потери качества

Дайте ему достаточно бит, и вы не сможете сказать, что есть разница в качестве:

ffmpeg -i input -vf "crop=480:270:200:100" -c:v libx264 -crf 17 -c:a copy ouput.mp4

Подробнее см. FFmpeg Wiki: Руководство по кодированию видео H.264.

Если ваш вход MJPEG

Поток копировать отдельные изображения с помощью ffmpeg, обрезать их без потерь с помощью jpegtran, а затем перечислить их с помощью ffmpeg. Это не приведет к потере, но вы будете ограничены древним форматом MJPEG.

Ответ 2

На базовом уровне вы не можете использовать кодировку с потерями, а затем ожидаете, что она не потеряет качество при декодировании и последующем кодировании. Единственный способ, который работает, - использовать кодек без потерь, например Quicktime с кодеком анимации. Это просто основная истина в производстве цифрового видео, которую вы не можете обойти, просто передав параметры командной строки в ffmpeg.

Ответ 3

Это невозможно с помощью ffmpeg.

В качестве альтернативы вы можете встроить свое видео в контейнер Matroska (.mkv) и установить тег обрезки в заголовке файла, но он должен поддерживаться вашим игроком.

Как сообщается, для H264-кодированных видео H264info также можно использовать, но мне все равно нужно выяснить, как его использовать..