如何查找未使用特定编解码器编码的媒体文件?

我想在特定的video编解码器(例如x265高效video编解码器)上标准化我的video集。 我知道我可以使用例如’mediainfo filename |从单个文件中获取正在使用的编解码器 grep“Codec ID”’将输出video编解码器,然后输出每个文件的音频编解码器,如:

Codec ID : V_VP8 Codec ID : A_VORBIS 

我已经评论过man find但我似乎无法弄清楚如何实现这个目标。 有任何想法吗?

您可以在工作目录下获取编解码器特定媒体文件的排序列表

$ mediainfo * | grep -v codec_id | grep .file_extension | cut -f2 -d:> list.txt

其中codec_id是有问题的编解码器(例如h264), file_extension是有问题的容器的扩展名(例如.mkv)

但如果文件名在名称之间有空格,则命令将无法按预期工作。

你可以使用这个小的python脚本和find来打印具有特定编解码器的所有文件:

filterByCodec.py

 import os import sys import json inputPath = sys.argv[1] codec = sys.argv[2] type = sys.argv[3] cmd = 'ffprobe -v quiet -show_streams -print_format json ' + inputPath output = os.popen(cmd).read() output = json.loads(output) if not 'streams' in output: sys.exit(0) for stream in output['streams']: if stream['codec_name'] == codec and stream['codec_type'] == type: print inputPath sys.exit(0) 

这将调用ffprobe ,将其输出存储在json字符串中,迭代所有流并打印输入路径,以防编解码器名称和类型匹配。 你需要ffprobe这个。 如果您没有在系统上安装它,可以从此处获取静态构建。

然后你可以使用find这样在每个文件上调用它:

 find . -type f -exec python filterByCodec.py {} hevc video \; 

这将打印包含HEVCvideo编解码器的所有video。 更多例子:

 find . -type f -exec python filterByCodec.py {} h264 video \; find . -type f -exec python filterByCodec.py {} mp3 audio \; 

您可以扩展脚本并将这些文件移动到某个目录或其他任何目录中。 这看起来像这样:

 cmd = 'mv ' + inputPath + ' onlyhevcDir' os.system(cmd) 

我知道这不是最好的方法,但使用python它很简单。

findffprobejq实用程序的组合可用于打印有关所有*.avi*.mp4文件(在递归的当前目录树中)的信息,这些文件不是使用"h264"video编解码器编码的:

 $ find -name \*.avi -o -name \*.mp4 \ -exec ffprobe -v quiet -show_streams -show_format -of json {} \; | jq -c '.format.filename as $path | .streams[]? | select(.codec_type=="video" and .codec_name!="h264") | {codec: .codec_name, path: $path}' 

要安装实用程序,请运行:

 $ sudo apt-get install ffmpeg jq findutils 

该示例适用于jq 1.4 。 如果apt-get版本提供旧版本; 你可以下载一个更新的jq二进制文件(只需将下载的文件放在$PATH ,将其重命名为jq并使其可执行: chmod +x jq ) 。