Qual é o valor máximo e mínimo de 'q' no ffmpeg?

4

Quando extrair uma imagem de um vídeo via ffmpeg, pode receber uma mensagem como abaixo.

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

e esse valor 'q' significa "qualidade de quadros codificados". Eu encontrei isso pesquisando código ffmpeg.c. (Link de referência: link )

E normalmente tem valor entre 0,0 a 6,0. Mas o problema é que pode obter um valor muito mais alto por referência.
O código diz:

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

e o intervalo de valor de qualidade é de 1 a 32.767. e FF_QP2LAMBDA é 118. Portanto, podemos obter o valor máximo de% 2.1f acima de 277. E é muito suspeito (por causa de "% 2.1f").

    
por Juneyoung Oh 29.08.2013 / 08:21

1 resposta

7

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 Xiaoyin, Cheng - Codificação de Vídeo HDTV Subjetivamente Otimizada, 2009 . Você pode pensar no Lambda como o multiplicador Lagrangeano no processo Otimização de Distorção de Taxa .

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.

    
por 29.08.2013 / 10:40