添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

Opus简介

Opus是一个有损声音编码的格式,由Xiph.Org基金会开发,之后由互联网工程任务组进行标准化,目标是希望用单一格式包含声音和语音,取代Speex和Vorbis,且适用于网络上低延迟的即时声音传输,标准格式定义于RFC 6716文件。Opus格式是一个开放格式,使用上没有任何专利或限制。

在官方的 example 测试案例中,就算有30%的丢包率,也能够听清楚人声,这对于即时的声音传输场景来说非常重要。并且它支持动态、无缝的调节比特率与音频带宽,在网络环境多变的场景下更能保证音频的质量。

同时它是WebRTC中默认的音频编码格式、也是WebM视频文件中音频的编码格式。

Opus可以处理各种音频应用,包括IP语音、视频会议、游戏内聊天、流音乐、甚至远程现场音乐表演。它可以从低比特率窄带语音扩展到非常高清音质的立体声音乐。支持的功能包括:

  • 6 kb/秒到510 kb/秒的比特率;单一频道最高256 kb/秒
  • 采样率从8 kHz(窄带)到48 kHz(全频)
  • 帧大小从2.5毫秒到60毫秒
  • 支持恒定比特率(CBR)、受约束比特率(CVBR)和可变比特率(VBR)
  • 支持语音(SILK层)和音乐(CELT层)的单独或混合模式
  • 支持单声道和立体声;支持多达255个音轨(多数据流的帧)
  • 可动态调节比特率,音频带宽和帧大小
  • 良好的鲁棒性丢失率和数据包丢失隐藏(PLC)
  • 浮点和定点实现

Opus 标识头

关于Opus的标识头,可以从rfc7845标准文档中找到详细的解答,格式如下:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      'O'      |      'p'      |      'u'      |      's'      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      'H'      |      'e'      |      'a'      |      'd'      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Version = 1  | Channel Count |           Pre-skip            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                     Input Sample Rate (Hz)                    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Output Gain (Q7.8 in dB)    | Mapping Family|               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+               :
|                                                               |
:               Optional Channel Mapping Table...               :
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                   Figure 2: ID Header Packet

Identification header主要由8个参数组成,分别为:

  • Magic Signature:固定头,占8个字节,为字符串OpusHead
  • Version:版本号,占1字节,固定为0x01
  • Channel Count:通道数,占1字节,根据音频流通道自行设置,如0x02
  • Pre-skip:回放的时候从解码器中丢弃的samples数量,占2字节,为小端模式,默认设置0x00, 0x00
  • Input Sample Rate (Hz):音频流的Sample Rate,占4字节,为小端模式,根据实际情况自行设置
  • Output Gain:输出增益,占2字节,为小端模式,没有用到默认设置0x00, 0x00
  • Channel Mapping Family:通道映射系列,占1字节,默认设置0x00
  • Channel Mapping Table:可选参数,上面的Family默认设置0x00的时候可忽略

Android播放opus

从Android 5.0+开始,官方支持opus解码 这意味着 MediaPlayer即可播放opus音频流。

三方播放器播放

ExoPlayer也支持播放opus

本地导入ExoPlayer

Cloning the repository and depending on the modules locally is required when using some ExoPlayer extension modules. It’s also a suitable approach if you want to make local changes to ExoPlayer, or if you want to use a development branch.
First, clone the repository into a local directory and checkout the desired branch:

git clone https://github.com/google/ExoPlayer.git
cd ExoPlayer
git checkout release-v2

Next, add the following to your project’s settings.gradle file, replacing path/to/exoplayer with the path to your local copy:

gradle.ext.exoplayerRoot = 'path/to/exoplayer'
gradle.ext.exoplayerModulePrefix = 'exoplayer-'
apply from: new File(gradle.ext.exoplayerRoot, 'core_settings.gradle')

You should now see the ExoPlayer modules appear as part of your project. You can depend on them as you would on any other local module, for example:

implementation project(':exoplayer-library-core')
implementation project(':exoplayer-library-dash')
implementation project(':exoplayer-library-ui')
本地打包opus的so库
  LibopusAudioRenderer audioRenderer = new LibopusAudioRenderer();
      player = new ExoPlayer.Builder(context, audioRenderer).build();
      player.addListener(this);
      MediaSource mediaSource =
          new ProgressiveMediaSource.Factory(
                  new DefaultDataSourceFactory(context, "ExoPlayerExtOpusTest"),
                  MatroskaExtractor.FACTORY)
              .createMediaSource(uri);
      player.prepare(mediaSource);
      player.setPlayWhenReady(true);
初始化编码器和解码器: 
 val SAMPLE_RATE = Constants . SampleRate . _48000 ()       // samlpe rate of the input audio
val CHANNELS = Constants . Channels .stereo()
                                    Opus 音频编解码库是 Speex 音频编解码库的下一代版本,从编解码性能以及质量上来讲都有了长足的进步。Opus 的编译非常简单,但是官方并未给出详细的 Android 版本编译指南,查找了大量资料,经过多次试验,总结了一套成功的方法,具体如下:1. 确保你的机器上安装有 android ndk,并下载最新的 opus 源代码。2. android ndk 因为包含了针对多个 android ...
 构建 Android NDK 脚本来自:  : 
 将 opus 源文件下载到“opus”目录中。 Opus 1.1 版运行良好:  : 对于最新版本 1.1.1-beta,在下一个构建步骤中会发生构建错误。
 使用 Android 'ndk-build' 命令构建它:
 ndk-build APP_BUILD_SCRIPT=Android.mk NDK_PROJECT_PATH=build
 在“build/obj/local/armeabi/libopus.a”中找到构建的静态库。
                                    https://blog.csdn.net/grandgrandpa/article/details/96438388
opus是一个有损声音编码的格式,由IETF开发,没有任何专利或限制,适用于网络上的实时声音传输,标准格式为RFC 6716,其技术来源于Skype的SILK及Xiph.Org的CELT编码
 主要特性如下:
 6 kb /秒到510 kb / s的比特率
	 采样率从8 kHz(窄带)到48 kHz(全频)
	 帧大小从2.5毫秒到60毫秒
	 支持...
ExoPlayer是Google开源的Android平台媒体播放器。 它是Android的MediaPlayer API的替代品。
相比于IJKPlayer,EXOPlayer更易于拓展,功能更多,bug更少。ExoPlayer虽然不支持软解但是为开发者扩展软解预留了接口。
网上竟然搜不到ExoPlayer+软解的扩展实现,那就有必要来一篇了hhh。
预先准备:
1.下载NDK(要下载NDK...
                                    将PCM转换成OPUS编码
Opus是一个有损声音编码的格式,由Xiph.Org基金会开发,之后由IETF(互联网工程任务组)进行标准化,目标是希望用单一格式包含声音和语音,取代Speex和Vorbis,且适用于网络上低延迟的即时声音传输,标准格式定义于RFC 6716文件。Opus格式是一个开放格式,使用上没有任何专利或限制。
采样率16k,位深度16bit,单声道的音频数据,用自动比特率编码成OPUS格式,并加上ogg封装之后,大小只有原来的1/13,这对于移动平台来说,为传输延时带来的好处是很明显的。
                                    Android中使用Opus 1.3.1
Opus是一个开放格式的有损声音编码的格式,并在其使用上没有任何专利或限制。还可以处理各种音频应用,包括IP语音、视频会议、游戏内聊天、流音乐、甚至远程现场音乐表演。它可以从低比特率窄带语音扩展到非常高清音频的立体声音乐。支持的功能包括:
6 kb/秒到510 kb/秒的比特率;单一频道最高256 kb/秒
采样率从8 kHz(窄带)到48 kHz(全频)
帧大小从2.5毫秒到60毫秒
支持恒定比特率(CBR)、受约束比特率(CVBR)和可变比特率(VBR)
                                    一、源码下载opus官网源码下载我这里使用的是1.3.1版本新建Android module opus其目录结构如下将opus源码拷贝至src目录,在src目录下新建Android.mk 与Application.mkAndroid.mkLOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)include $(LOCAL_PATH)/celt_sourc...
                                    ​Opus是一种开源免费的音频编解码器,支持音乐和语音,具有低延时、带内FEC、DTX、PLC等特点,默认22.5ms延时,非常适用网络实时传输。官网:https://www.opus-codec.org。Opus协议收录于RFC6716,使用SILK和CELT两种编码。
                                    Android 开发者肯定已经知道了。Android Q 正式原生支持 Opus 与 AV1 了。在今年 3 月的时候,Google 发布了第一个支持 Opus、AV1 ...
                                    上一节中我们介绍了音频的一些基本知识,这一节我们来讲述如何采集音频数据,然后将采集到的音频播放出来。Android SDK 提供了两套音频采集的API,分别是:MediaRecorder 和 AudioRecord。根据官方文档的说法,该AudioRecord类管理Java应用程序的音频资源记录来自平台的音频输入硬件音频。这是通过“拉”(读)从AudioRecord对象中的数据来实现的。该应用程序...