我有一堆视频,我想检查它们是否完整。其中一些可能会部分下载,但它们并没有错误。如何有效地检查这些视频是否已完全下载?
如果我有链接,我会检查它们的大小,但我没有。
我尝试使用ffprobe
和mediainfo
。ffprobe
报告部分下载的文件的小问题,但它也报告一些完全下载的文件的类似问题。我是否应该ffmpeg
读取整个文件并比较视频的长度以检查它们是否已下载?有更好的解决方案吗?
答案1
ffmpeg
是一个与操作系统无关的工具,能够确定视频文件是否已完全下载。下面的命令指示ffmpeg
读取输入视频并将视频编码为空。在编码过程中,任何错误(例如丢失帧)都会输出到 test.log。
ffmpeg -v error -i FILENAME.mp4 -f null - 2>test.log
如果视频文件未完全下载,test.log 文件中将会出现很多行。例如,视频文件中缺失 0.1 MB 会产生 71 行错误。如果视频已完全下载且未损坏,则不会发现任何错误,并且不会在 test.log 中打印任何行。
编辑
在上面给出的示例中,我测试了整个文件,因为我下载的测试视频是 torrent,整个文件中可能会丢失块。
添加-sseof -60
到参数列表将检查文件的最后 60 秒,这要快得多。
ffmpeg -v error -sseof -60 -i FILENAME.mp4 -f null - 2>test.log
你需要一个更新版本的 ffmpeg,2.8 缺少 sseof 标志,所以我使用了 3.0。
答案2
媒体信息显示一行:
Truncated: Yes
如果文件不符合格式规范的预期完整。
由于在技术上,错误(不符合文件边界规范)混合的文件和部分下载的文件之间没有区别,因此从技术上讲,不可能区分有错误的文件和部分下载的文件。
可以完成另一个(高级)测试,例如读取 .mp4 文件的索引并检查最后一帧的文件偏移+帧大小是否在您获得的文件的文件大小之内,但这并不完全是您想要的for(如果源文件中、文件末尾有元数据,例如海报,并且文件在该海报之前被截断,则在每种情况下仍然不会检测到部分下载)。它没有在 MediaInfo 中实现,但您可以添加一个MediaInfo 功能请求。
在所有情况下,检测所有部分下载都非常困难,因为大多数视频文件格式中没有指示总文件大小,因此您可以确定文件被截断,但无法确定文件没有被截断。确保下载完整文件的唯一方法是从其他地方获取文件大小(更好:拥有其哈希值,例如 MD5)。
PS:这个问题不针对任何操作系统。
答案3
我有一个文件,其中带有 -sseof -60 的 ffmpeg (v3.1.1) 没有显示任何警告,只是退出,没有任何迹象表明出现问题。 Mediainfo 也没有显示文件被截断。仅省略 -sseof -60 才会报告 ffmpeg 的任何错误。所以我又回去尝试 ffprobe。看起来比ffmpeg稍微快一点。
ffprobe -v error -count_frames -i filename.mp4
产生了这个输出
[h264 @ 00000000004e6a60] Invalid NAL unit size.
[h264 @ 00000000004e6a60] Error splitting the input into NAL units.
[mov,mp4,m4a,3gp,3g2,mj2 @ 00000000004e5280] stream 1, offset 0x1350135: partial file
我还没有遇到任何误报(正如OP所报告的)。
编辑: ffprobe 在我的测试文件上比 ffmpeg 快大约 10%,但前提是您指示它使用选项“-threads 0”的所有内核。否则它只使用一个核心/线程并且速度较慢。