我正在拼命寻找一种方便的方法来检查特定目录中包含文件夹的.mp4文件的完整性。 .mp4文件和文件夹的名称都包含空格,特殊字符和数字。
我已经找到了一个正确的ffmpeg命令来快速识别从here获取的损坏的.mp4文件:
ffmpeg -v error -i filename.mp4 -map 0:1 -f null - 2>error.log
如果创建的error.log包含一些条目,那么该文件显然已损坏。相反的是一个空的error.log。
下一步是将此命令应用于文件夹及其子文件夹中的每个.mp4文件。一些指南,如here和here,确实描述了如何递归应用ffmpeg命令,但我的编码技巧有限,因此我无法找到一种方法来组合这些命令来获取以下内容:
使用上述ffmpeg命令测试文件夹内的所有.mp4文件的方法(递归),该命令应该创建.log文件,仅当视频文件确实包含错误时(读取有一些内容)并且应该继承名称损坏的文件,以了解哪个文件已损坏。
使用Ubuntu Gnome 15.10。
答案 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应用
答案 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
这将仅列出错误后跟缩进的文件名的错误文件。