Como preservar tanto quanto possível a cor RGB, convertendo uma série de arquivos PNG em um recipiente de vídeo com ffmpeg?

1

Eu tenho 950 arquivos PNG que se destinam a se tornar quadros individuais em uma trilha de vídeo de 38 segundos a 25 quadros por segundo. Os nomes dos arquivos são idênticos, exceto pelo número de seqüência, como é habitual neste tipo de casos.

Eu quero produzir um contêiner de um formato amplamente suportado, idealmente WebM se todos os critérios puderem ser atendidos, ou MPEG-4 por exemplo, com um codec que é suportado por navegadores modernos para reprodução, desta série de Imagens PNG que eu tenho. O problema é que as cores são deslocadas e a cor de fundo no vídeo decodificado não corresponde mais ao mesmo trio de cores RGB amostrado da cor de fundo nas imagens PNG. Isso resulta no vídeo saindo do fundo pretendido na minha página HTML onde o vídeo está incorporado.

Eu tentei o simples:

ffmpeg -f image2 -i image%03d.png output.webm

que de fato me deu uma faixa de vídeo VP9 de 25 fps em um contêiner WebM.

As imagens PNG são em estilo de animação, com fundo sólido e formas simples animadas para o primeiro plano. Eles parecem estar com a cor sem tag (isso é o que o Adobe Bridge me diz, suponho que isso significa que não há perfil de cor incorporado ou uma referência a um). O problema com a minha tentativa acima é que, mesmo que o contêiner seja reproduzido no Chrome, a cor de segundo plano amostrada da imagem PNG, com trio% RGB#ED4D56, não corresponde perceptualmente à cor de fundo que aparece no vídeo que está sendo reproduzido.

Este é um efeito colateral inevitável do RGB para YUV (codificação) para conversão de cores RGB (reprodução)? Existe alguma maneira de mitigar isso? Eu não insisto que os quadros na trilha de vídeo sejam codificados usando RGB, suponho que YUV é bom, contanto que um navegador moderno reproduzindo esses quadros produza o mesmo (dentro de uma margem de erro insignificante) tripleto RGB ao decodificar e exibir o frame (s).

Minha pergunta é, qual linha de comando usando ffmpeg posso tentar atenuar isso? Estou aberto para trocar o codec de vídeo, o formato de pixel, habilitar o gerenciamento de cores no ffmpeg, se existir, etc.

    
por amn 10.03.2018 / 13:05

1 resposta

0

Eu tive uma tarefa muito semelhante recentemente e diria que ainda não há uma solução perfeita (a partir de outubro de 2018). Este é o efeito colateral da conversão de cores RGB para YUV para RGB de baixa precisão. Mesmo algumas variantes "sem perdas" de codecs (por exemplo, libvpx-vp9 -lossless ) produzem cores distorcidas devido ao espaço de cores YUV.

  • Se cores não exatas forem aceitáveis, o codec libvpx poderá fazer um bom trabalho:

    ffmpeg -r 25 -i image%03d.png -c:v libvpx -crf 4 -b:v 0 output.webm
    

    Com essas configurações, produziu uma quantidade insignificante de mudança de cor ou até mesmo as cores exatas para alguns conjuntos de quadros. Codecs VPx são amplamente suportado (todos os principais navegadores, exceto o IE eo Safari) e tamanho de arquivo razoável.

  • Se as cores exatas forem estritamente necessárias, precisamos evitar conversão de espaço de cores. A única solução entre navegadores que eu criei é usar imagens animado png . ffmpeg tem apenas muito básico suporte para apng, por isso é melhor usar outras ferramentas, por exemplo apngasm :

    apngasm output.png image001.png 1 25
    

    funcionará em todos os lugares, exceto no IE e no Edge primeiro quadro estático). Os tamanhos dos arquivos são enormes, mas esse é o preço para a verdadeira codificação sem perdas.

  • O codec libx264rgb também deve ser mencionado - usando vontade ser a maneira correta de codificar as cores RGB precisas quando / se navegadores suportarão isso.
por 27.10.2018 / 08:04