如何检查视频是否已完全下载?

Ho1*_*Ho1 12 download ffmpeg video verification

我有一堆视频,我想检查它们是否完整。其中一些可能被部分下载,但它们没有故障。如何有效检查这些视频是否已完全下载?

如果我有链接,我会检查它们的大小,但我没有。

我尝试使用ffprobemediainfoffprobe报告部分下载文件的小问题,但它也报告一些完全下载文件的类似问题。我是否应该使用ffmpeg读取整个文件并比较视频的长度以检查它们是否已下载?有更好的解决方案吗?

J36*_*363 12

ffmpeg是一种与操作系统无关的工具,能够确定视频文件是否已完全下载。下面的命令指示ffmpeg读取输入视频并将视频编码为空。在编码过程中,任何错误(如丢失帧)都会输出到 test.log。

ffmpeg -v error -i FILENAME.mp4 -f null - 2>test.log
Run Code Online (Sandbox Code Playgroud)

如果视频文件没有完全下载,test.log 文件中会有很多行。例如,视频文件中缺少 .1 MB 会产生 71 行错误。如果视频已完全下载且未损坏,则不会发现任何错误,也不会向 test.log 打印任何行。


编辑

在我上面给出的例子中,我测试了整个文件,因为我下载的测试视频是一个洪流,整个文件中可能缺少块。

添加-sseof -60到参数列表将检查文件的最后 60 秒,这要快得多。

ffmpeg -v error -sseof -60 -i FILENAME.mp4 -f null - 2>test.log
Run Code Online (Sandbox Code Playgroud)

您将需要较新版本的 ffmpeg,2.8 缺少 sseof 标志,所以我使用了 3.0。


小智 8

MediaInfo显示一行:

Truncated: Yes
Run Code Online (Sandbox Code Playgroud)

如果文件没有按照格式规范的预期完成。

由于错误的文件(不符合文件边界的规范)和部分下载的文件在技术上没有区别,因此在技术上不可能区分有问题的文件和部分下载的文件。

可以完成另一个(高级)测试,例如读取 .mp4 文件的索引并检查最后一帧的文件偏移量 + 帧大小是否在您获得的文件的文件大小范围内,但这并不完全符合您的要求for(如果源文件中有元数据,例如海报,在文件末尾,并且文件在此海报之前被截断,则在每种情况下仍未检测到部分下载)。它未在 MediaInfo 中实现,但您可以添加MediaInfo 功能请求

在所有情况下,检测所有部分下载是非常困难的,因为大多数视频文件格式中都没有显示总文件大小,因此您可以确定文件被截断,但不能确定文件没有被截断。确保您下载完整文件的唯一方法是从其他地方获取文件大小(更好:拥有其哈希值,例如 MD5)。

PS:这个问题并不特定于任何操作系统。

  • 非常感谢您的回答。为了一次检查多个文件,我使用了以下命令:`mediainfo * | grep -E "^(IsTruncated|Complete name)"` 其中相应文件的文件名直接显示在 "IsTruncated: Yes" 行上方。 (2认同)

Jan*_*rdt 5

我有一个文件,其中带有 -sseof -60 的 ffmpeg (v3.1.1) 没有显示任何警告,只是退出而没有任何迹象表明出现问题。Mediainfo 也没有显示文件被截断。只有省略 -sseof -60 才会报告 ffmpeg 的任何错误。所以我回去尝试ffprobe。它似乎比 ffmpeg 略快。

ffprobe -v error -count_frames -i filename.mp4
Run Code Online (Sandbox Code Playgroud)

产生了这个输出

[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
Run Code Online (Sandbox Code Playgroud)

我还没有遇到任何误报(如 OP 所报告的那样)。

编辑:ffprobe 在我的测试文件中比 ffmpeg 快 10%,但前提是您指示它使用带有选项“-threads 0”的所有内核。否则它只使用一个核心/线程并且速度较慢。

  • @Braiam它确实回答了这个问题,因为完整下载的文件不会产生输出,而不完整的文件则会产生输出。 (2认同)