您的位置:首页 > 运维架构

学习libopus(1) Encoder编码器

2015-06-23 13:42 597 查看
来自: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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  opus