#opus #ogg #vorbis #normalization #audio-player

bin+lib zoog

用于修改 Ogg Opus 输出增益和 R128 标签以及 Ogg Opus/Vorbis 注释标签的工具

10 个版本 (6 个破坏性更新)

0.8.1 2022 年 12 月 24 日
0.8.0 2022 年 12 月 21 日
0.7.1 2022 年 11 月 29 日
0.6.0 2022 年 10 月 23 日
0.2.0 2022 年 10 月 4 日

#263音频

每月 26 次下载

BSD-3-Clause

140KB
2.5K SLoC

Zoog: 零 Opus 输出增益

Zoog crate Zoog documentation

Zoog 是一个 Rust 库,包含用于确定 Ogg Opus 文件响度以及使用新的内部增益信息和响度相关的注释标签重写该文件的功能。它还提供了用于纯操作 Ogg Opus 和 Ogg Vorbis 文件注释标签的功能。

Zoog 目前包含两个工具,opusgainzoogcommentopusgain 可用于

  • 设置位于 Opus 文件 Opus 二进制头部中的输出增益值,以便文件以原始编码音频的响度或与 ReplayGainEBU R 128 标准一致的方式播放。

  • 编写某些音乐播放器使用的 Opus 编码音频文件的音量。

旨在解决“Opus 播放声音太小”的问题。

zoogcomment 可用于列出、替换或修改 Ogg Opus 和 Ogg Vorbis 文件的注释标签。其用法大致基于 vorbiscomment,尽管许多选项的命名不同,以提高清晰度。

尽管 zoog 提供了一个库,但其 API 不稳定,此包主要在 crates.io 上发布,以允许访问命令行工具。不过,API 已有文档,阅读源代码可能对其他希望处理 Ogg Opus 文件的人来说是有用的。

opusgain

opusgain 调整 Opus 二进制头部以在特定音量播放,并将始终生成 R128_TRACK_GAIN 标签和 R128_ALBUM_GAIN 标签(在专辑模式下),以便文件将在支持这些标签的播放器中播放适当的音量,在不支持这些标签的播放器中播放更合适的音量。在非专辑模式下,将移除现有的 R128_ALBUM_GAIN 标签。

opusgain(与它的前身 zoog 不同)解码 Opus 音频以确定其音量,从而可以确保生成的所有增益值都是正确的,而无需对其现有值做出假设。

以下选项可用(运行 opusgain --help 获取使用方法)

  • -p预设, --预设=预设

    建议明确指定此值,因为默认值可能会更改。

    • original:将 Opus 二进制头中的输出增益设置为 0dB。在不支持 R128 标签的播放器中,这将导致 Opus 文件以原始编码源的音量播放。如果您希望音量规范化仅通过标签进行,则可能需要这样做。

    • rg:将 Opus 二进制头中的输出增益设置为确保播放在 -18 LUFS 发生的值,这应该与 ReplayGain 标准化文件的响度相匹配。如果您有一个不知道 Opus R128 标签的播放器,但这

      • 支持您使用的其他文件格式的 ReplayGain,以及/或者
      • 您播放的文件已经通过播放器无关的方式调整到 ReplayGain 参考音量(mp3gainaacgain 可以这样做)。
    • r128:将 Opus 二进制头中的输出增益设置为确保播放在 -23 LUFS 发生的值,这应该与从包含 ReplayGain 信息的 FLAC 文件生成的 opusenc 文件的响度相匹配。这是 Opus 作者希望达到的增益级别。

    • no-change:不要更改 Opus 二进制头中的输出增益。

  • -o模式, --输出-增益-模式=模式

    • auto:在专辑模式下,将 Opus 二进制头中的输出增益设置为使每首曲目在专辑模式下进行专辑规范化,否则进行曲目规范化。在专辑模式下,这会导致所有曲目具有相同的输出增益值以及相同的 R128_ALBUM_GAIN 标签。

    • track:将 Opus 二进制头中的输出增益设置为使每首曲目进行曲目规范化,即使启用了专辑模式。在专辑模式下,这会导致所有曲目被分配不同的输出增益值以及不同的 R128_ALBUM_GAIN 标签,但它们的 R128_TRACK_GAIN 标签将是相同的。除非您知道自己在做什么,否则您可能不想选择此选项。

  • -a, --album:启用专辑模式。这会导致生成 R128_ALBUM_GAIN 标签。这些标签告诉支持这些标签的播放器应用多少增益,以便专辑中的每首曲目都保持其相对响度。默认情况下,每个文件的输出增益值将设置为相同的值,以应用计算出的专辑增益,但可以使用 --output-gain-mode 选项来覆盖此行为。

  • -n, --dry-run:显示与 opusgain 产生的相同输出,但不会对提供的文件进行任何更改。

  • -j N, --num=N:使用 N 个线程进行处理。默认情况下使用系统检测到的核心数。较大的数字将被四舍五入到这个值。为了避免在处理过程中磁盘空间使用过高,或者错误后留下大量临时文件,无论线程数量如何,一次只重写一个文件。

  • -c, --clear:从指定的文件中删除所有 R128 标签。每个文件的输出增益不变,无论指定的预设值如何。

如果内部增益和标签值对于指定的文件已经正确,opusgain 将避免重写它们。

不支持顺序复用的“链式”Ogg Opus流。

opusgain 在 Windows 下支持 Unix shell 风格的通配符,其中通配符由应用程序处理,而不是由 shell 展开。

zoogcomment

zoogcomment 可以用来删除、追加、替换和列出 Ogg Opus 或 Ogg Vorbis 文件中定位的注释。

以下选项可用(运行 zoogcomment --help 以获取用法)

  • -l, --list:以 NAME=VALUE 格式列出文件中的所有标签。除非指定 -O,否则将输出到标准输出。

  • -m, --modify:使用 -t-I 指定的标签将被追加到指定的文件中。与使用 -d 指定的模式匹配的标签将从文件上现有的标签中删除。

  • -r, --replace:将删除文件中所有现有的标签,并用使用 -t-I 指定的新标签替换。

  • -t NAME=VALUE, --tag NAME=VALUE。在修改或替换模式下将指定的标签添加到文件中。

  • -d NAME[=VALUE], --delete NAME[=VALUE]。指定要删除的标签名称或名称-值映射。将删除与模式匹配的所有标签,而不仅仅是第一个。此选项仅在修改模式下有效。

  • -e, --escapes:在所有标签输入/输出中,无论是在命令行还是在文件中,都将使用转义字符来表示换行(\n)、回车(\r)、反斜杠(\\)和空字符(0)。所有其他转义字符都是无效的。此选项使得可以指定包含换行符的标签,否则这些标签在注释文件中可能无法正确解析。

  • -I COMMENT_FILE, --tags-in COMMENT_FILE:在修改和替换模式下,除了在命令行上指定的标签外,还将从该文件中读取要添加的标签。标签以 NAME=VALUE 格式读取,每行一个标签。如果指定了文件名,则将从标准输入读取标签。

  • -O COMMENT_FILE, --tags-out COMMENT_FILE:在列表模式下,标签将写入此文件。标签以 NAME=VALUE 格式写入,每行一个标签。如果指定了文件名,则将标签写入标准输出。

  • -n, --dry-run:显示 zoogcomment 可能产生的相同输出,但不对文件系统进行任何更改。

zoogcomment 只了解 UTF-8。在未使用 UTF-8 作为字符编码方案的系统中使用时可能会遇到问题。

构建说明

如果您没有 Cargo,请按照以下说明安装:[这里](https://doc.rust-lang.net.cn/cargo/getting-started/installation.html)。

克隆 Git 仓库

$ git clone https://github.com/FrancisRussell/zoog.git

在克隆的仓库内部

cargobuild

cargobuild --release

进行发布构建。

构建的二进制文件可以在 target/debugtarget/release 中找到。

通过 cargo 安装

在命令行中,只需运行

$ cargo install zoog

opusgainzoogcomment 现在应该在路径中可用。

发布

Windows、MacOS 和 Linux 的 Zoog 二进制文件可以在 [发布页面](https://github.com/FrancisRussell/zoog/releases/) 找到。目前只有 Linux 二进制文件进行了测试。

关于 Ogg Opus 音量归一化

背景

Opus 编码的音频文件包含一个 “输出增益” 值,该值描述了在解码音频时应用的增益。此值似乎是为了确保对 Opus 文件的响度更改始终应用,而不是依赖于解码器对标签(如 REPLAYGAIN_TRACK_GAINREPLAYGAIN_ALBUM_GAIN)的支持,这些标签在 Ogg Vorbis 中使用,但在 Opus 中未使用。

头部中的值原本是为了与专辑增益相对应,这与RFC 7845中定义的标签有关,该标签为单轨道归一化定义了R128_TRACK_GAIN。似乎原始的输出增益意图是为了消除专辑增益标签的需求,但是后来又添加了R128_ALBUM_GAIN用于专辑归一化。

问题

当使用opusenc从包含嵌入的ReplayGain标签的FLAC流编码Opus流时,结果Opus流的输出增益字段将在Opus头部中设置。增益值将使用EBU R 128和-23 LUFS的响度值选择,这比ReplayGain安静5 dB。

存在R128_TRACK_GAINR128_ALBUM_GAIN标签将允许支持这些标签的播放器在适当的音量播放曲目。然而,在不支持这些标签的音频播放器中,曲目可能会非常安静(除非你的整个音乐库已归一化到-23 LUFS)。

更成问题的是,使用opusenc处理没有嵌入ReplayGain标签的FLAC文件将生成一个以原始音频音量播放的文件。这种行为差异意味着不支持R128标签的播放器无法假设不同Opus文件将以类似的音量播放,尽管存在内部增益头。

即使播放器支持R128标签,这也不足以正确地以正确音量播放Opus文件。在上面的情况下,opusenc将使用内部增益来应用专辑归一化,这意味着它不会生成R128_ALBUM_GAIN标签。没有这个标签,音乐播放器无法在没有再次假设内部增益对应于-23 LUFS的专辑归一化的情况下播放曲目。

问答

响度是如何计算的?

响度是使用ITU-R BS.1770计算的。这是EBU R 128用于测量响度的标准,也是计算Opus R128标签时打算使用的一个标准。

关于名称zoog是什么意思?

zoog代表“Zero Opus Output Gain”(零Opus输出增益),是本项目原始工具的名称。它服务于与opusgain类似的目的,但使用现有的R128标签来确定文件音量,而不是直接解码音频。

zoog被弃用,因为关于是否可以假设一个轨道是专辑归一化的争议使得如果通过输出增益值而不是R128_ALBUM_GAIN标签进行归一化,可能会导致专辑归一化被破坏。

我应该何时使用opusgain而不是loudgain

如果你只在支持R128标签的播放器中播放Opus文件,那么请使用loudgain

如果您在不支持 R128 标签且希望以原始音量或ReplayGain或EBU R 128建议的音量播放的播放器中播放Ogg Opus文件,则应使用 opusgain

一旦将一组Opus文件的内部增益设置为所需值,则对于与标准化相关的任何未来标签更新,loudgain 可能更合适。

如何检查 opusgain 是否正确工作?

opusgain 应用于各种测试文件,然后审查 loudgain 在对重写的文件应用时生成的诊断输出和 R128 标签,这对这方面很有帮助。

免责声明

请参阅LICENSE。除非您有一个可以轻松从其中重建您的Ogg Opus和/或Vorbis文件的源,否则作者建议首先备份任何打算修改的文件,然后在任何处理后的文件上运行 opusinfo

参考资料

  1. RFC 7845 - Ogg封装Opus音频编解码器
  2. Vorbis I规范
  3. Ogg Vorbis标识头

依赖项

~9–21MB
~277K SLoC