Integrando o ffmpeg4 com o Pyglet. Qual é o método correto para identificar fluxos com alfa?

2

Estamos tentando interar o ffmpeg4 com o Pyglet.

Tudo está indo muito bem, mas temos um problema:

Se um arquivo VP9 (ou VP8) é criado usando ffmpeg4, de arquivos png com alfas, obtemos um arquivo de vídeo (webm) com alfa internamente. ffmpeg -i image_seq%03d.png -qmin 0 -qmax 50 -crf 5 -b:v 1M output.webm

Exemplos de vídeos webm com alfa podem ser encontrados nesta página: link

No entanto, na reprodução, não obtemos o alfa, a menos que substituamos o codec por libvpx. (mesmo comportamento pode ser demonstrado na versão CLI do ffplay). Estamos envolvendo avutil, avcodec, etc .

Pergunta: Qual é a maneira correta de identificar (no código) que um fluxo VP8 ou VP9 tem um componente alfa? (Assim, podemos carregá-lo e acessá-lo via AVFrame() para usar como uma textura RGBA.)

Mais especificamente:

Obtemos o FormatContext do arquivo usando AVFormatContext e o fluxo AVStream desse FormatContext.

Em seguida, a partir do AVStream , obtemos o parâmetro 'codecpar'.

A partir do AVCodecParameters podemos examinar o codec_id (167 é VP9) e outros parâmetros úteis como bits_per_coded_sample .

Curiosamente, esses valores parecem corretos para fluxos como H264 (codec_id = 27) a 24 bits, mas são marcados como 0 para o codec VP9. Levando-me a pensar que este não é o lugar correto para encontrar o valor adequado.

    
por Neon22 14.06.2018 / 08:51

1 resposta

0

OK, o codec nativo não é tão bom quanto o codec libvpx que é fornecido pelos peeps do Webm. Então, se você quiser esta informação alfa, então você deve substituir o codec em load com o codec libvpx.

Como você faz isso - veja aqui: link

Basicamente, o terceiro argumento para avformat_open_input() precisa ser um av_find_input_format("libvpx") , que é o tipo AVInputFormat

Se você não tiver certeza se é um codec do VP8,9 no contexto do arquivo, precisará testar o arquivo primeiro, descobrir o codec e, em seguida, substituí-lo em uma carga real. Veja aqui como fazer isso: link

e por último - se você quiser usar o codec nativo em vez de webm, a menos que tenha um alpha (mas por que você), então você pode verificar se o sinalizador alfa está definido, verificando os dados do lado AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL.

Verifique se AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL se o side_data começa com (uint64_t) 1 existe uma camada de transparência.

Mas o consenso geral é sempre usar o decodificador libvpx.

Editar: mais detalhes O id do codec do Google VP8 é 139. e 167 é o codec do Google VP9. Para substituir as versões libvpx, você precisa encontrar "libvpx-vp8" e "libvpx-vp9" usando, por exemplo, avcodec_find_decoder_by_name ("libvpx-vp9")

    
por 15.06.2018 / 02:28