0

我发现一些损坏的 AVI 文件,当我尝试播放它们时,VLC 抱怨索引损坏。我可以直接播放而无需滚动时间线或等待...等待...建立索引(但未保存)并正常播放。其他一些玩家可以毫无怨言地玩它们,而另一些则拒绝玩。

我可以在VirtualDub中无缝解决这个问题,方法是在 Open with “re-derive keyframe flags”中打开带有 “extended options” 的 .avi,然后保存一个带有直接流复制视频和音频的新 .AVI 文件。生成的文件可以完美播放。

我也可以用ffmpeg解决问题,但并非没有问题。

ffmpeg -i INFILE -vcodec copy -acodec copy OUTFILE

重要:只有流副本和相同的容器是有意义的。

生成的文件在 VLC 中播放没有任何抱怨或下一个问题,但在许多其他播放器中,当在时间轴上跳转时,视频会在跳转目的地立即失真,并保持严重失真,直到流中的下一个 I 帧。使用 VirtualDub 处理时,所有这些都不会发生。

ffmpeg 更快,但最重要的是它是可编写脚本的,并且可以使许多文件自动化。使用 VirtualDub,必须手动处理每个文件并等待很长时间,以便打开的进程首先重新导出关键帧标志。不介意 ffmpeg 速度是否因为它可以提供的自动化而丢失。

到目前为止,我只在这里找到了一个非常古老的未答复邮件列表帖子

如果没有上述问题,ffmpeg 可以修复此类文件吗?如果是,如何?

谢谢你。

4

1 回答 1

0

AVI 文件索引包含所有帧(关键帧或非关键帧),但它们有一个flags字段(FFmpeg 填充),它应该帮助玩家只寻找关键帧。我无权访问您的确切文件(ffprobe信息会有所帮助),但我们可以假设该flags字段未正确写入,例如它可能为每一帧设置或根本不设置。

如果容器中不存在,VLC 可能会解析编解码器数据包以导出关键帧标志,但其他播放器可能不会。我认为您正在寻找的是在流复制时派生关键帧标志。确切的命令行取决于编解码器。例如,对于 H264,您希望作为中间文件格式转储到附件 B,然后重新读取它,以便调用 H264 解析器,它设置关键帧标志,然后将其重新复用到 AVI - 但是 H264在 AVI 中很少见,所以这可能不是这里发生的事情。

所以对于一个解决方案,我需要输出,ffprobe $file所以我知道 AVI 文件包含什么编解码器。

于 2022-01-31T13:03:14.193 回答