Единственный способ получить результаты хорошего качества за один проход - использовать режим с коэффициентом постоянной скорости (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
приведет к очень длинному времени кодирования.