Ho1*_*Ho1 12 download ffmpeg video verification
我有一堆视频,我想检查它们是否完整。其中一些可能被部分下载,但它们没有故障。如何有效检查这些视频是否已完全下载?
如果我有链接,我会检查它们的大小,但我没有。
我尝试使用ffprobe和mediainfo。ffprobe报告部分下载文件的小问题,但它也报告一些完全下载文件的类似问题。我是否应该使用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:这个问题并不特定于任何操作系统。
我有一个文件,其中带有 -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”的所有内核。否则它只使用一个核心/线程并且速度较慢。
| 归档时间: |
|
| 查看次数: |
13125 次 |
| 最近记录: |