1

Я работаю в программе raw to timelapse и использую ffmpeg для генерации видео из последовательности JPG, которые выводит моя программа.

Пользователь может выбирать из разных кодеков, таких как libx264, mjpeg, vp8, vp9.

У меня хорошие результаты с h264 и mjpeg, но vp8 дает мне видео очень плохого качества, хотя я установил довольно высокое качество, а размер файла сопоставим с видео h264.

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

ffmpeg.exe -framerate 12 -i "./output/img_%05d.jpg" -dst_range 1 -color_range 2 -c:v libvpx -b:v 0 -threads 8 -speed 2 -crf 8 "./output/video.webm"

Пример видео можно посмотреть здесь: https://www.youtube.com/watch?v=eG2jxzR3Uxs (проблемы с кодировкой в основном проявляются через 9 секунд).

Кто-то из Stack Overflow сказал, что VP8 нужно два прохода, но это непрактично. Есть ли способ получить хорошие результаты за один проход? Что-то сопоставимое с h264 по размеру / качеству?

2 ответа2

3

Единственный способ получить результаты хорошего качества за один проход - использовать режим с коэффициентом постоянной скорости (CRF). Пожалуйста, прочитайте руководства VP8 и VP9 для получения дополнительной информации.

При установке -crf X каждый кадр кодируется с этим целевым уровнем качества X Однако в кодере применяется дополнительное ограничение в зависимости от битрейта, установленного параметром -b:v:

  • Если используется -b:v 0 , битрейт может свободно варьироваться в зависимости от исходной последовательности и заданного целевого качества. Это опция, которую вы хотите использовать для «нормального режима CRF», эквивалентного -crf X с x264 .

  • Если для -b:v задана положительная скорость передачи, это ограничение будет использоваться в качестве максимальной скорости передачи.

    Например, в VP8 использование -crf 10 и -b:v 500K для видео 1080p наверняка всегда уменьшит битрейт до 500 кбит / с, а не позволит свободно изменять качество, делая вывод довольно плохим, поскольку видео 1080p требует гораздо больше, чем 500 кбит / с. Установка -crf 10 -b:v 5M будет иметь больше смысла для VP8. Для VP9 обычно требуется более низкий битрейт, поскольку он более эффективен.

  • Если -b:v не задан вообще, ffmpeg выберет значение по умолчанию 200 кбит / с, что, скорее всего, приведет к плохому качеству (если у вас низкое разрешение, легко кодируемая последовательность). Так что не делайте этого при использовании -crf .

Вы можете проверить настройки кодировщика, посмотрев выходные данные ffmpeg при запуске с -loglevel debug .

В вашем конкретном случае я не вижу ничего плохого в параметрах, кроме, возможно, -speed 2 . Установка этого параметра отключит некоторые функции датчика за счет точности контроля скорости. Удалите эту опцию и посмотрите, улучшит ли это ваше качество.

Обратите внимание, что опция -quality вводит в заблуждение; это устаревшая опция, которая теперь называется -deadline (для получения дополнительной информации см. ffmpeg -h encoder=libvpx ). Единственные жизнеспособные настройки для -quality - good или best (и в realtime , но это для прямой трансляции). по умолчанию это good , так что вам не нужно явно указывать его. best приведет к очень длинному времени кодирования.

0

Несмотря на то, воспринимаемое качество субъективно вы можете регулировать общее качество , используя переменную -quality для примера -quality good Битрейт повлияет на качество, которое вы установили на 0, что, я полагаю, было просто ошибкой.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .