如何检查视频文件的完整性(avi,mpeg,mp4 ......)?


108

这个标题可能有些误导,所以让我解释一下......

我正在下载一个视频文件... mpeg,avi - 是一种流行的格式。现在,如果我正在下载它,并且下载中断了uhm ......下载,那么,例如,Windows Media Player会发出一些错误并拒绝播放它(尽管文件是,比方说, 98%完成)。但是,像KMPlayer或MediaPlayer Classic这样的玩家会在那之前播放它(事实上,他们也可以在下载时播放它)。

所以,我很感兴趣,...没有使用任何下载方式(下载管理器和类似的)来保护文件是完全下载的,如何验证视频文件是否整个下载,并且它是完整的?


不完整的MPEG应该没有问题。 AVI在文件末尾有快速搜索的索引,有些玩家会使用这些索引,有些则不需要或将会忽略。
bobince

6
Incomplete MPEG should play with no problems. @bobince,问题是/是如何检查腐败,而不是如何播放不完整的文件。即使格式支持播放不完整的文件,如果文件不符合格式规范,仍应检查是否存在损坏。例如,您仍然可以读取不完整的纯文本文件,但您仍然可以检测文件是否存在问题,例如它是否在句子中间结束,或者中间是否有一大堆明显丢失的信息。
Synetech

Answers:


113

您可以使用功能 ffmpeg 视频转换器:如果您将其指定为将视频重新编码为空,则只会读取输入文件并报告将出现的任何错误。这是一个非常快速的过程,因为视频帧只是被读取,检查和静默删除。

示例命令行:(对于Linux)

ffmpeg -v error -i file.avi -f null - 2>error.log

-v error 意味着一定的 冗长程度 (显示一些通常隐藏的错误,因为它们不会影响可玩性)。

您将获得一个完整的错误日志,其中包含有关文件ffmpeg的一些通用信息将输出,因此这可能需要您注意,通过过滤器可以编写以执行类似文件的批量检查。

FFmpeg也可用于Windows 这里 。命令行几乎与stderr重定向的例外相同:

ffmpeg.exe -v error -i file.avi -f null - >error.log 2>&1

5
速度与转换速度相同。
Somebody

7
另一种选择是 ffprobe 与包装一起提供 ffmpeg。它不进行任何转换,只是从文件中读取元数据信息。因此,它将检测元数据中的错误,但不会在文件本身中发现任何问题。个人使用 ffprobe 在进一步处理之前快速验证上传
mente

1
不幸的是,只要看电影就好了,但似乎有效
MattPark

2
如果,正如OP所说的那样,“在下载中断下载中断......下载”,很有可能 所有 流将被中断,因此您可以通过限制解码来检测此错误 只有一个音轨 (使用 -map ),这将显着加快操作: ffmpeg -v error -i in.mkv -map 0:1 -f null … 如果出现错误,它将记录字节位置,您可以使用该位置来截断文件(早先安装一兆字节或两兆字节)然后继续下载。
Lumi

3
我花了大约4 1/2分钟来测试一个1GB 1小时长的.mkv文件,在一个老式的六核处理器上。在测试期间,所有核心都达到了最大值。我十六进制编辑了该文件的副本,并添加了一些00块以模拟损坏。错误日志正确报告了错误。没有错误的文件返回一个空的error.log
TripleAntigen

8

我喜欢使用的想法 ffmpeg -f null 上面,但我实际上想要自动化使用该输出的过程。特别是,我的音乐视频集合的常见情况是我有几个具有相同分辨率的剪辑,我想对这些文件进行差异验证,以删除最多的文件。

不幸的是,ffmpeg到目前为止还没有办法禁用它的交互模式,这种模式会在这种情况下输出噪音。我最终破解了简单的包装脚本来进行过滤:

#!/usr/bin/env python
import sys
import os
import re

t = os.popen('ffmpeg -v 5 -i "%s" -f null - 2>&1' % sys.argv[1]).read()
t = re.sub(r"frame=.+?\r", "", t)
t = re.sub(r"\[(.+?) @ 0x.+?\]", "[\\1]", t)
print t

示例输出:

[mpeg1video]ac-tex damaged at 21 17
[mpeg1video]Warning MVs not available
[mpeg1video]concealing 22 DC, 22 AC, 22 MV errors
[mpeg1video]Warning MVs not available
[mpeg1video]concealing 22 DC, 22 AC, 22 MV errors
[mpeg1video]ac-tex damaged at 13 9

1
如果你做它,以便用好的零件替换破损的零件,那就更好了
akostadinov

我使用这个收到错误:
Akshit Rewari

2
回溯(最近一次调用最后一次):文件“F:\ filecheck.py”,第6行,在< module>中t = os.popen('ffmpeg -v 5 -i“%s”-f null - 2>& 1'%sys.argv [1])。read()IndexError:列表索引超出范围
Akshit Rewari

1

使用其他答案的问题 ffmpeg 重新编码 null 格式是需要很长时间。特别是,如果要检查目录中的多个文件。

一种快速方法是为所有视频生成缩略图,并查看缩略图生成失败的位置。

find . -iname "*.mp4" | while read -r line; do 
  line=`echo "$line" | sed -r 's/^\W+//g'`; 
  echo 'HERE IT IS ==>' "$line"; 
  if ffmpeg -i "$line" -t 2 -r 0.5 %d.jpg; 
    then echo "DONE for" "$line"; 
  else echo "FAILED for" "$line" >>error.log; 
  fi; 
done;

事实证明这种方法比其他方法更快。

但是,有一个CAVEAT。此方法可能会产生错误的结果,因为有时甚至可以为损坏的文件生成缩略图。例如。如果视频文件仅在最后被破坏,则此方法将失败。


0

媒体信息 是一个很好的工具,可以获取您关注的任何视频文件的信息。这可能会突出显示您想要的信息。

另一个工具是 G点 但它自2007年以来一直没有更新。

尝试给每个人一个已知的好的和已知的坏文件并比较结果。

我曾经使用GSpot直到它停止更新,然后切换到MediaInfo


1
我的机器上有一些旧版本的GSpot ......但它是一个完全不同的工具(确定代码/解码......)。它与此无关。我会查看mediainfo。
Rook

GSpot将报告文件大小或帧数是否与索引的预期值不匹配(左侧的某个地方,自从我使用它以来已经有一段时间了!),后来的版本也添加了很多功能。
Shevek

媒体信息 可以递归扫描目录:从当前文件夹开始,只需运行任何级别的所有文件的报告 mediainfo *
ccpizza

1
mediainfo 显然没有检查完整性。我拿了33 MB webm 视频文件和 truncate 它到了一半。 mediainfo 两者的产量几乎相同,没有明显的腐败迹象。后 truncate 在1 MB的情况下,输出中仍然没有明显的腐败迹象。只有你对输出有了更深入的了解,才会有一些矛盾的信息。但这些部分取决于视频文件的格式,因此您无法自动执行此检测。
Tino

2
mediainfo 除了元数据之外什么都不读。这不会以任何方式检查您的文件的有效性。
DanielSmedegaardBuus

0

对于Windows,您可以使用此bat文件“批量”检查当前文件夹和所有子文件夹上的视频的完整性:

checkvideo.bat

@echo off

set "filtro=%1"
if [%filtro%]==[] (
    set "filtro=*.mp4"
    )

for /R %%a in (%filtro%) do call :doWork "%%a"

    PAUSE
    exit /B

:doWork
    C:\ffmpeg\bin\ffmpeg.exe -v error -i %1 -f null - > "%~1.log" 2>&1

使用:

checkvideo.bat [filter]

如果你不给一个过滤器,将获得'* .mp4'。

样品: checkvideo.bat checkvideo.bat *.avi

建立: 从这里下载FFmpeg for Windows: https://ffmpeg.zeranoe.com/builds/ 并解压缩它们 更改 C:\ffmpeg\bin\ 在bat文件中,你有解压缩ffmpeg的路径 放 checkvideo.bat 在Path中包含的文件夹上或将其文件夹添加到Path环境变量中


胡安·安东尼奥·图比奥 我的回答是让我检查视频的完整性。但是如何读取日志文件并检测视频损坏的时间。记录示例。 [h264 @ 00000173649787c0] qscale diff的cabac解码在64 7 [h264 @ 00000173649787c0]错误时失败,同时解码MB 64 7,字节流38638
J.Duck
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.