我正在寻找一种可编写脚本的 bash 方法来识别缺少索引的 AVI 文件。
这些是截断的 AVI 文件,尽管存在一些问题,但仍可播放。到目前为止,唯一可靠的方法是在 VirtualDub 中打开 AVI(它要求重新导出关键帧标志,然后使用流副本保存以创建修复的 AVI)或 VLC,它会提示创建可寻址播放的索引,但它不会保存它。
ffmpeg -i bad.avi -codec copy good.avi
创建已修复的 AVI。这是可编写脚本的。但我想只识别坏文件并将它们提供给这样的修复脚本,而不是浪费处理好文件。
我尝试了类似的方法ffprobe -v error -select_streams v:0 -show_entries stream=index -of default=nw=1 file.avi
,但对于好文件和坏文件,结果都是“index=0”。(也许我误解了)
此类文件可以被识别吗ffmpeg
?如果可以,如何识别?
我为自己准备了一个这样的测试用例:(original.avi
完整,带有索引文件)和test.avi
截断版本(无索引)。使用dd if=original.avi of=test.avi bs=1M count=X
(其中 X 小于原始文件大小)创建。
ffprobe 的输出:
Input #0, avi, from 'original.avi':
Duration: 01:54:27.87, start: 0.000000, bitrate: 847 kb/s
Stream #0:0: Video: msmpeg4v3 (DIV3 / 0x33564944), yuv420p, 640x352, 646 kb/s, 23.98 fps, 23.98 tbr, 23.98 tbn, 23.98 tbc
Stream #0:1: Audio: ac3 ([0] [0][0] / 0x2000), 48000 Hz, stereo, fltp, 192 kb/s
Input #0, avi, from 'test.avi':
Duration: 01:47:10.18, start: 0.000000, bitrate: 847 kb/s
Stream #0:0: Video: msmpeg4v3 (DIV3 / 0x33564944), yuv420p, 640x352, 23.98 fps, 23.98 tbr, 23.98 tbn, 23.98 tbc
Stream #0:1: Audio: ac3 ([0] [0][0] / 0x2000), 48000 Hz, stereo, fltp, 192 kb/s
此外,该命令ffprobe -hide_banner -v error -select_streams v:0 -show_entries stream -of default test.avi
还会产生以下不同的字段:期间,duration_ts,比特率与 上的输出相比original.avi
。
比特率被列为不适用但这test.avi
不可靠。我在多个文件上进行了测试,该指标通常表现为误报。
使用 ffmpeg 第 3、4、5 和 6 代进行测试。