2010-01-25 12:54:46 +0000 2010-01-25 12:54:46 +0000
130
130

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

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

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

所以,我很感兴趣,……在不使用任何下载手段(下载管理器和类似工具)来确保文件完全下载的情况下,如何验证视频文件是否被完整下载,以及它是否完整?

答案 (7)

137
137
137
2010-01-25 13:05:22 +0000

你可以使用ffmpeg视频转换器中的一个功能:如果你将指定它将视频重新编码为无,它将只是读取输入文件并报告任何会出现的错误。这是一个非常快的过程,因为视频帧只是被读取,检查和默默地放弃。

命令行示例。(对于Linux)

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

-v error 表示一定的语速级别 (显示一些通常被隐藏的错误,因为它们对可玩性影响不大).

你会得到一个完整的错误日志,里面有一些关于ffmpeg会输出的文件的通用信息,所以这可能需要你注意,通过写过滤器可以对类似的文件进行批量检查。

FFmpeg也可用于Windows【这里】(http://ffmpeg.zeranoe.com/builds/)。除了stderr重定向之外,命令行几乎是一样的:

ffmpeg.exe -v error -i file.avi -f null - >error.log 2>&1
```。
14
14
14
2011-09-22 17:05:59 +0000

我很喜欢使用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
1
1
2017-08-15 14:13:33 +0000

对于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'。

Samples: checkvideo.batcheckvideo.bat *.avi

设置:从这里下载FFmpeg for Windows。https://ffmpeg.zeranoe.com/builds/ 然后解压它们 在bat文件中更改`C:\ffmpeg\bin对于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'。

Samples: checkvideo.batcheckvideo.bat *.avi

设置:从这里下载FFmpeg for Windows。[https://ffmpeg.zeranoe.com/builds/ ]0x3& 然后解压它们 在bat文件中更改解压ffmpeg的路径 把checkvideo.bat放在路径中的一个文件夹中,或者把他的文件夹添加到路径环境变量中。

0
0
0
2020-01-12 11:14:29 +0000

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-corrupted-webm-video-using-node-js-and-fluent-ffmpeg

0
0
0
2019-11-12 09:31:47 +0000

简单版本

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

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

error.log 将包含错误。

0
0
0
2010-01-25 13:13:15 +0000

MediaInfo是一个很好的工具,可以让你获得任何视频文件的信息。这也许能突出显示你想要的信息。

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

试着给每一个已知好的和已知坏的文件,然后比较结果。

我曾经使用过GSpot,直到它停止更新,然后换成了MediaInfo。

0
0
0
2018-04-11 12:16:24 +0000

另一个答案使用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。这种方法可能会产生错误的结果,因为有时即使是损坏的文件也能生成缩略图。例如,如果视频文件只在最后才损坏,这种方法就会失败。