批量检查视频文件的完整性

拷贝和下载的视频偶尔会有损坏的情况,发现之后往往已经来不及了

有没有办法批量检测视频,寻找可能在播放中发生严重错误的情况?

配置好 ffmpeg 之后可以试试用以下 PowerShell 命令依次检查

# cd <path-to-videos> # <path-to-videos> 替换成视频所在的文件夹
Get-ChildItem . -File | ForEach-Object { Write-Host "Checking $_"; ffmpeg -hide_banner -loglevel error -i $_.Name -f null -codec copy - }

PS. 可以在存放视频的文件夹用 Shift + 右键打开 PowerShell

3 个赞

md5验证一下?

1 个赞

简单写了个批处理,暂时是通过把你要检测的文件放文件夹里拖到批处理文件上。但这种检测比较简单,速度快但是有一些错误无法被发现。被中途截断的文件检测应该没问题。
*会使用winget下载ffmpeg,如果不再使用可以winget uninstall ffmpeg卸载。

@echo off
setlocal enabledelayedexpansion
title 视频完整性检测
set "target_folder=!cmdcmdline:~0,-1!"
set "target_folder=!target_folder:*" =!"
echo 正在检测 FFmpeg 是否已安装...
ffprobe -version > nul 2>&1
if errorlevel 1 (
  echo FFmpeg 未安装,正在尝试使用 winget 安装...
  winget install ffmpeg
  if errorlevel 1 (
    echo winget 安装 FFmpeg 失败!
    echo 请手动安装 FFmpeg 或检查网络连接。
    pause
    exit /b 1
  )
)
echo FFmpeg 已安装,开始检测 "%target_folder%" 目录下的视频文件完整性...
cls
set count=0
set fail_count=0
set fail_list=
for %%a in ("%target_folder%\*.mp4" "%target_folder%\*.avi" "%target_folder%\*.mkv" "%target_folder%\*.mov" "%target_folder%\*.wmv") do (
  set /a count+=1
  ffprobe -v error -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 "%%a" > nul 2>&1
  if errorlevel 1 (
    set /a fail_count+=1
    set fail_list=!fail_list!%%a
    echo 失败 ········ %%a
  ) else (
    echo 成功 ········ %%a
  )
)
echo.
if %count% == 0 (
  echo 请将需要检测的文件夹拖入到本批处理文件上。
) else (
  echo 共检测 %count% 个文件,其中 %fail_count% 个失败。
)
echo.
pause
2 个赞

这个确实是可以的,

只是不是太好操作,有些视频可能原版就是有问题的

一般需求只是需要播放起来没大问题就可以了,坏几帧可以忍受,丢一大段可能受不了

谢谢,原来ffmpeg还可以这么用,学习了

这样的话应该必须实际decode才能知道有没有问题了。

1 个赞