Ffmpeg дает худший результат, чем Handbrake, используя x265 с идентичными настройками

Я пытаюсь воспроизвести настройки Handbrake с помощью ffmpeg, потому что мне хотелось бы добавить некоторые метаданные и некоторые другие вещи с помощью ffmpeg, которые Handbrake не может сделать.

То, что я сделал, похоже, похоже, результирующий размер файла и время кодирования аналогичны, но Handbrake просто создает заметно (но не радикально) лучшее изображение.

Вот пример, ОРИГИНАЛЬНЫЙ РУЧНОЙ ТОРМОЗ FFMPEG

Они обрезаны и увеличены до 300%. Вот, например, ручник сохраняет больше цвета на одной из ног бабочки, больше деталей между желтыми частями крыльев и в целом кажется более резким. Возможно, сложно заметить, о чем я говорю, но различия есть, и они более очевидны на некоторых других видео.

Версии кодировщика x265 немного отличаются, но я считаю, что причина разницы не в этом. У Handbrake есть «x265 3.5+1-f0c1022b6», а у ffmpeg — «x265 3.5+37-07b011400», но я пробовал использовать ffmpeg со старым x265, и результат был идентичен последнему x265. И они оба, на мой взгляд, уступают Ханбрейку.

Вот скриншоты краткими размерами ручного тормоза видео с

и команда ffmpeg

      ffmpeg -i "in.mp4" -map_metadata -1 -vf scale=1280:720 -c:a copy -c:v libx265 -crf 27 -preset fast "out.mp4"

Вот медиаинформация всех трех файлов, включая оригинал, журналы кодирования, настройки Handbrake и команду ffmpeg : Папка Pastebin

Также почему-то ключевые кадры находятся в разных местах.

Мой вопрос: что я могу изменить в команде ffmpeg, чтобы результат был идентичен Handbrake?

1 ответ

В логах отличий немного: на входе видео 4к 10бит, на выходе 720р. ffmpeg решил кодировать x265, используя профиль main10, чтобы сохранить 720p-10bit. В HandBrake вы должны выбрать 10-битный кодировщик H.265, чтобы в этом случае его выход был 8-битным. Я предпочитаю 10-битный выходной сигнал, поскольку это уменьшает полосатость на источниках с более низкой скоростью передачи данных.

Keyint min/max (он же Keyframe или GOP). ffmpeg использует значения по умолчанию 25/250, тогда как Handbrake настраивает это значение до 1 секунды/10 секунд (* в данном случае ~60 кадров в секунду) для параметров 60/600. Я бы также рекомендовал deblock=-1, поскольку кодер x265 немного мягок.

Возможна проблема с выходным видео: цвета кажутся размытыми или темными на дисплеях без HDR. В этом случае вам нужно будет преобразовать тон bt2020 в bt709. Обсуждение можно найти здесь https://github.com/jellyfin/jellyfin/issues/415 .

Итак, чтобы приблизиться к использованию ручного тормоза:

      ffmpeg -i "in.mp4" -map_metadata -1 -vf scale=1280:720 -c:a copy -c:v libx265 -crf 27 -preset fast -x265-params "deblock=-1:min-keyint=60:keyint=600" out.mp4"

Если вы хотите принудительно использовать 8 бит (например, выход ручного тормоза)

      ffmpeg -i "in.mp4" -map_metadata -1 -vf scale=1280:720,format=yuv420p -c:a copy -c:v libx265 -crf 27 -preset fast -x265-params "deblock=-1:min-keyint=60:keyint=600" out.mp4"

Чтобы принудительно использовать 10 бит из 8-битного источника, используйте format=yuv420p10le.

Чтобы еще больше улучшить качество, измените crf с 27 на 25 или 23 (чем ниже, тем лучше).

Если вы не застряли на mp4 и ffmpeg, вы можете использовать графический интерфейс Handbrake или интерфейс командной строки для кодирования, а затем использовать графический интерфейс mkvmerge или интерфейс командной строки для вывода в MKV с метаданными.

Другие вопросы по тегам