4

Когда извлекаете изображение из видео через ffmpeg, можете получить сообщение как ниже.

frame=    1 fps=0.0 q=2.5 Lsize=N/A time=00:00:00.03 bitrate=N/A 

и это значение "q" означает "качество кодированных кадров". Я нашел это по поиску кода ffmpeg.c.(Ссылка: http://www.ffmpeg.org/doxygen/trunk/frame_8h_source.html#l00205)

И обычно он имеет значение от 0,0 до 6,0. Но проблема в том, что он может получить гораздо более высокое значение по ссылке.
Код говорит,

 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality / (float)FF_QP2LAMBDA);

и диапазон значений качества составляет от 1 до 32 767. и FF_QP2LAMBDA - 118. Таким образом, мы можем получить максимальное значение% 2.1f больше 277. И это очень подозрительно (из-за "% 2.1f").

1 ответ1

7

Не вдаваясь в подробности кодирования видео, вы можете взглянуть как на параметры квантования (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 вы выбрали ранее.

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