我正在拼命地寻找一种方便的方法来检查包含文件夹的特定目录中的.mp4文件的完整性。.mp4文件和文件夹的名称都包含空格、特殊字符和数字。
我已经找到了一个正确的ffmpeg命令来快速识别损坏的.mp4文件,该文件摘自here: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 15.10。
发布于 2015-12-04 12:50:09
尝试以下命令:
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'" \;
发布于 2016-10-29 11:22:11
我最近遇到了同样的问题,但我认为有一个简单的黑客可以找出哪些文件被破坏了:
find -name "*.mp4" -exec sh -c "echo '{}' >> errors.log; ffmpeg -v error -i '{}' -map 0:1 -f null - 2>> errors.log" \;
这样,错误就会跟随文件名(和路径)。
发布于 2018-04-11 12:14:23
使用ffmpeg
重新编码到null
格式的其他答案的问题是,它们需要很长的时间。一种快速的方法是为所有视频生成缩略图,并查看缩略图生成失败的地方。
find . -iname "*.mp4" | while read -r line; do
line=`echo "$line" | sed -r 's/^\W+//g'`;
echo 'HERE IT IS ==>' "$line";
if ffmpeg -i "$line" -t 2 -r 0.5 %d.jpg;
then echo "DONE for" "$line";
else echo "FAILED for" "$line" >>error.log;
fi;
done;
事实证明,这种方法比其他方法快得多。
然而,有一个警告。此方法可能产生错误的结果,因为有时甚至对损坏的文件也可能生成缩略图。例如,如果视频文件仅在结束时损坏,则此方法将失败。
https://stackoverflow.com/questions/34077302
复制相似问题