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

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

所以,我很感兴趣,...,而无需使用任何下载方式(下载管理器等)来确保文件已完全下载,如何验证视频文件是否完整下载以及是否完整?

评论

不完整的MPEG应该没有问题。 AVI在文件末尾具有用于快速查找的索引,一些播放器将使用这些索引,有些则不需要或将忽略它们。

不完整的MPEG应该没有问题。 @bobince,问题是/如何检查损坏,而不是如何播放不完整的文件。即使一种格式支持播放不完整的文件,如果文件不符合格式规范,仍然应该可以检查是否损坏。例如,您仍然可以读取不完整的纯文本文件,但是仍然可以检测文件是否有问题,例如它以句子结尾结尾还是中间明显缺少信息块。 >

#1 楼

您可以在ffmpeg视频转换器中使用一项功能:如果将其指定为将视频重新编码为空,它将仅读取输入文件并报告将出现的任何错误。这是一个非常快速的过程,因为只是读取,检查和静默删除了视频帧。
示例命令行:(对于Linux)
ffmpeg -v error -i file.avi -f null - 2>error.log

-v error表示一定程度的冗长(显示一些错误,这些错误通常是隐藏的,因为它们对可玩性的影响不大。)
您将获得完整的错误日志,其中将输出有关文件ffmpeg的一些通用信息,因此可能需要引起您的注意,可以通过编写过滤器进行操作执行类似文件的批处理检查。
FFmpeg也可用于Windows。除了stderr redirect之外,命令行几乎相同:
ffmpeg.exe -v error -i file.avi -f null - >error.log 2>&1


评论


速度与转换速度相同。

–有人
13 Mar 26 '13 at 0:17

另一个选择是ffprobe附带的ffprobe。它不执行任何转换,而只是从文件中读取元数据信息。因此,它将检测元数据中的错误,但不会在文件本身中发现任何问题。亲自使用ffprobe快速验证上传的内容,然后再进行进一步处理

– mente
13-10-1在7:41



不幸的是,看电影的时间似乎很长,但是看起来确实可行

–马特公园
15年3月28日在3:27

如OP所述,如果“下载在uhm ...下载的中间中断”,则很可能所有流都将中断,因此您可以通过将解码限制为仅一个音轨来检测此错误(使用-map ),这将大大加快操作速度:ffmpeg -v错误-i in.mkv -map 0:1 -f null…如果发生错误,它将记录字节位置,可用于截断文件( (至少一到两兆字节是安全的),然后继续下载。

–卢米
15-10-25在10:49



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

– TripleAntigen
17 Sep 14'0:08



#2 楼

我喜欢上面使用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


评论


如果您做到这一点,以便用好的零件替代损坏的零件,那会更好

–akostadinov
17年1月9日在9:18

我在使用时遇到错误:

– Akshit Rewari
17年7月16日在14:54

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

– Akshit Rewari
17年7月16日在14:54

列表索引超出范围表示在命令行中未提供文件名。因此正确的用法是script.py filename.mp4或python script.py filename.mp4。

–Anaksunaman
20年1月17日在20:10

#3 楼

对于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
设置:
从此处下载适用于Windows的FFmpeg:https: //ffffeg.zeranoe.com/builds/并将其解压缩
在bat文件中更改C:\ffmpeg\bin\的路径,将ffmpeg解压缩到的路径
checkvideo.bat放在Path包含的文件夹中或将其文件夹添加到Path环境变量
更新:自2020年9月18日起,以上链接不再有效,因此Windows用户可以在此处或此处下载FFmpeg表格

评论


Juan AntonioTubío的答案正在帮助我检查视频的完整性。但是如何读取日志文件并检测视频损坏的时间。日志示例。 [h264 @ 00000173649787c0] qscale diff的cabac解码在64 7时失败[h264 @ 00000173649787c0]在解码MB 64 7,字节流38638时出错

–J.Duck
18年3月20日在14:36

#4 楼

使用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。这种方法可能会产生错误的结果,因为有时即使损坏的文件也可能生成缩略图。例如。如果视频文件仅在最后损坏,则此方法将失败。

评论


在当今的多处理器计算机上,您可以并行检查多个视频。 make的-j标志将帮助...

– Mikhail T.
20年6月13日在22:00

#5 楼

版本更简单

for file in *.mp4; do ffmpeg -v error -i "$file" -f null - >error.log 2>&1; print "$file"; done


这将在处理文件时打印文件名。

error.log将包含错误。

评论


使用make从%.mp4创建%.log。然后,您可以轻松地使用make的-j开关并行运行多个检查作业。

– Mikhail T.
20年6月13日在22:03

#6 楼

MediaInfo是获取有关您要扔给它的任何视频文件的信息的好工具。这也许可以突出显示您想要的信息。

另一个工具是GSpot,但是自2007年以来就没有进行过更新。

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

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

评论


我的机器上装有GSpot的旧版本...但是它是用于完全不同的工具(确定代码/解码...)。这与此无关。我将检查mediainfo。

–浏览
2010-1-25在13:18

GSpot将报告文件大小或帧数是否与索引中的预期值不符(在左侧某处,因为我使用它已经有一段时间了!),并且更高版本也添加了许多功能。

– Shevek
2010-1-25 14:45



mediainfo可以递归扫描目录:要获取从当前文件夹开始的任何级别的所有文件的报告,只需运行mediainfo *。

–ccpizza
16年6月12日在22:00



mediainfo显然不检查完整性。我拍摄了一个33 MB的webm视频文件,并将其截断为一半。 mediainfo的输出仍然几乎相同,没有明显的腐败迹象。截断为1 MB后,输出中仍然没有明显损坏的迹象。仅当您对输出进行更深入的了解时,才会有一些矛盾的信息。但是这些部分取决于视频文件的格式,因此您无法自动执行此检测。

– Tino
16 Dec 19 '23:54



mediainfo只读取元数据。这将不会以任何方式检查文件的有效性。

–DanielSmedegaardBuus
17年12月8日在14:13

#7 楼

fluent-ffmpeg

var ffmpeg = require('fluent-ffmpeg');
var ff = new ffmpeg();

ff.on('start', function(commandLine) {
  // on start, you can verify the command line to be used
})
.on('progress', function(data) {
  // do something with progress data if you like
})
.on('end', function() {
  // do something when complete
})
.on('error', function(err, stdout, stderr) {
  // handle error conditions
  console.log('Error: ' + err.message)
  console.log('ffmpeg output:\n' + stdout)
  console.log('ffmpeg stderr:\n' + stderr)
})
.addInput('path\to\file')
.addInputOption('-xerror')
.addInputOption('-v error')
.output('-')
.outputOptions('-f null')
.run();


参考:

https://stackoverflow.com/questions/43349360/how-to-check-for-损坏的Webm视频使用节点js和流利的ffmpeg