Opus:IETF低延迟音频编解码器:API和操作手册
Opus简介
Opus编解码器是专门设计用于互联网的交互式语音和音频传输。它是由IETF的编解码器工作组设计的,合并了Skype的SILK和Xiph. Org的CELT技术。
Opus编解码器的设计目的是处理广泛的交互式音频应用程序,包括IP语音,视频,游戏内聊天,甚至远程现场音乐表演。它可以适用于从低码率窄带语音到非常高质量的立体声音乐。它的主要特点是:
∙采样率从8至48 kHz
∙比特率从6kb/s到510kb/s
∙对固定码率(CBR)和可变码率(VBR)都能支持
∙从窄带到宽带的音频带宽
∙支持语音和音乐
∙支持单声道和立体声
∙支持多通道(最多255通道)
∙帧规格从2.5毫秒到60毫秒
∙良好的损失鲁棒性和包丢失隐藏性(PLC)(注:应是指丢包也不容易被发现)
∙浮点和定点执行
文档包括:
∙Opus Encoder
∙Opus Decoder
∙Repacketizer
∙Opus Multistream API
∙Opus library information functions
∙Opus Custom
Opus Encoder
本节描述了Opus编码器OpusEncoder的过程和函数
类型定义
typedef struct OpusEncoder | OpusEncoder |
Opus encoder 状态. | |
函数
int | opus_encoder_get_size (int channels) |
获得 OpusEncoder结构的大小 | |
OpusEncoder * | opus_encoder_create (opus_int32 Fs, int channels, int application, int *error) |
分配和初始化 encoder状态. | |
int | opus_encoder_init (OpusEncoder *st, opus_int32 Fs, int channels, int application) |
初始化一个以前分配的编码器状态。所指向的内存圣必须至少是opus_encoder_get_size()返回的大小. | |
opus_int32 | opus_encode (OpusEncoder *st, const opus_int16 *pcm, int frame_size, unsigned char *data, opus_int32 max_data_bytes) |
对一个 Opus帧进行编码. | |
opus_int32 | opus_encode_float (OpusEncoder *st, const float *pcm, int frame_size, unsigned char *data, opus_int32 max_data_bytes) |
根据浮点输入对一个 Opus帧进行编码. | |
void | opus_encoder_destroy (OpusEncoder *st) |
释放一个根据opus_encoder_create()已分配的OpusEncoder 对象。 | |
int | opus_encoder_ctl (OpusEncoder *st, int request,...) |
向一个Opus编码器执行一个 CTL 函数. | |
详细描述
本节描述了用于编码Opus的过程和函数。
既然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()返回编码器状态要求的大小。注意,这段代码的未来版本可能改变大小,所以没有assuptions应该对它做出。
编码器状态在内存中总是连续,复制它只要一个浅拷贝就足够了。
使用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));
float()函数在这里:
bitrate(比特率)的单位是比特/秒(b / s)
complexity(复杂性)是一个值从1到10,1最低,10最高,值越大越复杂
signal_type(信号的类型)包括OPUS_AUTO (缺省), OPUS_SIGNAL_VOICE, or OPUS_SIGNAL_MUSIC。
看Encoder related CTLs 和 Generic CTLs可以获得可设置和查询的参数详细清单。在一个音频流处理过程中,大多数参数可以设置或修改。
为了对一个帧进行编码,必须正确地用音频数据的帧(2.5, 5, 10, 20, 40 或60 毫秒)来调用opus_encode() 或opus_encode_float()函数。
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))中分离。
类型定义文档
typedef struct OpusEncoder OpusEncoder
Opus编码器状态。
这包含了一个Opus编码器的完整状态。它是位置独立的,并且可以自由复制。
函数文档
opus_int32 opus_encode ( OpusEncoder * st,
const opus_int16 * pcm,
int frame_size,
unsigned char * data,
opus_int32 max_data_bytes
)
对一个Opus帧进行编码。
参数:
[in] st OpusEncoder*:编码器状态
[in] pcm opus_int16*: 输入信号(如果是2 通道有交叉). 长度是 frame_size*channels*sizeof(opus_int16)
[in] frame_size int:输入信号的每通道样本数. 这必须是编码器采样率的Opus帧大小。比如,48 kHz 下允许值有120, 240, 480, 960, 1920, 和 2880。少于10毫秒的采样(48 kHz 有480个样本),将阻止编码器使用LPC或混合模式。
[out] data unsigned char*: 输出负载。必须包含至少max_data_bytes 的容量。
[in] max_data_bytes opus_int32: 为输出负载所分配的内存大小。可以用于限制固定比特率的最大上限,但不能用作唯一的比特率限制,可以用OPUS_SET_BITRATE来控制比特率。
返回值:成功,是被编码包的长度(字节数),失败,一个负的错误代码
opus_int32 opus_encode_float ( OpusEncoder * st,
const float * pcm,
int frame_size,
unsigned char * data,
opus_int32 max_data_bytes
)
根据浮点输入对一个 Opus帧进行编码.
参数:
[in] st OpusEncoder*:编码器状态
[in] pcm float*:浮点格式的输入(如果是2 通道有交叉),正常范围在+/-1.0之间. 超过该范围的采样也是支持的,但它将被解码器用整型API截取,并且只能在知道远端支持扩展的动态范围的情况下使用。长度是 frame_size*channels*sizeof(float)
[in] frame_size int: 输入信号的每通道样本数. 这必须是编码器采样率的Opus帧大小。比如,48 kHz 下允许值有120, 240, 480, 960, 1920, 和 2880。少于10毫秒的采样(48 kHz 有480个样本),将阻止编码器使用LPC或混合模式。
[out] data unsigned char*:输出负载。必须包含至少max_data_bytes 的容量。
[in] max_data_bytes opus_int32: 为输出负载所分配的内存大小。可以用于限制固定比特率的最大上限,但不能用作唯一的比特率限制,可以用OPUS_SET_BITRATE来控制比特率。.
返回值:
成功,是被编码包的长度(字节数),失败,一个负的错误代码。
OpusEncoder* opus_encoder_create ( opus_int32 Fs,
int channels,
int application,
int * error
)
分配和初始化一个编码器状态。
包括三种编码模式:
OPUS_APPLICATION_VOIP:在给定比特率条件下为声音信号提供最高质量,它通过高通滤波和强调共振峰和谐波增强了输入信号。它包括带内前向错误检查以预防包丢失。典型的VOIP应用程序使用这种模式。由于进行了增强,即使是高比特率的情况下,输出的声音与输入相比,听起来可能不一样。
OPUS_APPLICATION_AUDIO:对大多数非语音信号,如音乐,在给定比特率条件下提供了最高的质量。使用这种模式的场合包括音乐、混音(音乐/声音),广播,和需要不到15 毫秒的
信号延迟的其他应用。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论