我有一堆视频,我想检查它们是否完整。其中一些可能会被部分下载,但它们并不存在问题。如何有效检查这些视频是否已完全下载?
如果我有链接,我会检查它们的大小,但我没有。
我尝试使用ffprobe
和mediainfo
。ffprobe
报告了部分下载文件的小问题,但是也报告了一些完全下载文件的类似问题。我应该ffmpeg
用来读取整个文件并比较视频的长度以检查是否已下载吗?有更好的解决方案吗?
我有一堆视频,我想检查它们是否完整。其中一些可能会被部分下载,但它们并不存在问题。如何有效检查这些视频是否已完全下载?
如果我有链接,我会检查它们的大小,但我没有。
我尝试使用ffprobe
和mediainfo
。ffprobe
报告了部分下载文件的小问题,但是也报告了一些完全下载文件的类似问题。我应该ffmpeg
用来读取整个文件并比较视频的长度以检查是否已下载吗?有更好的解决方案吗?
Answers:
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。
ffmpeg
吗?我的意思是寻求在不处理所有视频的情况下达到99%,并检查视频是否正常运行且没有错误。
-ss
和-sseof
,ffmpeg会读取并处理整个文件。因此,无论如何,在VLC中打开视频并在视频末尾附近单击会更快。
MediaInfo显示一行:
Truncated: Yes
如果文件不符合格式规范的要求。
由于错误地混合了文件(不满足有关文件边界的规范)和部分下载的文件之间在技术上没有区别,因此从技术上不可能在有缺陷的文件和部分下载的文件之间进行区别。
可以执行另一项(高级)测试,例如,读取.mp4文件的索引,并检查文件偏移量+最后一帧的帧大小是否在您获得的文件的文件大小之内,但这并不完全符合您的期望对于(如果源文件中有海报等元数据,则在文件末尾,并且该文件在此海报之前被截断,在每种情况下仍未检测到部分下载)。MediaInfo中未实现该功能,但您可以添加MediaInfo功能请求。
在所有情况下,检测所有部分下载都是非常困难的,因为大多数视频文件格式中未显示总文件大小,因此可以确保文件被截断,但是不能确定文件未被截断。确保下载完整文件的唯一方法是从其他位置获取文件大小(更好的是:具有其哈希值,例如MD5)。
PS:这个问题并非特定于任何操作系统。
-f
(完整的信息显示)mediainfo版本v0.7.83,也无法获得此类字段。您能帮忙上Truncated
田吗?
mediainfo * | grep -E "^(IsTruncated|Complete name)"
相应文件的文件名直接显示在“ IsTruncated:Yes”行的上方。
我有一个文件,其中带有-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”选项的内核。否则,它仅使用一个内核/线程,并且速度较慢。