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 CTLsGeneric 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小时内删除。