来自:http://www.opus-codec.org/docs/html_api-1.1.0/group__opus__encoder.html#gaefeb7dc1d6e3b59dea5ea674c86e9c18
详细说明
此页面描述了用于编码的使用过程和功能。
因为Opus是状态编解码,进行编码前,首先需要创建一个编码器。你可以这样做:
int error;
OpusEncoder *enc;
enc = opus_encoder_create(Fs, channels, application, &error);
从这起,enc就可以用来对音频流进行编码。这个编码器不能同时对多个流进行编码 (线程不安全)。同时,对多帧进行编码时,编码器不需要重复初始化。
调用opus_encoder_create()时,会创建内存空间,它也可以初始化预分配内存:
int size;
int error;
OpusEncoder *enc;
size = opus_encoder_get_size(channels);
enc = malloc(size);
error = opus_encoder_init(enc, Fs, channels, application);
opus_encoder_get_size()会返回编码器所需的内存大小。请注意,这个大小可能在未来的版本中有所修改,所以尽量不要使用常量代替。
这个编码器会分配到连续的内存块中,可以通过浅拷贝获取他(例如memcpy)
你可以通过opus_encoder_ctl()对编码器的内部设置进行修改。这些设定默认使用推荐值。以下为最常见的修改项:
opus_encoder_ctl(enc, OPUS_SET_BITRATE(bitrate));//波特率
opus_encoder_ctl(enc, OPUS_SET_COMPLEXITY(complexity));//复杂度
opus_encoder_ctl(enc, OPUS_SET_SIGNAL(signal_type));//信号
在这里
bitrate的单位是比特每秒(B / S)
complexity是一个值从1至10,其中1最低和10最高
signal_type要么OPUS_AUTO(默认),OPUS_SIGNAL_VOICE或OPUS_SIGNAL_MUSIC
参看编码器相关的CTL和通用的CTL可以知道完整的设置列表。大多数参数可以在流编码时,进行设置或修改。
在调用opus_encode()或者opus_encode_float()时必须是一个完整的音频数据(2.5,5,10,20,40或60毫秒):
len = opus_encode(enc, audio_frame, frame_size, packet, max_packet);
在这里
audio_frame是opus_int16音频数据(或是opus_encode_float())
frame_size是帧中的样本的持续时间(每个通道)
packet是音频数据需要写入的字节数组
max_packet是可写在包的最大字节数(4000字节建议)。不要通过max_packet来控制VBR的比特率,如果需要请使用OPUS_SET_BITRATE CTL。
opus_encode()和opus_encode_float()返回实际写入到分组的字节数。返回值可以是负的,这表示发生了错误。如果返回值是1字节,则分组不需要被发送(DTX)。
当需要释放编码器时,可以通过:
opus_encoder_destroy(enc);
如果编码器,用opus_encoder_init()创建,而不是opus_encoder_create(),则不执行任何操作,只需要释放预先分配的内存,调用free(enc)