AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 415134
Accepted
Freedo
Freedo
Asked: 2018-01-06 19:29:21 +0800 CST2018-01-06 19:29:21 +0800 CST 2018-01-06 19:29:21 +0800 CST

如何检索给定轨道 ID 的音频通道、比特率和其他质量测量值

  • 772

我有这个代码:

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.

我对解决这个难题的其他解决方案持开放态度。

shell-script audio
  • 1 1 个回答
  • 1291 Views

1 个回答

  • Voted
  1. Best Answer
    dirkt
    2018-01-07T08:24:22+08:002018-01-07T08:24:22+08:00

    可能有许多不同的方法可以做到这一点,具体取决于您要使用什么工具来解析输出。一种方法是mkvmerge生成 JSON,然后使用jq. 例如,要获取所有音轨:

    mkvmerge --identify --identification-format json sample.mkv | jq '.tracks[] | select(.type=="audio")'
    

    您可以在 中指定各种标准jq,例如.id=="2"轨道 2 等。也许您甚至可以使用 进行比较/排序jq,具体取决于您想要做什么,请参阅man jq详细信息。

    您还可以将一些过滤后的输出存储jq在 shell 变量中,并使用多次jq调用将所有字段提取到其他 shell 变量中。(可能有一种方法可以并行执行,但我不知道)。

    编辑

    至于比特率:我尝试了一个mkv包含AAC音频的样本,但一开始既没有mediainfo也没有mkvinfo给出纯粹的音频比特率。可能有人可以从其他信息中计算它,例如用于此轨道的总位数和总持续时间,但我对 mkv 容器的内部结构不够熟悉,无法确定哪个数字是哪个数字。

    .tracks[] | select(.type=="audio")读取“流式传输该字段中的所有信息,track然后选择那些具有type等于的字段audio”。说你得到类似的东西

    {
      "codec": "AAC",
      "id": 1,
      "properties": {
        "audio_channels": 2,
        "audio_sampling_frequency": 44100,
        "codec_id": "A_AAC",
        "codec_private_data": "1210",
        "codec_private_length": 2,
        "default_duration": 23219954,
        "default_track": true,
        "enabled_track": true,
        "forced_track": true,
        "language": "und",
        "minimum_timestamp": 0,
        "number": 2,
        "uid": 2897612726
      },
      "type": "audio"
    }
    

    然后将其保存到文件或变量中。将其通过管道传输到第二个jq命令中,例如jq '.properties.audio_channels'获取子字段。我不确定您打算如何循环多个轨道或您想要做什么,但您可以仅使用jq查询来做很多事情。

    编辑

    要在一行中获取 id、编解码器名称、编解码器 id 和通道数,请执行以下操作

    jq '[[.id, .codec, .properties.codec_id, .properties.audio_channels] | map(tostring) | join(",")] | join("\n")'
    

    在保存的值上(或添加到原始表达式)。

    外部[...]捕获JSON记录流,内部[...]构造一个列表,将数字转换为字符串后可以join用逗号编辑,然后外部列表也join由换行符编辑。我想如果有必要的话,可以用命令行选项去掉引号。

    还要查看sort是否要先按频道数量排序,等等。

    这真的变成了一个“我如何jq正确使用”的问题,所以也许谷歌一个jq教程,或者提出一个新问题/新问题?

    • 2

相关问题

  • 在awk中的两行之间减去相同的列

  • 打印文件行及其长度的脚本[关闭]

  • 通过命令的标准输出以编程方式导出环境变量[重复]

  • 按分隔符拆分并连接字符串问题

  • MySQL Select with function IN () with bash array

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve