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


10

我有一堆视频,我想检查它们是否完整。其中一些可能会被部分下载,但它们并不存在问题。如何有效检查这些视频是否已完全下载?

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

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


您是否在谈论当前正在下载的文件,即正在下载文件的程序在接收更多数据时仍在写入文件?还是在谈论过去某个时候中止下载的文件?
吉尔斯(Gilles)'所以

@Gilles过去已下载,现在其中一些文件不完整。我想查找不完整的视频文件,以便可以手动找到链接并继续下载。
2016年

@ Ho1我的答案满足您的问题吗?
J363

@ J363感谢您的回答。你能回应我的评论吗?
2016年

Answers:


11

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

ffmpeg -v error -i FILENAME.mp4 -f null - 2>test.log

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


编辑

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

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

ffmpeg -v error -sseof -60 -i FILENAME.mp4 -f null - 2>test.log

您需要更新版本的ffmpeg,2.8缺少sseof标志,因此我使用3.0。


1
这可以通过某种方式进行,但是需要处理所有视频。作为一种替代方法,我发现在VLC中打开视频,在末尾附近的某个位置单击会花费较少的时间,并且更加实用。可以在中定义类似的东西ffmpeg吗?我的意思是寻求在不处理所有视频的情况下达到99%,并检查视频是否正常运行且没有错误。
2016年

@ Ho1请参阅更新的命令。
J363

1
我很肯定该命令有效,因为在使用-sseof标志和不使用-sseof标志的情况下,我对其进行了多次测试。原始命令检查整个文件,这是建议的行为。您请求的修改后的命令会断言一个假设,即文件末尾的数据丢失到命令中,事实并非如此。我的测试文件是使用torrent客户端下载的137MB mp4的99.9%。当我使用-sseof标志并逐渐增加它向后看的时间时,最终我得到的输出完全相同,就像我运行了搜索整个文件的命令一样。
J363

1
使用-ss-sseof,ffmpeg会读取并处理整个文件。因此,无论如何,在VLC中打开视频并在视频末尾附近单击会更快。
2016年

1
您是对的,但我正在通过http下载。
2016年

7

MediaInfo显示一行:

Truncated: Yes

如果文件不符合格式规范的要求。

由于错误地混合了文件(不满足有关文件边界的规范)和部分下载的文件之间在技术上没有区别,因此从技术上不可能在有缺陷的文件和部分下载的文件之间进行区别。

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

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

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


感谢您的回答。我不想要确切的答案,一个大概的答案对我来说就足够了。您认为这个问题应该移到superuser.com吗?
2016年

即使使用-f(完整的信息显示)mediainfo版本v0.7.83,也无法获得此类字段。您能帮忙上Truncated田吗?
2016年

只需删除文件中的1个字节,就应该显示此“截断的”字段(不需要-f,默认输出就足够了)。仅供参考,它适用于当今最常用的格式:MP4 / MOV,Matroska,MXF。您是否正在使用其他格式进行测试?
杰罗姆马丁内斯

2
非常感谢您的回答。为了一次检查许多文件,我使用了以下方法:mediainfo * | grep -E "^(IsTruncated|Complete name)"相应文件的文件名直接显示在“ IsTruncated:Yes”行的上方。
0x01

4

我有一个文件,其中带有-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”选项的内核。否则,它仅使用一个内核/线程,并且速度较慢。


这不能为问题提供答案。一旦您拥有足够的声誉,您就可以在任何帖子中发表评论;相反,请提供不需要问询者澄清的答案。- 来自评论
Braiam '16

@Braiam它确实回答了这个问题,因为完整下载的文件将不产生任何输出,而文件不完整。
2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.