如何查找未使用特定编解码器编码的媒体文件?
我想在特定的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它很简单。
find
, ffprobe
, jq
实用程序的组合可用于打印有关所有*.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
) 。