== Opus 音频编解码器 ==
Opus 是一种用于通过互联网进行交互式语音和音频传输的编解码器。
Opus 能够处理各种交互式音频应用,包括网络语音通话 (Voice over IP)、视频会议、游戏内语音聊天,甚至远程实时音乐表演。它可以从低比特率的窄带语音扩展到非常高质量的立体声音乐。
当 Opus 与适当的容器格式结合时,它也适用于非实时的存储文件应用,例如音乐分发、游戏音轨、便携式音乐播放器、点唱机等,这些应用历史上曾使用过高延迟格式,如 MP3、AAC 或 Vorbis。
Opus 的技术规范由 IETF RFC 6716 定义: https://tools.ietf.org/html/rfc6716
Opus 格式及其实现受制于文件 COPYING 中规定的免版税专利和版权许可。
该软件包实现了一个用于编码和解码原始 Opus 比特流的共享库。应根据 https://tools.ietf.org/html/rfc7587 在 RTP 协议中使用原始 Opus 比特流。
该软件包还包括一些测试工具,用于测试库的正确操作。这些工具读取/写入的比特流不应用于 Opus 文件分发:它们包含额外的调试数据,并且不支持寻址功能。
存储在文件中的 Opus 应使用 Ogg 封装格式,详细描述请参考: https://tools.ietf.org/html/rfc7845
提供了 opus-tools 软件包,用于对 Ogg 封装的 Opus 文件进行编码和解码,并包含许多有用的功能。
opus-tools 可在以下网址找到: https://gitlab.xiph.org/xiph/opus-tools.git 或访问 Opus 官方网站: https://opus-codec.org/
== 深度学习与 Opus ==
丢包网络仍然是实时通信的一个挑战。虽然 Opus 的原始实现提供了出色的数据包丢失隐藏机制,但团队一直在改进用于改善网络环境中音质的方法。
在 Opus 1.5 中,我们增加了一个基于深度学习的冗余编码器,通过在每个数据包的填充数据中嵌入一秒钟的恢复数据来增强丢包网络中的音频质量。编码和解码恢复数据的底层算法称为深度冗余 (DRED) 算法。通过利用数据包内的填充数据,Opus 1.5 与之前的 Opus 版本完全兼容。有关 DRED 的更多信息,请参阅 "dnn" 子目录下的 README 文件。
DRED 由亚马逊网络服务公司 (Amazon Web Services) 最初资助开发,实施已开源,并在 IETF 开始了标准化过程: https://datatracker.ietf.org/doc/draft-ietf-mlcodec-opus-extension/ Opus 1.5 的发布不会改变 Opus 的许可协议或知识产权状态。
== 编译 libopus ==
从分发的 tarball 构建时,只需执行以下步骤:
% ./configure
% make
从 git 仓库构建时,需要执行以下步骤:
设置开发环境:
在 Ubuntu 或 Debian 系列 Linux 发行版中:
% sudo apt-get install git autoconf automake libtool gcc make
在 Fedora/Redhat 系列 Linux 中:
% sudo dnf install git autoconf automake libtool gcc make
对于旧版 Redhat/Centos Linux 发行版:
% sudo yum install git autoconf automake libtool gcc make
在 Apple macOS 中,安装 Xcode 和 brew.sh,然后在终端中输入:
% brew install autoconf automake libtool
克隆仓库:
% git clone https://gitlab.xiph.org/xiph/opus.git % cd opus
编译源码
% ./autogen.sh % ./configure % make
在 x86 平台上,建议使用 -march= 选项来允许使用 AVX2 指令集。
安装编解码库(可选)
% sudo make install
编译完成后,在顶层目录中会有一个 opus_demo 可执行文件。
使用方法:opus_demo [-e] <应用程序> <采样率 (Hz)> <声道 (1/2)> <比特率> [选项] <输入> <输出> opus_demo -d <采样率 (Hz)> <声道 (1/2)> [选项] <输入> <输出>
模式: voip | audio | restricted-lowdelay 选项: -e : 仅运行编码器(输出比特流) -d : 仅运行解码器(将比特流作为输入) -cbr : 启用恒定比特率;默认:可变比特率 -cvbr : 启用约束可变比特率;默认:不受约束 -bandwidth <NB|MB|WB|SWB|FB> : 音频带宽(从窄带到全带);默认:采样率 -framesize <2.5|5|10|20|40|60> : 帧大小(毫秒);默认:20 -max_payload <字节> : 最大有效负载大小(字节),默认:1024 -complexity <复杂度> : 复杂度,0(最低)... 10(最高);默认:10 -inbandfec : 启用 SILK 带内 FEC -forcemono : 强制单声道编码,即使输入为立体声 -dtx : 启用 SILK DTX -loss <百分比> : 模拟丢包率(0-100%);默认:0
输入和输出是小端 16 位带符号 PCM 文件或带有简单 opus_demo 专有帧格式的 Opus 比特流。
== 测试 ==
该软件包包含一组自动化的单元和系统测试,建议在第一次在新平台上运行时,编译后执行测试。
运行集成测试:
% make check
由于大小限制,标准测试向量未包含在该软件包中,但可以从以下地址获取: https://opus-codec.org/docs/opus_testvectors-rfc8251.tar.gz
要将代码与这些测试向量进行比较:
% curl -OL https://opus-codec.org/docs/opus_testvectors-rfc8251.tar.gz
% tar -zxf opus_testvectors-rfc8251.tar.gz
% ./tests/run_vectors.sh ./ opus_newvectors 48000
== 为 Windows 和其他构建系统编译 libopus ==
请参阅 cmake/README.md 或 meson/README.md。
== 便携性说明 ==
该实现默认使用浮点运算,但可以通过设置 --enable-fixed-point(若使用 autoconf)或定义 FIXED_POINT 宏(若手动构建)来编译为仅使用定点运算。定点实现的音质较低,并且在具有快速浮点单元的设备上速度较慢,通常仅在嵌入式环境中使用。
该实现可以使用 C89 或 C99 编译器进行编译。虽然它不依赖于 C89 或 C99 定义的任何"未定义行为",但它依赖于两补码架构的常见"实现定义行为":
o 负值的右移操作与两补码算术一致,即 a>>b 等效于 floor(a/(2^b)),
o 转换为 N 位有符号整数时,值将模 2^N 缩减到类型范围内,
o 负值的整数除法结果被截断到零方向,且
o 编译器提供了 64 位整数类型(C99 要求,大多数 C89 编译器也支持)。