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

**URL:** <https://meta.appinn.net/t/topic/62562>\
**Category:** 问题求助\
**Created:** [2024 年10 月 30 日 17:08 UTC](https://meta.appinn.net/t/topic/62562 "2024-10-30T17:08:18Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

作者： ![LaotieDoubleclick666](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/laotiedoubleclick666/32/57579_2.png) [@LaotieDoubleclick666](https://meta.appinn.net/u/LaotieDoubleclick666)\
发布日期： [2024 年10 月 30 日 17:08 UTC](https://meta.appinn.net/t/topic/62562/1 "2024-10-30T17:08:18Z")

</div>

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

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

---

<div class="post-metadata">

作者： ![nullptr](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/nullptr/32/56211_2.png) [@nullptr](https://meta.appinn.net/u/nullptr)\
发布日期： [2024 年10 月 30 日 21:43 UTC](https://meta.appinn.net/t/topic/62562/2 "2024-10-30T21:43:38Z")

</div>

配置好 [ffmpeg](https://www.ffmpeg.org/) 之后可以试试用以下 PowerShell 命令依次检查

```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

---

<div class="post-metadata">

作者： ![Niceb](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/niceb/32/4721_2.png) [@Niceb](https://meta.appinn.net/u/Niceb)\
发布日期： [2024 年10 月 31 日 01:01 UTC](https://meta.appinn.net/t/topic/62562/3 "2024-10-31T01:01:29Z")

</div>

md5验证一下？

---

<div class="post-metadata">

作者： ![Fiend\_FEARing](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/fiend_fearing/32/47535_2.png) [@Fiend\_FEARing](https://meta.appinn.net/u/Fiend_FEARing)\
发布日期： [2024 年10 月 31 日 01:55 UTC](https://meta.appinn.net/t/topic/62562/4 "2024-10-31T01:55:34Z")

</div>

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

```auto
@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

```

---

<div class="post-metadata">

作者： ![LaotieDoubleclick666](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/laotiedoubleclick666/32/57579_2.png) [@LaotieDoubleclick666](https://meta.appinn.net/u/LaotieDoubleclick666)\
发布日期： [2024 年10 月 31 日 08:33 UTC](https://meta.appinn.net/t/topic/62562/5 "2024-10-31T08:33:43Z")

</div>

这个确实是可以的，

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

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

---

<div class="post-metadata">

作者： ![LaotieDoubleclick666](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/laotiedoubleclick666/32/57579_2.png) [@LaotieDoubleclick666](https://meta.appinn.net/u/LaotieDoubleclick666)\
发布日期： [2024 年10 月 31 日 08:34 UTC](https://meta.appinn.net/t/topic/62562/6 "2024-10-31T08:34:24Z")

</div>

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

---

<div class="post-metadata">

作者： ![TecNico](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/tecnico/32/78882_2.png) [@TecNico](https://meta.appinn.net/u/TecNico)\
发布日期： [2024 年10 月 31 日 09:26 UTC](https://meta.appinn.net/t/topic/62562/7 "2024-10-31T09:26:26Z")

</div>

> [@LaotieDoubleclick666](#):
>
> 一般需求只是需要播放起来没大问题就可以了，坏几帧可以忍受，丢一大段可能受不了

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