使用ffmpeg快速检查目录中视频文件的完整性

时间:2015-12-03 22:18:04

标签: video ffmpeg

我正在拼命寻找一种方便的方法来检查特定目录中包含文件夹的.mp4文件的完整性。 .mp4文件和文件夹的名称都包含空格,特殊字符和数字。

我已经找到了一个正确的ffmpeg命令来快速识别从here获取的损坏的.mp4文件: ffmpeg -v error -i filename.mp4 -map 0:1 -f null - 2>error.log

如果创建的error.log包含一些条目,那么该文件显然已损坏。相反的是一个空的error.log。

下一步是将此命令应用于文件夹及其子文件夹中的每个.mp4文件。一些指南,如herehere,确实描述了如何递归应用ffmpeg命令,但我的编码技巧有限,因此我无法找到一种方法来组合这些命令来获取以下内容:

使用上述ffmpeg命令测试文件夹内的所有.mp4文件的方法(递归),该命令应该创建.log文件,仅当视频文件确实包含错误时(读取有一些内容)并且应该继承名称损坏的文件,以了解哪个文件已损坏。

使用Ubuntu Gnome 15.10。

5 个答案:

答案 0 :(得分:7)

尝试此命令:

find . -name "*.mp4" -exec ffmpeg -v error -i "{}" -map 0:1 -f null - 2>error.log \;

find命令以递归方式查找当前目录中与给定模式相对应的所有文件:"*.mp4"。在-exec出现您想要为所有文件运行的命令之后。 "{}"替换当前文件的名称,其中引号允许文件名中的空格。该命令必须以\;结束。

编辑:

上面的代码只生成一个日志文件。要为.log文件创建单独的.mp4个文件,每个文件都带有名称,您可以再次使用{}符号:

find . -name "*.mp4" -exec sh -c "ffmpeg -v error -i {} -map 0:1 -f null - 2>{}.log" \;

答案 1 :(得分:6)

我最近遇到了同样的问题,但我认为有一个简单的黑客可以找出哪些文件被破坏了:

find -name "*.mp4" -exec sh -c "echo '{}' >> errors.log; ffmpeg -v error -i '{}' -map 0:1 -f null - 2>> errors.log" \;

这种错误遵循文件名(和路径)。

答案 2 :(得分:0)

使用Sub DeleteVisibleRows() Dim ws1 As Worksheet Dim WorkRng As Range Set ws1 = ActiveWorkbook.Sheets("Consolidated") On Error Resume Next Set WorkRng = Application.Selection Application.ScreenUpdating = False With ws1 WorkRng.Offset(1, 0).Rows.SpecialCells(xlCellTypeVisible).EntireRow.Delete ws1.AutoFilterMode = False End With Application.ScreenUpdating = True End Sub 重新编码为ffmpeg格式的其他答案的问题是它们需要很长时间。一种快速方法是为所有视频生成缩略图,并查看缩略图生成失败的位置。

null

这种方法比其他方法更快。

然而,有一个CAVEAT。此方法可能会产生错误的结果,因为有时甚至可以为损坏的文件生成缩略图。例如。如果视频文件仅在最后被破坏,则此方法将失败。

答案 3 :(得分:0)

我将主要留给我本人,也许还有其他想要使用ffmpeg在多个文件夹中批量查找包含错误或损坏文件的视频,创建子文件夹并将文件移动到该子文件夹中的人。

这是我的bash脚本,用于递归查找有错误的mp4文件并将其移动到00errors文件夹中。

#!/bin/bash

ROOTPATH="/mnt/f/00test/" # manually define root  path to your folder that has subfolders
for subdir in *; do
  cd ${ROOTPATH}${subdir} 
  mkdir 00errors
  
  for path in *.mp4; do

    ffmpeg error -i "${path}"
    RC=$?

    if [ "${RC}" -ne "0" ]; then
        # Do something to handle the error.
        mv ${path} ./00errors
    fi

  done
  cd ../
done

编辑:

同时,我找到了用于HandBrake和FFmpeg / FFprobe(Windows,macOS,Linux和Docker)的HBBatchBeast应用

https://github.com/HaveAGitGat/HBBatchBeast

答案 4 :(得分:0)

Windows 系统的批处理文件,假设 ffmpeg 位于您的路径中:

@echo off
for /r %%f in (*.mp4) do (
    ffmpeg -hide_banner -v error -i "%%f" -map 0:1 -f null - 2>out.txt
    if errorlevel 1 (
        type out.txt
        echo   %%f
    )
)
if exist out.txt del out.txt 1>nul 2>nul
pause

这将仅列出错误后跟缩进的文件名的错误文件。