Opus_低延迟音频编解码器API手册中文翻译(2)_第1页
Opus_低延迟音频编解码器API手册中文翻译(2)_第2页
Opus_低延迟音频编解码器API手册中文翻译(2)_第3页
Opus_低延迟音频编解码器API手册中文翻译(2)_第4页
Opus_低延迟音频编解码器API手册中文翻译(2)_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.Opus:IETF低延迟音频编解码器:API和操作手册Opus简介Opus编解码器是专门设计用于互联网的交互式语音和音频传输。它是由IETF的编解码器工作组设计的,合并了Skype的SILK和Xiph. Org的CELT技术。Opus编解码器的设计目的是处理广泛的交互式音频应用程序,包括IP语音,视频,游戏内聊天,甚至远程现场音乐表演。它可以适用于从低码率窄带语音到非常高质量的立体声音乐。它的主要特点是:· 采样率从8至48 kHz· 比特率从6kb/s到510kb/s· 对固定码率CBR和可变码率VBR都能支持· 从窄带到宽带的音频带宽·

2、支持语音和音乐· 支持单声道和立体声· 支持多通道最多255通道· 帧规格从2.5毫秒到60毫秒· 良好的损失鲁棒性和包丧失隐藏性PLC注:应是指丢包也不容易被发现· 浮点和定点执行文档包括:· Opus Encoder · Opus Decoder · Repacketizer · Opus Multistream API · Opus library information functions · Opus Custom Opus Encoder 本节描绘了Opus编码器OpusE

3、ncoder的过程和函数类型定义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 Op

4、usEncoder *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_

5、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编码器执

6、行一个 CTL 函数. 详细描绘本节描绘了用于编码Opus的过程和函数。既然Opus是一个有状态的编解码器,编码过程始于创立一个编码器状态,用以下方法做到:int error;OpusEncoder *enc;enc = opus_encoder_createFs, channels, application, &error;从这一点上, enc可以用于编码音频流。一个编码器状态在同一时间不得用于多于一个音频流。同样,编码器状态不能对于每帧重新初始化。当opus_encoder_create为状态分配内存时,它也可以初始化预分配的内存:int size;int error;OpusEn

7、coder *enc;size = opus_encoder_get_sizechannels;enc = mallocsize;error = opus_encoder_initenc, Fs, channels, application;opus_encoder_get_size返回编码器状态要求的大小。注意,这段代码的将来版本可能改变大小,所以没有assuptions应该对它做出。编码器状态在内存中总是连续,复制它只要一个浅拷贝就足够了。使用opus_encoder_ctl接口可以改变一些编码器的参数设置。所有这些参数都已有缺省值,所以只在必要的情况下改变它们。最常见的参数设置修改是:o

8、pus_encoder_ctlenc, OPUS_SET_BITRATEbitrate;opus_encoder_ctlenc, OPUS_SET_COMPLEXITYcomplexity;opus_encoder_ctlenc, OPUS_SET_SIGNALsignal_type;在这里:· bitrate比特率的单位是比特/秒b / s· complexity复杂性是一个值从1到10,1最低,10最高,值越大越复杂· signal_type信号的类型包括OPUS_AUTO 缺省, OPUS_SIGNAL_VOICE, or OPUS_SIGNAL_MUSIC

9、。看Encoder related CTLs 和 Generic CTLs可以获得可设置和查询的参数详细清单。在一个音频流处理过程中,大多数参数可以设置或修改。为了对一个帧进展编码,必须正确地用音频数据的帧2.5, 5, 10, 20, 40 或60 毫秒来调用opus_encode 或opus_encode_float函数。len = opus_encodeenc, audio_frame, frame_size, packet, max_packet;在这里:l audio_frame音频帧是opus_int16或用于opus_encode_float的浮点格式的音频数据l frame_s

10、ize帧大小是样本中帧的最大数每个通道l packet包是写成压缩数据的字节数组, l max_packet是可以写入包的字节数的最大值推荐4000字节。不要使用max_packet控制VBR的目的比特率,而应该用OPUS_SET_BITRATE CTL。opus_encode 和opus_encode_float返回实际写入包的字节数。返回值可以是负数,这说明一个错误已经发生。假设返回值是1个字节,那么包不需要传播DTX。一旦一个编码器状态已不再需要,可以用以下方式解构:opus_encoder_destroyenc;假设编码器是用opus_encoder_init 创立的,而不是使用opu

11、s_encoder_create函数,那么不需要采取行动,要求从潜在的释放为它手动分配的内存上述例子是调用 freeenc中别离。类型定义文档typedef struct OpusEncoder OpusEncoderOpus编码器状态。这包含了一个Opus编码器的完好状态。它是位置独立的,并且可以自由复制。函数文档opus_int32 opus_encode OpusEncoder * st,const opus_int16 * pcm,int frame_size,unsigned char * data,opus_int32 max_data_bytes 对一个Opus帧进展编码。参数:

12、instOpusEncoder*:编码器状态inpcmopus_int16*: 输入信号假设是2 通道有穿插. 长度是 frame_size*channels*sizeofopus_int16inframe_sizeint:输入信号的每通道样本数. 这必须是编码器采样率的Opus帧大小。比方,48 kHz 下允许值有120, 240, 480, 960, 1920, 和 2880。少于10毫秒的采样48 kHz 有480个样本,将阻止编码器使用LPC或混合形式。outdataunsigned char*: 输出负载。必须包含至少max_data_bytes 的容量。inmax_data_byt

13、esopus_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帧进展编码.参数:instOpusEncoder*:编码器状态inpcmfloat*:浮点

14、格式的输入假设是2 通道有穿插,正常范围在+/-1.0之间. 超过该范围的采样也是支持的,但它将被解码器用整型API截取,并且只能在知道远端支持扩展的动态范围的情况下使用。长度是 frame_size*channels*sizeoffloat inframe_sizeint: 输入信号的每通道样本数. 这必须是编码器采样率的Opus帧大小。比方,48 kHz 下允许值有120, 240, 480, 960, 1920, 和 2880。少于10毫秒的采样48 kHz 有480个样本,将阻止编码器使用LPC或混合形式。outdataunsigned char*:输出负载。必须包含至少max_dat

15、a_bytes 的容量。inmax_data_bytesopus_int32: 为输出负载所分配的内存大小。可以用于限制固定比特率的最大上限,但不能用作唯一的比特率限制,可以用OPUS_SET_BITRATE来控制比特率。.返回值:成功,是被编码包的长度字节数,失败,一个负的错误代码。OpusEncoder* opus_encoder_create opus_int32 Fs,int channels,int application,int * error 分配和初始化一个编码器状态。包括三种编码形式:OPUS_APPLICATION_VOIP:在给定比特率条件下为声音信号提供最高质量,它通过

16、高通滤波和强调共振峰和谐波增强了输入信号。它包括带内前向错误检查以预防包丧失。典型的VOIP应用程序使用这种形式。由于进展了增强,即使是高比特率的情况下,输出的声音与输入相比,听起来可能不一样。OPUS_APPLICATION_AUDIO:对大多数非语音信号,如音乐,在给定比特率条件下提供了最高的质量。使用这种形式的场合包括音乐、混音音乐/声音,播送,和需要不到15 毫秒的信号延迟的其他应用。OPUS_APPLICATION_RESTRICTED_LOWDELAY:配置低延迟形式将为减少延迟禁用语音优化形式。这种形式只能在刚初始化或刚重设编码器的情况下使用,因为在这些情况下编解码器的延迟被修改

17、了。注意!当调用者知道语音优化形式不再需要时,配置低延迟形式是有用的。参数:inFsopus_int32: 输入信号的采样率 Hz,必须是8000、12000、16000、24000、或48000。inchannelsint:输入信号的通道数 1 or 2 。inapplicationint:编码形式OPUS_APPLICATION_VOIP/OPUS_APPLICATION_AUDIO/OPUS_APPLICATION_RESTRICTED_LOWDELAYouterrorint*: 错误代码注意:无论选择什么样的采样率和通道数, 假设选择的比特率太低,Opus编码器可以切换到一个较低的音频

18、带宽或通道数。这也意味着总是使用48 kHz立体声输入和让编码器优化编码是平安的。int opus_encoder_ctl OpusEncoder * st,int request, . 向一个Opus编码器执行一个 CTL 函数.一般其恳求和后续的参数是由一个提供便利的宏来产生的。参数: stOpusEncoder*: 编码器状态 request int:这个及所有其他参数应被1个在Generic CTLs 或Encoder related CTLs所提供便利的宏来替代参见: Generic CTLs Encoder related CTLsvoid opus_encoder_destroy

19、 OpusEncoder * st Frees an OpusEncoder allocated by opus_encoder_create.释放一个根据opus_encoder_create已分配的OpusEncoder 对象。参数: instOpusEncoder*: 用于释放的编码器状态。int opus_encoder_get_size int channels 获得 OpusEncoder构造的大小。参数: inchannelsint: 通道数,必须是1或2.返回: 字节数的大小.int opus_encoder_init OpusEncoder * st,opus_int32 F

20、s,int channels,int application 初始化一个以前分配的编码器状态。状态所指向的内存必须至少是opus_encoder_get_size返回的大小.在这里,应用程序不要用系统自动分配内存,而要准备用自己的分配器。参见: opus_encoder_create,opus_encoder_get_size。为重设一个以前初始化的状态,使用OPUS_RESET_STATE CTL.参数: instOpusEncoder*: 编码器状态 inFsopus_int32: 输入信号的采样率 Hz,必须是8000、12000、16000、24000、或48000。 inchanne

21、lsint: 输入信号的通道数 1 or 2 inapplicationint: 编码形式OPUS_APPLICATION_VOIP/OPUS_APPLICATION_AUDIO/OPUS_APPLICATION_RESTRICTED_LOWDELAY返回值: 成功,OPUS_OK,失败,错误代码。Opus Decoder 本节描绘了Opus解码器OpusDecoder的过程和函数类型定义typedef struct OpusDecoder OpusDecoder Opus 解码器状态. 函数int opus_decoder_get_size int channe

22、ls 获得OpusDecoder 构造的大小. OpusDecoder * opus_decoder_create opus_int32 Fs, int channels, int *error 分配和初始化解码器状态. int opus_decoder_init OpusDecoder *st, opus_int32 Fs, int channels 初始化以前分配的解码器状态. int opus_decode OpusDecoder *st, const unsigned char *data, opus_int32 len, o

23、pus_int16 *pcm, int frame_size, int decode_fec 解码一个 Opus 包. int opus_decode_float OpusDecoder *st, const unsigned char *data, opus_int32 len, float *pcm, int frame_size, int decode_fec 解码一个浮点输出的Opus 包,. int opus_decoder_ctl OpusDecoder *st, int request,. 向一个Opus解码器执行CTL 函数。

24、void opus_decoder_destroy OpusDecoder *st 释放通过opus_decoder_create.分配过的OpusD opus_packet_parse const unsigned char *data, opus_int32 len, unsigned char *out_toc, const unsigned char *frames48, short size48, int *payload_offset 将一个 opus 包解析成1个或多个帧. int opus_packet_ge

25、t_bandwidth const unsigned char *data 获得一个 Opus包的带宽. int opus_packet_get_samples_per_frame const unsigned char *data, opus_int32 Fs 获得Opus 包每帧的样本数。 int opus_packet_get_nb_channels const unsigned char *data 获得Opus 包的通道数。int opus_packet_get_nb_frames const unsigned char p

26、acket, opus_int32 len 获得Opus 包所有帧的数量. int opus_packet_get_nb_samples const unsigned char packet, opus_int32 len, opus_int32 Fs 获得Opus 包的样本数。int opus_decoder_get_nb_samples const OpusDecoder *dec, const unsigned char packet, opus_int32 len 获得Opus 包的样本数。详细描绘本节描绘了用于解码Opus的过程和方法

27、.与编码相似,解码进程也是开场于创立一个解码器状态。用以下方法做到:int error;OpusDecoder *dec;dec = opus_decoder_createFs, channels, &error;在这里:n Fs 是采样率,必须是8000, 12000, 16000, 24000, 或 48000n channels 是通道数 1 或 2n error 将保存出错情况下的错误代码或成功状态下的 OPUS_OK n 返回值是一个新创立的用于解码的解码器状态当 opus_decoder_create 为状态分配内存时, 它也可以初始化预分配的内存:int size;int

28、 error;OpusDecoder *dec;size = opus_decoder_get_sizechannels;dec = mallocsize;error = opus_decoder_initdec, Fs, channels;opus_decoder_get_size返回解码器状态要求的大小. 注意,这段代码的将来版本可能改变大小,所以没有assuptions应该对它做出。解码器状态在内存中总是连续,复制它只要一个浅拷贝就足够了。为解码一个帧, opus_decode 或 opus_decode_float必须用压缩音频数据的包来调用:frame_size = opus_dec

29、odedec, packet, len, decoded, max_size, 0;在这里n packet 是包含压缩数据的字节数组n len 是包内字节的准确数量n decoded 是opus_int16 或由 opus_decode_float定义的浮点型格式的解码后的音频数据。n max_size是可以放入解码帧的每个通道各样本中帧的最大值opus_decode 和 opus_decode_float 返回从包解码后的每通道样本的数量。假设这个值是负的,表示有错误发生。假设包损坏或音频缓冲太小缺乏以包容解码后的音频,错误就会发生。Opus是包含重叠块的有状态的编解码器,其结果是Opus

30、包并不是彼此独立编码。包必须按正确的次序,连续地进入解码器进展正确的解码。丧失的包可以用遗失隐藏来交换,遗失隐藏用一个空的指针和0长度的包来调用解码器。一个单独的编解码器状态在一个时间只能由一个单独的线程来访问,调用者执行任何需要的锁定。各分开的音频数据流可以用各自分开的解码器状态平行地进展解码,除非API库在编译时用了NONTHREADSAFE_PSEUDOSTACK定义。类型定义文档typedef struct OpusDecoder OpusDecoderOpus 解码器状态.这包含了一个Opus解码器的完好状态。它是位置独立的,并且可以自由复制。参见: opus_decoder_cre

31、ate,opus_decoder_init函数文档int opus_decode OpusDecoder * st,const unsigned char * data,opus_int32 len,opus_int16 * pcm,int frame_size,int decode_fec 对一个Opus包进展解码。参数: instOpusDecoder*: 解码器状态 indatachar*:输入负载.对包丧失使用一个空指针来表示。 inlenopus_int32:在输入负载中的字节数 outpcmopus_int16*: 输出信号假设是2通道有穿插。长度等于frame_size*chan

32、nels*sizeofopus_int16 inframe_size:在PCM可用空间中每通道的样本数。假设小于最大包的时长120毫秒,4848kHz5760个,这个函数将不能解码一些包。假设是PLC data=NULL 或 FEC decode_fec=1的情况,那么frame_size必须正好是丧失音频的时长,否那么解码器无法在解码下一个包时进入优化状态。对于PLC 和 FEC 的情况,frame_size必须是2.5毫秒的倍数。 indecode_fecint: 对于恳求任何带内前向错误纠正数据进展解码的状态标志 0 or 1 。假设没有这样的数据可用,帧在解码时被认为已经丧失。返回:

33、解码样本的数量,或错误代码。int opus_decode_float OpusDecoder * st,const unsigned char * data,opus_int32 len,float * pcm,int frame_size,int decode_fec 用浮点输出格式解码一个Opus包。参数: instOpusDecoder*: 解码器状态 indatachar*:输入负载.对包丧失使用一个空指针来表示。 inlenopus_int32: 在输入负载中的字节数 outpcmfloat*:输出信号假设是2通道有穿插。长度等于frame_size*channels*sizeof

34、float inframe_size:在PCM可用空间中每通道的样本数。假设小于最大包的时长120毫秒,4848kHz5760个,这个函数将不能解码一些包。假设是PLC data=NULL 或 FEC decode_fec=1的情况,那么frame_size必须正好是丧失音频的时长,否那么解码器无法在解码下一个包时进入优化状态。对于PLC 和 FEC 的情况,frame_size必须是2.5毫秒的倍数。 indecode_fecint: 对于恳求任何带内前向错误纠正数据进展解码的状态标志 0 or 1 。假设没有这样的数据可用,帧在解码时被认为已经丧失。返回: 解码样本的数量,或错误代码。Op

35、usDecoder* opus_decoder_create opus_int32 Fs,int channels,int * error 分配和初始化解码器状态.参数: inFsopus_int32: 解码的采样率 Hz. 必须是 8000, 12000, 16000, 24000, 或 48000. inchannelsint: 用于解码的通道数1 or 2 outerrorint*:成功时是 OPUS_OK Success或错误代码Opus在内部用48000 Hz来存储数据,所以对于FS来说48000 Hz是缺省值。然而,解码器在8, 12, 16, 和 24 kHz下也可以有效解码到缓

36、冲,所以,由于某些原因调用者不能在全采样率下使用数据,或知道被压缩的数据不能在全频率范围内使用,可以恳求用更小的频率解码。同样的,解码器可以根据调用者的恳求,填充单声道或穿插立体声的PCM缓冲区。int opus_decoder_ctl OpusDecoder * st,int request, . 向一个Opus解码器执行一个 CTL 函数.一般其恳求和后续的参数是由一个提供便利的宏来产生的。参数:n stOpusDecoder*: 解码器状态.n request:这个及所有其他剩余参数应被1个在Generic CTLs 或Encoder related CTLs所提供便利的宏来替代参见:

37、Generic CTLs Decoder related CTLs void opus_decoder_destroy OpusDecoder * st 释放一个根据opus_decoder_create已分配的OpusDecoder 对象.参数: instOpusDecoder*:用于释放的解码器状态。int opus_decoder_get_nb_samples const OpusDecoder * dec,const unsigned char packet,opus_int32 len 获得一个Opus包的样本数参数: indecOpusDecoder*: 解码器状态 inpacke

38、tchar*: Opus包 inlenopus_int32: 包的长度返回: 样本的数量返回值: OPUS_INVALID_PACKET:通过的被压缩数据已损坏或其格式不被支持。int opus_decoder_get_size int channels 获得 OpusDecoder构造的大小。参数: inchannelsint: 通道数,必须是1或2.返回: 字节数的大小.int opus_decoder_init OpusDecoder * st,opus_int32 Fs,int channels 初始化一个以前分配过的解码器状态.状态必须至少是opus_decoder_get_size

39、返回的大小.在这里,应用程序不要用系统自动分配内存,而要准备用自己的分配器。参见: opus_decoder_create,opus_decoder_get_size,为重设一个以前初始化的状态,使用OPUS_RESET_STATE CTL.参数: instOpusDecoder*: 解码器状态. inFsopus_int32: 准备解码的采样率 Hz. 必须是8000、12000、16000、24000、或48000. inchannelsint: 解码的通道数 1 or 2返回值: 成功,OPUS_OK,失败,错误代码。int opus_packet_get_bandwidth const

40、 unsigned char * data 获得一个Opus包的带宽。参数: indatachar*: Opus 包返回值:n OPUS_BANDWIDTH_NARROWBAND窄带 4kHz bandpassn OPUS_BANDWIDTH_MEDIUMBAND中等带宽 6kHz bandpassn OPUS_BANDWIDTH_WIDEBAND宽带 8kHz bandpassn OPUS_BANDWIDTH_SUPERWIDEBAND高宽带 12kHz bandpassn OPUS_BANDWIDTH_FULLBAND全宽带 20kHz bandpassn OPUS_INVALID_PAC

41、KET通过的被压缩数据已损坏或其格式不被支持int opus_packet_get_nb_channels const unsigned char * data 获得Opus 包的通道数。参数: indatachar*: Opus 包返回: 通道数量返回值: OPUS_INVALID_PACKET通过的被压缩数据已损坏或其格式不被支持int opus_packet_get_nb_frames const unsigned char packet,opus_int32 len 获得Opus 包所有帧的数量.参数: inpacketchar*: Opus 包 inlenopus_int32:包的长

42、度返回: 帧的数量返回值: OPUS_INVALID_PACKET通过的被压缩数据已损坏或其格式不被支持int opus_packet_get_nb_samples const unsigned char packet,opus_int32 len,opus_int32 Fs 获得Opus 包的样本数。参数: inpacketchar*: Opus 包 inlenopus_int32: 包的长度 inFsopus_int32: 采样率Hz. 必须是400的倍数,否那么结果不准确。返回: 样本的数量返回值: OPUS_INVALID_PACKET通过的被压缩数据已损坏或其格式不被支持int op

43、us_packet_get_samples_per_frame const unsigned char * data,opus_int32 Fs 获得Opus 包每帧的样本数。参数: indatachar*: Opus 包. 必须包含至少一个字节的数据。 inFsopus_int32: 采样率Hz.必须是400的倍数,否那么结果不准确。返回: 每帧样本的数量. int opus_packet_parse const unsigned char * data,opus_int32 len,unsigned char * out_toc,const unsigned char * frames48

44、,short size48,int * payload_offset 将一个 opus 包解析成1个或多个帧.Opus_decode在内部执行这个操作,所以大多数应用程序不需要用到这个函数。这个函数不复制各帧,返回的指针是输入包内部的指针。参数: indatachar*:要进展解析的 Opus包 inlenopus_int32: 数据的大小 outout_tocchar*: TOC 指针 outframeschar*48 封装过的帧 outsizeshort48 封装过的帧的大小 outpayload_offsetint*: 返回在包内负载的位置按字节返回: 帧的数量Repacketizer

45、Repacketizer可将多个包Opus合并成一个包,或将以前合并的包别离成多个Opus包。类型定义typedef struct OpusRepacketizer OpusRepacketizer函数int opus_repacketizer_get_size void 获得 OpusRepacketizer构造的大小OpusRepacketizer * opus_repacketizer_init OpusRepacketizer *rp 重新初始化以前分配过的repacketizer 状态. OpusRepacketizer * 

46、;opus_repacketizer_create void 为用opus_repacketizer_init产生的新repacketizer 分配内存和初始化。 void opus_repacketizer_destroy OpusRepacketizer *rp 释放通过opus_repacketizer_create分配过的OpusRepacketizer int opus_repacketizer_cat OpusRepacketizer *rp, const unsigned char *data, opus_int32 len 给当

47、前的repacketizer 状态增加一个包。 opus_int32 opus_repacketizer_out_range OpusRepacketizer *rp, int begin, int end, unsigned char *data, opus_int32 maxlen 通过opus_repacketizer_cat从以前提交给repacketizer状态的数据构建一个新的包。int opus_repacketizer_get_nb_frames OpusRepacketizer *rp 返回最后一次调用opus_repacketizer

48、_init 或 opus_repacketizer_create后,到当前为止通过opus_repacketizer_cat提交的包数据所包含的帧的总数。 opus_int32 opus_repacketizer_out OpusRepacketizer *rp, unsigned char *data, opus_int32 maxlen 通过opus_repacketizer_cat从以前提交给repacketizer状态的数据构建一个新的包。详细描绘Repacketizer可将多个包Opus合并成一个包,或将以前合并的包别离成多个Opus包。别离有效的包可以保证成功,

49、然而,只有在所有的帧都有一样的编码形式、带宽、帧大小,并且合并后的包总的时长不超过120毫秒,合并有效的包才能成功。对多流包的操作不会成功,除了这些包由来自同一音频流的数据组成的退化情况。重构包的过程开场于创立一个repacketizer状态,创立既可以通过调用opus_repacketizer_create函数也可以通过自己分配内存的方式来进展,例如OpusRepacketizer *rp;rp = OpusRepacketizer*mallocopus_repacketizer_get_size;if rp != NULLopus_repacketizer_initrp;之后应用程序应通过

50、opus_repacketizer_cat来提交包,用opus_repacketizer_out或opus_repacketizer_out_range提取新的包,然后通过opus_repacketizer_init为下一套输入包重设状态。下面的例子中,将一个系列的包别离成各单独的帧:unsigned char *data;int len;while get_next_packet&data, &lenunsigned char out1276;opus_int32 out_len;int nb_frames;int err;int i;err = opus_repacketi

51、zer_catrp, data, len;if err != OPUS_OKrelease_packetdata;return err;nb_frames = opus_repacketizer_get_nb_framesrp;for i = 0; i < nb_frames; i+out_len = opus_repacketizer_out_rangerp, i, i+1, out, sizeofout;if out_len < 0release_packetdata;return intout_len;output_next_packetout, out_len;opus_r

52、epacketizer_initrp;release_packetdata;可选择将一个系列的帧合并到各个包中,每个包包含最多TARGET_DURATION_MS毫秒的数据:/ The maximum number of packets with duration TARGET_DURATION_MS occurs/ when the frame size is 2.5 ms, for a total of TARGET_DURATION_MS*2/5/ packets.unsigned char *dataTARGET_DURATION_MS*2/5+1;opus_int32 lenTARG

53、ET_DURATION_MS*2/5+1;int nb_packets;unsigned char out1277*TARGET_DURATION_MS*2/2;opus_int32 out_len;int prev_toc;nb_packets = 0;while get_next_packetdata+nb_packets, len+nb_packetsint nb_frames;int err;nb_frames = opus_packet_get_nb_framesdatanb_packets, lennb_packets;if nb_frames < 1release_packetsdata, nb_packet

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论