Могу ли я сделать кодирование FFmpeg более эффективным, не жертвуя качеством или размером файла?

Вопрос или проблема

В данный момент я записываю игровой процесс через OBS в почти безупречном формате, который отлично сохраняет качество, но генерирует гигабайты видео. Для распространения я хочу перекодировать свои видеофайлы в H.265 с помощью FFmpeg. Мои текущие настройки FFmpeg выглядят следующим образом:
ffmpeg -i infile.mkv -c:v libx265 -crf 16 -preset slow -c:a aac outfile.mp4

Однако при кодировании видеофайлов существует некоторый баланс между качеством, размером файла и временем кодирования. Более быстрый пресет ускорит время кодирования, но увеличит размер файла. А более высокое значение CRF приведет к уменьшению файлов, но с более низким качеством.
Пока я пробовал использовать кодировщик hevc_nvenc с пресетом “p7”, который должен быть “самый медленный (лучшее качество)”. Хотя этот кодек был, безусловно, быстрее, он также производил неприемлемо низкое качество. Возможно, я не понял, как использовать эти параметры кодека, но я также не смог найти хорошую документацию.
В заключение, есть ли способ сократить время кодирования, возможно, используя мою nVidia RTX 4070 Ti, без (заметных) жертв в качестве или размере файла?

Я немного глубже исследовал этот вопрос и кажется, что мой первоначальный тест с использованием hevc_nvenc был ошибочен, что привело к заметно более низкому качеству.
Однако после некоторых экспериментов для меня оказались пригодными следующие флаги:
ffmpeg -i infile -c:v hevc_nvenc -cq 1 -c:a aac outfile

В моих первоначальных тестах флаг -cq отсутствовал, что привело к его установке на “авто”, что, в свою очередь, привело к довольно плохому визуальному качеству.
В моих тестах видеофайл размером 166 МБ был перекодирован в файл размером 52 МБ без видимой потери качества.
Я также провел больше тестов с уровнями пресетов, специально тестируя -preset p4 (по умолчанию) и -preset p7. В обоих сценариях размеры файлов оставались идентичными. Скорость составляла 5x и 1.85x, так что самый медленный пресет был значительно медленнее. Визуальное качество, казалось, не пострадало от использования пресета по умолчанию, но моя выборка была слишком маленькой для достоверной оценки.
Я уверен, что есть ещё флаги, которые могут потенциально повлиять на качество, время кодирования или качество (профили, уровни и т.д.), но я знаю слишком мало о видеокодировании, чтобы действительно играть с ними.

Ответ или решение

Оптимизация кодирования видео посредством FFmpeg без потери качества или увеличения размера файла — задача, которую можно решать с различными подходами, особенно с учетом возможностей вашего аппаратного обеспечения, такого как видео-карта nVidia RTX 4070 Ti. В данном случае вы рассматриваете переход с CPU-кодирования с использованием libx265 на GPU-кодирование с использованием hevc_nvenc, что может существенно ускорить процесс, но при этом важно правильно настроить параметры, чтобы сохранить качество изображения.

Теория

При кодировании видео существует несколько ключевых переменных, которые влияют на конечный результат:

  1. Качество видео: Измеряется в значениях CRF (Constant Rate Factor) для libx265 или CQ (Constant Quality) для hevc_nvenc. Более низкие значения CRF/CQ означают лучшее качество, но большее потребление битрейта.

  2. Размер файла: Фактически это зависит от того, какой битрейт вы позволяете вашему видео использовать. Обычно это компромисс между качеством и размером файла.

  3. Время кодирования: Зависит от выбранного пресета (preset) и аппаратной мощности. Более медленный пресет может приводить к лучшей компрессии, но увеличивает время обработки. GPU-кодирование, как правило, быстрее, но первоначальные попытки показали, что без правильной настройки могут пострадать качество или размер файла.

  4. Аппаратная оптимизация: Использование аппаратного кодирования на графическом процессоре (GPU) может предоставить значительное ускорение по сравнению с программным кодированием на центральном процессоре (CPU), но для этого нужно оптимально настроить параметры.

Пример

Вы упомянули, что ваши первоначальные тесты с hevc_nvenc показали низкое качество, потому что параметр cq был установлен неправильно. При использовании hevc_nvenc, параметр CQ контролирует качество видео, аналогичный параметру CRF в libx265.

Проведя тесты, вы изменили параметры на:

ffmpeg -i infile -c:v hevc_nvenc -cq 1 -c:a aac outfile

При этих настройках, вы уменьшили размер файла с 166 МБ до 52 МБ, не заметив при этом видимой потери качества, что свидетельствует о способности GPU-кодирования вывести на высокий уровень сжатия без заметной потери качества при правильной настройке.

Применение

Для эффективного использования возможностей вашей RTX 4070 Ti и оптимизации процесса кодирования, предлагается следующая стратегия:

  1. Оптимизация параметров CQ: Попробуйте варьировать значение CQ в диапазоне 1-4. Это поможет вам подобрать оптимальный баланс между качеством и размером файла. Обычно значение CQ 1 сохраняет практически полное качество, но вы можете постепенно увеличивать значение для уменьшения размера файла, если это необходимо.

  2. Использование пресетов:

    • Preset ‘p4’ (default) и ‘p7’ для hevc_nvenc показывают разные скорости, но не влияют на качество. Если визуально разница не заметна, используйте дефолтный ‘p4’ для ускорения кодирования.
  3. Дополнительные параметры для качества:

    • Profiles и Levels: Убедитесь, что используете подходящий профиль, например High, который предоставляет расширенные опции для качества. Проверьте, какие профили улучшат ваше кодирование без увеличения размера.
    • Битрейты и буферизация: Настройте параметры -bf, -refs для оптимизации битрейта и предварительного буферирования, что может привести к сложной, но более качественной компрессии.
  4. Тестирование и проверка: Продолжайте тестировать на небольших интервалах видео, чтобы гарантировать отсутствие компромиссных эффектов. Всегда проверяйте результаты на разных устройствах воспроизведения для вывода консистентных данных.

  5. Обратная совместимость и поддержка устройств: Учитывайте поддержку H.265 вашей аудиторией. Хоть кодеки H.265 предлагаются для лучшего сжатия, H.264 остается более совместимым стандартом для большинства устройств.

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

Оцените материал
Добавить комментарий

Капча загружается...