我有输出错误的 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做因此,请耐心等待,因为代码的这一部分可能存在错误,但从我读过的内容来看应该修复。