Como remover erros interframe do webm?

2

Eu tenho vídeos do webm que geram o erro:

Discarding interframe without a prior keyframe!

Quando reproduzido no VLC. Como posso recodificar / corrigir os arquivos no linux para resolver este erro?

Existe uma maneira de verificar esses problemas em um vídeo sem reproduzi-lo?

    
por Zhen 30.04.2013 / 20:36

1 resposta

3

Um entrelaçamento é um quadro que requer que o decodificador leia o quadro-chave anterior (intra-quadro) para poder construir a imagem. Isso ocorre porque uma inter-estrutura, grosso modo, contém apenas a diferença entre o quadro-chave anterior e a própria.

Quando você avança um vídeo para um determinado ponto, talvez você não acerte um quadro-chave. Na verdade, é mais provável que você acesse uma inter-estrutura, já que os quadros-chave são inseridos apenas em todos os quadros N (por exemplo, 16). Então, o que o jogador faz quando você acerta um entrelaçamento, é que ele tem que descartar esse quadro - e todos os posteriores - até encontrar o próximo quadro-chave. De lá, ele pode começar a decodificar e mostrar uma foto para você.

A implementação do VP8 no libavcodec (a biblioteca que o VLC usa para decodificar Vídeo WebM / VP8), menciona isso também:

// Given that arithmetic probabilities are updated every frame, it's quite 
// likely that the values we have on a random interframe are complete junk 
// if we didn't start decode on a keyframe. So just don't display anything 
// rather than junk.
if (!s->keyframe && (!s->framep[VP56_FRAME_PREVIOUS] ||
                     !s->framep[VP56_FRAME_GOLDEN] ||
                     !s->framep[VP56_FRAME_GOLDEN2])) {
    av_log(avctx, AV_LOG_WARNING, "Discarding interframe without a prior keyframe!\n");
    return AVERROR_INVALIDDATA;

Ter que esperar por quadros-chave é o principal motivo pelo qual o avanço rápido e a continuação da reprodução podem demorar um pouco, a menos que o jogador mantenha um buffer para a área atrás do indicador de reprodução.

Para resumir: você não fez nada de errado. Você não pode codificar um vídeo sem quadros-chave nem remover quadros-chave à força. E como o VLC depende do libavcodec, onde o código acima é codificado, você não pode alterar essa mensagem de erro (na verdade, é apenas um aviso).

Se o VLC faz ficar parado por você por causa disso, pode haver um bug relacionado a essa parte do código, mas pelo que eu li que deveria ter sido corrigido .

    
por 30.04.2013 / 21:02