Opus 编码是一种有损音频编码的格式,由互联网工程任务组(IETF)进来开发,标准格式为RFC 6716
。Opus 编码是由 Skype 的 SILK 编码及 Xiph.Org 的 CELT 编码融合而成,所以既适合语音又适合音乐编码,可以从低比特率窄带语音扩展到非常高质量的立体声音乐。
总结来说,Opus 是一个高保真的适合在网络中传输的开源的语音编码格式,相对于其他编码格式来讲,保真性更好,压缩比高,延迟低。
tar -zxf opus-1.2.1.tar.gz
cd opus-1.2.1
./configure --prefix=$your_install_dir
make
make install
编译完之后, 在
$your_install_dir
目录下就有存在这三个文件夹include, lib, share
,一般可以设置为自己的工程目录或者/usr/local/
。
opus 的接口声明在include/opus.h
中,下面是四个主要的函数:
// 创建编码器
OpusEncoder *opus_encoder_create(
opus_int32 Fs, // 采样率,8000, 12000, 16000, 24000, 48000
int channels, // 声道数,网络实时音频数据一般为单通道
int application, // 语音或音乐
int *error // 是否创建成功,0为成功
)
// 修改编码器参数
int opus_encoder_ctl(
OpusEncoder *st,
int request, ...
)
opus_encoder_ctl(enc, OPUS_SET_BITRATE(24000)); // 编码比特率
opus_encoder_ctl(enc, OPUS_SET_VBR(0)); // 0恒定比特率,1可变比特率
opus_encoder_ctl(enc, OPUS_SET_SIGNAL(OPUS_SIGNAL_VOICE)); // 指定编码类型,AUTO, VOICE, MUSIC可选
// PCM编码成opus
// 返回编码后的字节
// frame_size 必须是恰好是一帧(2.5, 5, 10, 20, 40, 60)ms的音频数据
// frame_size = 帧时长/(1/采样率)
opus_int32 opus_encode(
OpusEncoder *st,
const opus_int16 *pcm,
int frame_size,
unsigned char *data,
opus_int32 max_data_bytes // data的最大存储大小
)
// 释放编码器
void opus_encoder_destroy(OpusEncoder *st)
// 创建解码器
OpusDecoder *opus_decoder_create(
opus_int32 Fs,
int channels,
int *error
)
// opus解码成PCM
// **返回采样点的大小,而不是解码后的数据长度**
int opus_decode(
OpusDecoder *st, // 解码器实例
const unsigned char *data, // 要解码的数据
opus_int32 len, // 解码数据长度
opus_int16 *pcm, // 解码后的数据,是一个以16位为单位的数组
int frame_size, // 每个声道给pcm数组的长度
int decode_fec // 是否用inbandfec,0为不需要,1为需要
)
// 释放解码器
void opus_decoder_destroy(OpusDecoder *st)
opus 解码后返回的不是解码数据长度,而是采样点的大小,这应该时帧大小吧
编码器默认使用动态码率,故需要在每个压缩数据帧头部记录每一个编码帧的大小,比如用 2 个字节的头部记录这个帧长。当然也可以使用静态编码码率,编码后总是返回固定大小的 opus 编码帧。
opus_encoder_ctl(enc, OPUS_SET_VBR(0)); // 0恒定比特率,1可变比特率
在定义编码器后,可是修改编码器设置,指定静态码率,6 kb /s 到 510 kb / s 的编码比特率,想要压缩比大一点就设置小一点,但是相应失真变大。
opus_encoder_ctl(enc, OPUS_SET_BITRATE(24000)); // 编码比特率
由于 opus 集成了语音和音乐两种优秀的编码算法,所以可以对指定的音频类型进行单独优化。
opus_encoder_ctl(enc, OPUS_SET_SIGNAL(OPUS_SIGNAL_VOICE)); // 指定编码类型,AUTO, VOICE, MUSIC可选
#include "opus.h"
#include "opus_types.h"
#include "opus_multistream.h"
#define SAMPLE_RATE 16000
#define CHANNEL_NUM 1
#define BIT_RATE 16000<