Opus简介
Opus是什么
Opus是一个有损声音编码的格式,由Xiph.Org基金会开发,之后由互联网工程任务(IETF)组进行标准化,目标是希望用单一格式包含声音和语音,取代Speex和Vorbis,且适用于网络上低延迟的实时语音频传输场景,标准格式定义于RFC 6716文件。
为什么用Opus
- Opus格式是一个开放格式,使用上没有任何专利或限制。
- Opus延时低。16位深16K采样率PCM一帧:1260bit,G711a :640bit,Opus才100左右,没有声音时才二三十。
怎么样用Opus
从官网获取源码:http://www.opus-codec.org/
1 | wget https://archive.mozilla.org/pub/opus/opus-1.3.1.tar.gz |
就可以在$your_install_dir中获得lib文件和头文件了。我们摄像头用可以直接放工程里编(工程里已经有了)。
libopus使用
编码
创建编码器
1 | /* |
设置编码器
1 | /* |
编码
1 | opus_data_len = opus_encode(encoder, pcm_data, frame_size, out_buf, out_len); |
销毁编码器
1 | opus_encoder_destroy(encoder); |
解码
创建解码器
1 | decoder = opus_decoder_create(sampling_rate, channels, &err); |
解码
1 | pcm_data_len = opus_decode(decoder, frame_data, frame_len, out_buf, out_len, FEC_DISABLE); |
销毁解码器
1 | opus_decoder_destroy(decoder); |
实际使用
注意1
为了减少带宽,所以每一帧的数据量都是不一样的,在编码的时候在每一帧前有四位的数据是记录的帧的长度。
并且此处还要注意PCM位深16位,所以一帧的数据量为采样率/FPS*2,PCM一帧的长度固定的。
1 | while (running) |
注意2
1 | opus_encoder_ctl(encoder, OPUS_SET_COMPLEXITY(0)); // 编码复杂度0~10 |
编码器的编码复杂度,随着复杂度越高,编码耗时越长。简单测试如下:
1 | Complexity=0. The run time is: 2.218s |