Не вдаваясь в подробности кодирования видео, вы можете взглянуть как на параметры квантования (QP), так и на параметр Lambda, чтобы выразить качество кодированного кадра.
Эта цифра взята из Xiaoyin, Cheng - Субъективно оптимизированное кодирование HDTV-видео, 2009. Вы можете думать о лямбде как о множителе Лагранжа в процессе оптимизации скорости искажения.
Если вы возьмете макроблок и закодируете его с низким QP, искажение (D) по сравнению с исходным изображением будет низким, но скорость передачи (R) будет высокой. Аналогично, если вы выберете высокий QP, искажение будет высоким, но скорость передачи будет низкой. Таким образом, стоимость сжатия кадра рассчитывается как J = D + λR - и эту стоимость необходимо минимизировать.
В вашем конкретном случае я вполне уверен, что enc->coded_frame->quality
назначается лямбда-значения из кодировщика. С помощью константы FF_QP2LAMBDA
вы можете конвертировать в лямбда-единицы, например, пусть QP = 21, затем λ = 21 × FF_QP2LAMBDA
. И наоборот, вы получаете QP по QP = λ / FF_QP2LAMBDA
, что вы видите в выходных данных.
Например, в H.264 основное соотношение составляет λ = 0,85 × 2 (QP-12)/3. Поскольку значения QP колеблются от 0 до 51, вы получаете значения лямбда от 0,053 до 6 963,2 - но FFmpeg все равно будет выводить значения QP, преобразовав лямбда обратно в QP.
Теперь, когда вы говорите «диапазон значений качества составляет от 1 до 32 767», вы имеете в виду диапазон возможных значений лямбда. Поскольку функция Лагранжа вступает в игру только после применения QP к кодированному макроблоку, существует практическое ограничение на максимальное число, которое может получить coded_picture->quality
. Например, в MPEG-4 Part 2 значения QP идут от 1 до 31, и, как я сказал выше, в MPEG-4 Part 10, это от 0 до 51. В свою очередь, q=
снова выведет правильный QP, потому что возможные значения лямбды ограничены тем, какой QP вы выбрали ранее.