我有这个代码:
track1=$(mkvmerge -I sample.mkv | sed -ne '/^Track ID [0-9]*: audio ([^)]*).* language:eng.*/ { s/^[^0-9]*\([0-9]*\):.*/\1/;H }; $ { g;s/[^0-9]/,/g;s/^,//;p }' | cut -c1)
它将检索匹配语言英语的 1 首曲目。
我想制作一个脚本来比较相同语言的音轨,并找到质量最高的音轨。
但是mkvinfo
,mkvmerge
并且mediainfo
似乎无法检索有关给定轨道 ID 的信息,而且我不知道如何解析它们的完整输出以仅检索我需要的内容。
这个怎么做?我需要检索猜测质量可能需要的所有内容,例如格式、比特率、通道数、大小,并将其存储在track1channels
.
我对解决这个难题的其他解决方案持开放态度。
可能有许多不同的方法可以做到这一点,具体取决于您要使用什么工具来解析输出。一种方法是
mkvmerge
生成 JSON,然后使用jq
. 例如,要获取所有音轨:您可以在 中指定各种标准
jq
,例如.id=="2"
轨道 2 等。也许您甚至可以使用 进行比较/排序jq
,具体取决于您想要做什么,请参阅man jq
详细信息。您还可以将一些过滤后的输出存储
jq
在 shell 变量中,并使用多次jq
调用将所有字段提取到其他 shell 变量中。(可能有一种方法可以并行执行,但我不知道)。编辑
至于比特率:我尝试了一个
mkv
包含AAC
音频的样本,但一开始既没有mediainfo
也没有mkvinfo
给出纯粹的音频比特率。可能有人可以从其他信息中计算它,例如用于此轨道的总位数和总持续时间,但我对 mkv 容器的内部结构不够熟悉,无法确定哪个数字是哪个数字。.tracks[] | select(.type=="audio")
读取“流式传输该字段中的所有信息,track
然后选择那些具有type
等于的字段audio
”。说你得到类似的东西然后将其保存到文件或变量中。将其通过管道传输到第二个
jq
命令中,例如jq '.properties.audio_channels'
获取子字段。我不确定您打算如何循环多个轨道或您想要做什么,但您可以仅使用jq
查询来做很多事情。编辑
要在一行中获取 id、编解码器名称、编解码器 id 和通道数,请执行以下操作
在保存的值上(或添加到原始表达式)。
外部
[...]
捕获JSON记录流,内部[...]
构造一个列表,将数字转换为字符串后可以join
用逗号编辑,然后外部列表也join
由换行符编辑。我想如果有必要的话,可以用命令行选项去掉引号。还要查看
sort
是否要先按频道数量排序,等等。这真的变成了一个“我如何
jq
正确使用”的问题,所以也许谷歌一个jq
教程,或者提出一个新问题/新问题?