如何从 webm 中删除帧间错误?

如何从 webm 中删除帧间错误?

我有输出错误的 webm 视频:

Discarding interframe without a prior keyframe!

在 VLC 中播放时。我该如何在 Linux 中重新编码/修复文件来解决此错误。

有没有办法不播放视频就可以检查这些问题?

答案1

帧间帧是指需要解码器读取前一个关键帧(帧内帧)才能构建图像的帧。这是因为帧间帧粗略地说只包含前一个关键帧与其自身之间的差异。

当你将视频快进到某个点时,你可能不会碰到关键帧。事实上,你碰到帧间帧的可能性更高,因为关键帧只会每隔帧(例如 16)。因此,当您遇到帧间时,播放器会丢弃此帧以及所有后续帧,直到找到下一个关键帧。从那里,它可以开始解码并向您显示图片。

libavcodec 中的 VP8 实现(VLC 用于解码 WebM/VP8 视频的库),也提到了这一点:

// 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;

必须等待关键帧是快进然后恢复播放可能需要一段时间的主要原因,除非播放器为播放头后面的区域保留一个缓冲区。

总结一下:你没有做错什么。你无法对没有关键帧的视频进行编码,也无法强制删除关键帧。而且由于 VLC 依赖于 libavcodec,而上述内容是硬编码的,因此你也无法更改该错误消息(实际上,它只是一个警告)。

如果 VLC因此,请耐心等待,因为代码的这一部分可能存在错误,但从我读过的内容来看应该修复

相关内容