Por que a codificação de um vídeo usando o codec MJPEG demora mais do que o MPEG-4?

2

Estou testando o desempenho de codificação (MPEG-4 e MJPEG) de uma câmera inteligente. Eu escrevi um aplicativo no OpenCV / FFMPEG para executar a codificação, onde o aplicativo captura imagens da câmera e as codifica para um formato de codificação desejado. Nos benchmarks, fiquei sabendo que a codificação MJPEG está demorando muito mais que a codificação MPEG-4. Eu esperava que fosse o contrário. A codificação de um único quadro para o MPEG-4 leva em torno de 31ms, enquanto a codificação para o MJPEG leva em torno de 80ms. O MJPEG realmente leva muito tempo em comparação ao MPEG-4?

    
por umair 12.08.2011 / 11:20

1 resposta

2

Os dois algoritmos de compressão são completamente diferentes na forma como funcionam, e o MPEG4 também pode usar a aceleração da GPU.

O MPEG4 é um verdadeiro codec de vídeo, enquanto o MJPEG simplesmente compacta cada quadro em uma imagem JPEG separada. A diferença é que o MPEG4 usa uma variedade de técnicas (compensação vetorial de movimento, quadros I / B, etc ...) para melhorar a qualidade e a taxa de compressão.

Por que um funciona mais rápido, o outro caso realmente depende de como o codificador foi implementado e de como seu hardware específico é executado durante a codificação. Alguns codificadores podem usar instruções especiais da CPU (SSE / SSE2, MMX, etc ...) ou usar a aceleração da GPU (eu sei que você provavelmente não, mas eu estou apenas mencionando isso). A compactação JPEG é, em grande parte, dependente da velocidade da CPU e realmente não usa nenhum aprimoramento de conjunto de instruções (para compatibilidade / estabilidade e o fato de que não é realmente necessário). help - veja a entrada do changelog para 16 de novembro de 2006.

Por fim, a menos que você tenha um vídeo de quadro único, o MPEG4 nunca codifica um "quadro único" de cada vez. Ele sempre executa frame look ahead ahead / behind para determinar as melhores maneiras de compactar o quadro atual (o MJPEG faz fazer apenas um quadro por vez). Como tal, é largamente dependente dos dados antes / depois do quadro, não apenas no atual. Isso também ocorre na codificação de passagem única (afinal, ele usa os vetores de movimento, afinal).

    
por 12.08.2011 / 12:45