学习libopus(1) Encoder编码器

本文介绍了Opus编码器的创建、配置及使用方法。包括如何初始化编码器、设置编码参数如比特率、复杂度等,以及如何进行音频数据编码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

来自: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)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值