学习libopus(2) Decoder解码器

来源:互联网 发布:微信直播软件 编辑:程序博客网 时间:2024/05/24 07:35

来自:http://www.opus-codec.org/docs/html_api-1.1.0/group__opus__decoder.html

详细说明



本页描述用于解码作品的过程和功能。


在解码过程也是从创建解码器开始的。可以通过这样创建:


int error;
OpusDecoder *dec;
dec = opus_decoder_create(Fs, channels, &error);
在这里


Fs是采样速率,并且必须是8000,12000,16000,24000,或48000
channels是通道的数量(1或2)
error是失败状态下的错误代码好(成功则返回OPUS_OK)




不但可以通过opus_decoder_create()来分配内存空间,也可以使用预分配内存空间:


int size;
int error;
OpusDecoder *dec;
size = opus_decoder_get_size(channels);
dec = malloc(size);
error = opus_decoder_init(dec, Fs, channels);


其中,opus_decoder_get_size()会返回解码器所需的内存大小。请注意,这个大小可能在未来的版本中有所修改,所以尽量不要使用常量代替。


这个解码器会分配到连续的内存块中,可以通过浅拷贝获取他(例如memcpy)


在调用opus_decode()或者opus_decode_float()时必须是一个完整的音频数据


frame_size = opus_decode(dec, packet, len, decoded, max_size, 0);
在这里


packet是包含压缩数据的字节数组
len为字节包的实际长度
decoded是在opus_int16解码音频数据(或opus_decode_float())
MAX_SIZE是decoded_frame数组大小


opus_decode()和opus_decode_float()会返回从每一组样本中解码的样本数(每个通道)。如果该值为负,则发生了错误。这可能发生,如果该分组被损坏或如果音频缓冲区太小不能保存完整的解码音频。


Opus是一个可复用的状态编码,并且作为结果的Opus数据包不能分开编码。数据包必须传递到解码器,并连续按顺序地进解码。丢失的数据包可以通过调用一个空指针和长度为零的数据包来替换。


解码器不能被多个线程同时调用。分离的流必须被单独的解码器进行解码,并且可以并行地解码,除非该库设置了NONTHREADSAFE_PSEUDOSTACK编译。
0 0
原创粉丝点击