Por que o FFmpeg decodifica um vídeo YUV420p?

2

Por que o FFmpeg decodifica um vídeo bruto no formato de pixel de 8 bits do YUV420 planar, quando ele também codifica o vídeo usando o mesmo formato de pixel YUV420p?

Eu executei alguns testes de benchmark codificando somente vídeo YUV420p bruto usando o codificador MPEG2 em um PowerPC FreeScale usando as seguintes configurações:

ffmpeg -f rawvideo -pix_fmt yuv420p -s cif -r 25 -i YUV420p_cif.yuv -vcodec mpeg2video -pix_fmt yuv420p -r 25 -g 25 -s cif -b:v 1024k Output.mp4

A sequência de vídeos tem 15 minutos de duração. Eu descobri que todo o processo usa:

  • 3,9% do tempo lendo o arquivo;
  • 3,7% de decodificação de tempo;
  • 91,2% de codificação de tempo;
  • 0,7% do tempo usando muxing + escrevendo o arquivo;
  • 0,5% do tempo é inicializar / fechar o ffmpeg

O processo total foi feito em 382 segundos (58,9 fps), então a decodificação levou 14,1 segundos no total. Isso parece muito para mim!

Como o processo de codificação está usando o formato de pixel YUV420p, por que o FFmpeg precisa de 3,7% do tempo para decodificar o YUV420p bruto no mesmo formato?

    
por Nick van Tilborg 19.03.2013 / 16:07

1 resposta

2

Para codificar o vídeo, você ainda terá que obter os dados de cada quadro em um formato interno, de onde pode ser alimentado ao codificador.

AVFrame é usado para representar quadros internamente e pode usar qualquer formato de pixel desejado - você basta alocá-lo corretamente.

E é por isso que a decodificação leva o tempo da CPU, mesmo que os formatos de pixel de entrada e saída sejam os mesmos: você precisa alocar memória para cada quadro, lê-lo (mesmo que seja dados brutos) e passar esse quadro para o codificador. Um exemplo de como a codificação e a decodificação são tratadas pode ser visto aqui .

    
por 19.03.2013 / 16:34