Sem ir muito nos detalhes da codificação de vídeo, é possível observar os parâmetros Quantization Parameters (QP) ou o parâmetro Lambda para expressar a qualidade de um quadro codificado.
Estenúmerofoiretiradode
Se você pegar um macrobloco e codificá-lo com um QP baixo, a distorção ( D ) em comparação com a imagem original será baixa, mas a taxa de bits ( R ) será alto. Da mesma forma, se você escolher um QP alto, a distorção será alta, mas a taxa de bits será baixa. Assim, o custo de compactar um quadro é calculado por J = D + λR - e esse custo precisa ser minimizado.
No seu caso específico, tenho certeza de que enc->coded_frame->quality
recebe valores de Lambda do codificador. Com a constante FF_QP2LAMBDA
, você pode converter em unidades Lambda, por exemplo deixe QP = 21 , então λ = 21 × FF_QP2LAMBDA
. Ao contrário, você obtém o QP por QP = λ / FF_QP2LAMBDA
, que é o que você está vendo na saída.
Por exemplo, em H.264, a relação básica é λ = 0,85 × 2 (QP-12) / 3 . Como os valores de QP variam de 0 a 51, você obtém valores de Lambda entre 0,053 e 6,963.2 - mas o FFmpeg emitirá os valores de QP de qualquer maneira, convertendo Lambda de volta em QP.
Agora, quando você diz "intervalo de valor de qualidade é de 1 a 32.767", você quer dizer o intervalo de possíveis valores de Lambda. Como a função Lagrangeana só entra em jogo após o QP é aplicado ao macrobloco codificado, existe um limite prático para o número máximo que pode ser obtido com coded_picture->quality
. Por exemplo, no MPEG-4 Parte 2, os valores de QP vão de 1 a 31, e como eu disse acima, no MPEG-4 Parte 10, é de 0 a 51. Em troca, o q=
produzirá o QP correto novamente, porque os possíveis valores do Lambda são limitados pelo QP que você escolheu antes.