我发现了一些损坏的AVI文件,VLC在我试图播放这些文件时抱怨索引损坏。我可以直接播放没有能力滚动的时间线或wait...wait.用于生成(但未保存)并正常运行的索引。一些其他球员可以毫无怨言地与他们比赛,另一些人则拒绝上场。
我可以在VirtualDub中无缝地解决这个问题,方法是在opening 中打开带有"extended“的.avi”重新派生关键帧标志“,然后用直接流复制保存一个新的.AVI文件,用于视频和音频。生成的文件运行得很好。
我也可以用ffmpeg来解决这个问题,但不是没有问题。
ffmpeg -i INFILE -vcodec copy -acodec copy OUTFILE重要的:只有流副本和相同的容器是感兴趣的。
结果文件在VLC中播放,没有抱怨或下一个问题,但是在许多其他播放器中,当跳到时间线上时,视频会在跳转目的地立即被扭曲,并且一直严重失真,直到下一个I帧在流中。所有这一切在用VirtualDub处理时都不会发生。
ffmpeg速度更快,但最重要的是它是可编写的,可以使许多文件实现自动化。使用VirtualDub时,必须手动处理每个文件,等待开放进程重新派生关键帧标志的时间。如果ffmpeg速度因为它可以提供的自动化而丢失的话,我不会介意。
到目前为止,我只发现了一个非常老的未回复邮件列表这里
如果没有上述问题,ffmpeg能修复这样的文件吗?如果是,怎么做?
谢谢。
发布于 2022-01-31 13:03:14
AVI文件索引包含所有帧(键或否),但它们有一个flags字段( FFmpeg填充该字段),它应该帮助玩家只查找关键帧。我无法访问您的确切文件(ffprobe信息将有帮助),但是我们可以假设flags字段写得不正确,例如,它可能被设置为每个帧,或者根本没有设置。
如果容器中不存在,VLC可能会解析编解码器数据包以派生关键帧标志,但其他参与者可能不会。我认为您要寻找的是在流复制的同时派生关键帧标志。确切的命令行在一定程度上取决于编解码器。例如,对于H264,您可能希望将附件B作为中间文件格式转储到附件B中,然后重新读取它,从而调用H264解析器,这将设置关键帧标志,然后将其重新封装到AVI中,但是AVI中的H264是罕见的,所以这里可能不会发生这种情况。
因此,对于一个解决方案,我需要ffprobe $file的输出,这样我就知道AVI文件包含了什么编解码器。
https://stackoverflow.com/questions/70913135
复制相似问题