#vorbis #optimization #ogg #compression

optivorbis

一个无损、格式保留、双遍Vorbis优化和修复库

5个版本

0.2.0 2023年12月11日
0.1.4 2023年6月18日
0.1.3 2023年4月3日
0.1.2 2022年8月14日
0.1.1 2022年7月7日

#91 in 音频

Download history 124/week @ 2024-03-13 79/week @ 2024-03-20 91/week @ 2024-03-27 82/week @ 2024-04-03 100/week @ 2024-04-10 175/week @ 2024-04-17 94/week @ 2024-04-24 118/week @ 2024-05-01 50/week @ 2024-05-08 126/week @ 2024-05-15 117/week @ 2024-05-22 125/week @ 2024-05-29 110/week @ 2024-06-05 114/week @ 2024-06-12 288/week @ 2024-06-19 156/week @ 2024-06-26

每月717次下载
用于 mc-repack-core

AGPL-3.0-or-later OR BSD-3-Clause

275KB
4K SLoC

OptiVorbis logo

OptiVorbis

一个用于无损、格式保留、双遍优化和修复Vorbis数据的库和应用,在不改变任何音频信息的情况下减小其大小。

CI workflow status crates.io latest version docs.rs status

crates.io downloads GitHub Releases downloads

🔍 概览

OptiVorbis对完整的、可查找的Vorbis I音频流进行无损优化和修复,通常包含在Ogg Vorbis (.ogg) 文件中,如Vorbis I规范中定义。

优化是无损的:经过此库处理的流将由任何合理的解码器解码为与之前相同的音频样本。内部文件结构可能有所不同,但这些差异对于最终用户来说是透明的,因为生成的流仍然符合规范。

此外,OptiVorbis对Vorbis格式和容器封装的理解,结合它使用的相对宽松、定制的解析器,赋予它一些修复能力。它还倾向于在失败时输出比其他工具更详细、更可操作的错误信息,使其适合用于检查Vorbis流。

目前,OptiVorbis通过以下方式优化Ogg Vorbis流,利用Vorbis I规范提供的巨大灵活性。其中一些需要在整个Vorbis流上执行两次遍历

  • 它确定每个码本定义的符号的使用频率,并计算一个数学上最优的码字分配,通过使用在这篇论文中描述的Huffman算法,最小化每个符号的预期比特成本。
  • 尽可能紧密地将Vorbis包封装到Ogg页面中。传统的编码器通过每页填充较少的包更好地支持网络直播场景,但这不是文件的问题。
  • 它移除了Vorbis包末尾和Ogg页面后的所有填充:参考编码器可能在极端压力下使用其比特率管理引擎以满足最小比特率时,用额外的字节填充音频包。
  • 它移除了非Vorbis逻辑比特流,如Ogg骨架元数据。根据选定的选项,它可能会移除Vorbis注释头中的供应商字符串和用户注释。
  • 它丢弃应该被丢弃的音频包(即,零大小的包)。
  • 用户可根据需要,缩短或清除与音频播放无关的Vorbis头部元数据。这些元数据由编码器供应商字符串和用户注释字段组成。

📥 安装

OptiVorbis官方以三种方式分发:

  • 在项目演示网页内。
  • 作为一个命令行界面(CLI)应用程序,既可由熟练的终端用户使用,也可由其他应用程序使用。
  • 作为一个Rust库,其他Rust包可能使用。

如果您是希望优化文件的终端用户,则演示网页或CLI应用程序就足够了。另一方面,如果您是开发者,您应该考虑CLI或Rust库。

除了这些官方分发渠道外,OptiVorbis还由@Chocobo1为Arch Linux友好打包。如果您正在使用Arch Linux,请随时查看optivorbis

演示网页

只需访问网站:无需安装!只需一个支持所需技术的现代网页浏览器即可。值得注意的是,不支持Internet Explorer,但您应该不再使用它

CLI

根据您的操作系统和CPU架构,从GitHub发行版下载相应的CLI可执行文件。可执行文件是静态链接的,因此它们是完全自包含的,无需任何系统配置即可运行。

如果您正在使用类Unix操作系统(Linux、macOS),请记住,可执行文件必须具有执行权限才能工作。此权限可以使用chmod命令授予:chmod +x optivorbis

如果您想尝试尚未发布的代码,您可以从GitHub Actions CI工作流程获取最新的CLI可执行文件。关于这些构建的稳定性不提供任何保证。

Rust库

与其他依赖项一样,将其添加到项目的Cargo.toml清单中,然后按需调用其API。查看其页面crates.io和API文档docs.rs以开始使用。

此存储库中每个包的最小支持的Rust版本(MSRV)为1.65。为了语义版本控制的目的,提高此版本不被视为破坏性更改。我们将仅在估计这种提高不会引起广泛的不便或破坏时才进行此更改。

📕 使用

到目前为止,应该很明显如何使用演示网页或Rust库。CLI参数遵循一个定义良好的语法。接受几个选项来定制优化过程并影响CLI的输出和操作。最重要的一个用于入门是--help,它显示以下使用帮助

Usage:
    optivorbis [OPTION]... <input file> <output file or ->

Options:
    -h, --help          Prints information about the accepted command line
                        arguments and exits.
        --version       Prints version and copyright information, then exits.
    -q, --quiet         When enabled, the program will only print error
                        messages, unless -h is specified.
    -v, --verbose       Increases the verbosity of the messages. Can be
                        repeated several times.
    -r, --remuxer REMUXER
                        The remuxer to use for managing the encapsulation of
                        Vorbis streams in a container. If not specified, it
                        will be automatically deduced from the extension of
                        the output file.
                        Available remuxers: ogg2ogg
        --vendor_string_action VENDOR-STRING-ACTION
                        Changes how the vendor string contained in the Vorbis
                        identification header will be dealt with.
                        Available actions: copy, replace, appendTag,
                        appendShortTag, empty
        --comment_fields_action COMMENT-FIELDS-ACTION
                        Changes how the user comment fields contained in the
                        Vorbis comment header will be dealt with.
                        Available actions: copy, delete
        --remuxer_option OPTION=VALUE
                        Sets a remuxer-specific option to a value.
                        -----------------------
                        ogg2ogg remuxer options
                        -----------------------
                        - randomize_stream_serials=BOOLEAN
                        If set to true, the stream serials will be randomized,
                        following the intent of the Ogg specification. Set to
                        false to disable this behavior and have more control
                        over the serials. The default value is true.
                        - first_stream_serial_offset=INTEGER
                        A zero or positive integer that sets the offset that
                        will be added to the serial of the first stream. When
                        not randomizing stream serials, the offset matches the
                        serial that will be used for the first stream. The
                        default value is 0.
                        - ignore_start_sample_offset=BOOLEAN
                        Sets whether a non-zero calculated granule position
                        for the first audio sample will be honored when
                        recomputing granule positions in the generated Ogg
                        file or not. This usually is a good thing, but for
                        increased compatibility with some players or dedicated
                        purposes it may be advised to ignore this offset. The
                        default value is false.
                        - error_on_no_vorbis_streams=BOOLEAN
                        Sets whether not finding any Vorbis stream within the
                        Ogg container will be considered an error condition.
                        The default value is true, which means that not
                        finding any Vorbis stream will be considered an error.
                        This usually is the most desirable behavior.

📊 测试和结果

OptiVorbis是在维哥大学的硕士论文中开发的,并在公开发布前进行了广泛的测试,测试数据集包括从Freesound下载的1783个随机选择的、有效的Ogg Vorbis文件,总时长为164小时,数据大小为16.58 GiB。OptiVorbis通过了所有定义的单元、集成和系统测试,对每个分析文件都实现了大小缩减,而没有改变通过oggdec(来自Debian的vorbis-tools包,版本1.4.2)解码的音频样本。唯一例外的是四个文件,它们的粒度位置数据损坏被OptiVorbis修复。数据集包括各种类型的Ogg Vorbis文件,包含单声道、立体声和环绕声,采样率不同,由各种编码器生成。它在大约半小时内进行了优化,并行化工作在六个CPU核心上。

以下箱线图表示OptiVorbis实现的相对每文件大小缩减分布。

尽管优化潜力可能有很大的差异,但每个文件的大小都得到了缩减。实现的缩减比使用通用的压缩工具(如xz)对Ogg Vorbis文件进行压缩显著更好。有趣的是,文件大小缩减分布略微偏向于更高的缩减率,平均缩减率(11.35%)略高于中位数(9.62%)。一半的分析文件的大小缩减在4.91%到13.44%之间。

值得注意的是,测试技术包括模糊测试,使用了AFL++模糊器。借助AFL++,测试了6亿个突变Ogg Vorbis文件的优化,发现了数十个失败的运行时断言,并进行了修复。

⚖️ 许可证

OptiVorbis库的许可证可以是以下之一:

任选其一。OptiVorbis CLI的许可证仅限于GNU Affero通用公共许可证,版本3。其他组件(网页演示等)的许可证根据其根目录中的许可证文件和其包元数据(如有)确定。

✨ 贡献

接受拉取请求。如果你能改进OptiVorbis项目的某些方面,请随时贡献!

贡献包括但不限于

  • 编写良好的错误报告或功能请求
  • 提交包含代码更改的PR,实现改进或修复问题
  • 向他人推荐OptiVorbis并参与社区互动
  • 经济支持项目(查看GitHub页面上的"赞助"按钮)

代码贡献必须通过CI检查,并被视为足够质量由仓库维护者合并。OptiVorbis结构为标准Cargo工作空间,包含多个包

  • packages/optivorbis:OptiVorbis Rust库。
  • packages/optivorbis_afl_fuzz_target:OptiVorbis的AFL++模糊目标。另请参阅相关的scripts/afl-fuzz.sh脚本。
  • packages/optivorbis_cli:OptiVorbis CLI。
  • packages/vorbis_bitpack:根据Vorbis位打包约定实现的位读写操作。

该网站(web)是一个标准的npm项目,使用了Webpack和OptiVorbis库的WASM目标JS绑定,使用wasm-pack构建。

🤝 联系

我们欢迎关于项目的友好交流,包括提问、祝贺和建议。前往GitHub 讨论页面与用户、贡献者和开发者互动。

🧑‍🤝‍🧑 贡献者

感谢这些杰出的人(emoji key

Alejandro González
Alejandro González

💻 📖 🎨 🤔 🚧 📆 🔣 🖋 🔬 🚇
victorlf4
victorlf4

🤔
Chocobo1
Chocobo1

📦
Miguel
Miguel

🎨
sya-ri
sya-ri

🤔 🚇

本项目遵循all-contributors规范。欢迎任何形式的贡献!

➡️ 相关软件

如果您觉得OptiVorbis很有用,您可能对以下程序感兴趣

  • rogg:一个用于操作Ogg Vorbis文件的库,提供诸如调整粒度位置、替换流序列号和重新计算每个Ogg页的CRC等高级和独特功能。
  • oggz:一个库和一组命令行工具,用于对Ogg Vorbis文件进行底层检查和操作。
  • revorb:一个用于重新计算Ogg Vorbis文件粒度位置的命令行工具。OptiVorbis也自动进行此类计算。
  • rehuff:由Segher Boessenkool编写的2002年的专有概念程序,用于优化Vorbis流。OptiVorbis在此基础上扩展了优化技术,提供了一种更完善、更可靠的解决方案,该方案是开源的。

⛔ 已知限制

为了实现简单,不支持使用类型0的floor信号组件格式的Vorbis流。根据Vorbis I规范,该格式“在现代使用有限”并且已被每个已知的Vorbis编码器在20多年时间里废弃,因此这种floor类型的流应极为罕见。欢迎解决此限制的pull请求。

由于上述的双遍优化算法,OptiVorbis不适合用于实时流的应用场景。

Vorbis I 设置头代码本格式容易受到拒绝服务攻击,因为根据规范,极端密集的前缀码树解析时间很长。OptiVorbis不对此类树设置深度或密度限制,这保证了其互操作性,但使其容易受到专门定制的文件攻击。随着收集有关限制树深度对互操作性和缓解影响的信息,这可能在未来得到解决。在此期间,处理不可信文件的应用程序应了解这一点,并在适用的情况下使用操作系统功能来限制资源消耗。

依赖项

~2.4-5MB
~90K SLoC