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

Roo*_*ook 156 avi mpeg verification

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

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

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

whi*_*ark 182

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

示例命令行:(适用于 Linux)

ffmpeg -v error -i file.avi -f null - 2>error.log
Run Code Online (Sandbox Code Playgroud)

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

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

FFmpeg 也可在此处用于 Windows 。除了 stderr 重定向外,命令行几乎相同:

ffmpeg.exe -v error -i file.avi -f null - >error.log 2>&1
Run Code Online (Sandbox Code Playgroud)

  • 另一种选择是`ffprobe`,它与`ffmpeg` 一起打包。它不做任何转换,只是从文件中读取元数据信息。因此,它会检测元数据中的错误,但不会在文件本身中发现任何问题。个人使用`ffprobe`在进一步处理之前对上传进行快速验证 (10认同)
  • 在旧式十六进制核心处理器上测试 1GB 1 小时长的 .mkv 文件可能需要 4 1/2 分钟。在测试过程中,所有内核都达到了最大值。我对文件的副本进行了十六进制编辑,并添加了一些 00 块来模拟损坏。错误日志正确报告了错误。没有错误的文件返回空的 error.log (10认同)
  • 与转换的速度相同。 (7认同)
  • “与转换的速度相同。”我可以确认这一点。但是,通过添加 `-c copy` 禁用转码可以解决问题:`ffmpeg -v error -i file.avi -c copy -f null -` (6认同)
  • 如果,如 OP 所述,“下载在 uhm 中间中断......下载”,则很可能*所有*流将被中断,因此您可以通过将解码限制为*仅一个音轨*来检测此错误(使用`-map`),这将显着加快操作:`ffmpeg -v error -i in.mkv -map 0:1 -f null ...` 如果有错误,它会记录字节位置,其中您可以使用 来截断文件(为安全起见,提前一两个兆字节)然后继续下载。 (4认同)
  • 不幸的是,似乎与观看电影一样长,但似乎有效 (2认同)
  • 结尾被截断的文件的示例错误:“[mov,mp4,m4a,3gp,3g2,mj2 @ 0x161a180] moovatom not find video-head.mp4: Invalid data found whileprocessing input” (2认同)
  • 在无错误的半小时 .mp4 中,这对我来说在半分钟内完成。也许差异是由于多年的进步,但评论中的“似乎和看电影一样长”似乎不再成立。 (2认同)

pfa*_*con 15

我喜欢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
Run Code Online (Sandbox Code Playgroud)

示例输出:

[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
Run Code Online (Sandbox Code Playgroud)

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

Jua*_*bío 7

对于 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
    
Run Code Online (Sandbox Code Playgroud)

用:

checkvideo.bat [filter]

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

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

设置: 从这里下载适用于 Windows 的 FFmpeg:https : //ffmpeg.zeranoe.com/builds/并解压它们 更改C:\ffmpeg\bin\bat 文件中您解压 ffmpegcheckvideo.bat的路径的路径 放入路径中包含的文件夹或将他的文件夹添加到路径环境变量

更新:截至 2020 年 9 月 18 日,上述链接不再有效,因此 Windows 用户可以在此处此处下载 FFmpeg 表单