Opus_低延迟音频编解码器API手册中文翻译

上传人:文*** 文档编号:21556868 上传时间:2021-05-04 格式:DOCX 页数:76 大小:153.03KB
返回 下载 相关 举报
Opus_低延迟音频编解码器API手册中文翻译_第1页
第1页 / 共76页
Opus_低延迟音频编解码器API手册中文翻译_第2页
第2页 / 共76页
Opus_低延迟音频编解码器API手册中文翻译_第3页
第3页 / 共76页
点击查看更多>>
资源描述
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 EncoderOpus DecoderRepacketizerOpus Multistream APIOpus library information functionsOpus CustomOpus Encod er本节描述了 Opus 编码器 OpusEncoder的过程和函数类型定义typedefstructOpusEncoderOpusEncoder Opus encoder状态 .函数intopus_encoder_get_size (int channels)获得 OpusEncoder结构的大小OpusEncoderopus_encoder_create (opus_int32 Fs, int channels, int application,int*error)分配和初始化 encoder 状态 .intopus_encoder_init(OpusEncoder *st, opus_int32 Fs, int channels,intapplication)初始化一个以前分配的编码器状态。所指向的内存圣必须至少是opus_encoder_get_size() 返回的大小 .opus_int32opus_encode (OpusEncoder *st, const opus_int16 *pcm, int frame_size,unsigned char *data, opus_int32 max_data_bytes)对一个 Opus 帧进行编码 .opus_int32opus_encode_float(OpusEncoder *st, const float *pcm, int frame_size,unsigned char *data, opus_int32 max_data_bytes)根据浮点输入对一个Opus 帧进行编码 .voidopus_encoder_destroy (OpusEncoder *st)释放一个根据 opus_encoder_create() 已分配的 OpusEncoder 对象。intopus_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);在这里:bitrate(比特率)的单位是比特/ 秒 (b / s)complexity(复杂性)是一个值从1 到10,1最低, 10最高,值越大越复杂signal_type(信号的类型)包括OPUS_AUTO (缺省 ), OPUS_SIGNAL_VOICE, orOPUS_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_BITRATECTL。opus_encode()和 opus_encode_float() 返回实际写入包的字节数。返回值可以是负数 ,这表明一个错误已经发生。 如果返回值是 1 个字节 ,那么包不需要传播 (DTX)。一旦一个编码器状态已不再需要,可以用以下方式解构:opus_encoder_destroy (enc);如果编码器是用 opus_encoder_init()创建的,而不是使用 opus_encoder_create()函数,那么不需要采取行动,要求从潜在的释放为它手动分配的内存 (上述例子是调用 free(enc)中分离。类型定义文档typedef struct OpusEncoder OpusEncoderOpus编码器状态。这包含了一个 Opus编码器的完整状态。它是位置独立的,并且可以自由复制。函数文档opus_int32 opus_encode(OpusEncoder *const opus_int16 *pcm,intframe_size,unsigned char *data,opus_int32max_data_bytesst,)对一个 Opus 帧进行编码。参数:in stOpusEncoder*:编码器状态in pcmopus_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或混合模式。outdataunsigned char*: 输出负载。必须包含至少 max_data_bytes的容量。in max_data_bytes opus_int32: 为输出负载所分配的内存大小。 可以用于限制 固 定 比 特 率 的 最 大 上 限 , 但 不 能 用作 唯 一 的 比特 率限 制 ,可 以用OPUS_SET_BITRATE来控制比特率。返回值:成功,是被编码包的长度(字节数),失败,一个负的错误代码opus_int32 opus_encode_float(OpusEncoder *st,const float *pcm,intframe_size,unsigned char *data,opus_int32max_data_bytes)根据浮点输入对一个Opus 帧进行编码 .参数:in stOpusEncoder*:编码器状态in pcmfloat*: 浮点格式的输入 (如果是 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_int32Fs,intchannels,intapplication,int *error)分配和初始化一个编码器状态。包括三种编码模式:OPUS_APPLICATION_VOIP:在给定比特率条件下为声音信号提供最高质量,它通过高通滤波和强调共振峰和谐波增强了输入信号。它包括带内前向错误检查以预防包丢失。典型的VOIP 应用程序使用这种模式。由于进行了增强,即使是高比特率的情况下,输出的声音与输入相比,听起来可能不一样。OPUS_APPLICATION_AUDIO:对大多数非语音信号,如音乐,在给定比特率条件下提供了最高的质量。使用这种模式的场合包括音乐、混音(音乐 / 声音 ),广播 ,和需要不到 15 毫秒的信号延迟的其他应用。OPUS_APPLICATION_RESTRICTED_LOWDELAY:配置低延迟模式将为减少延迟禁用语音优化模式。 这种模式只能在刚初始化或刚重设编码器的情况下使用, 因为在这些情况下编解码器的延迟被修改了。(当心!)当调用者知道语音优化模式不再需要时,配置低延迟模式是有用的。参数:in Fs opus_int32: 输入信号的采样率(Hz),必须是 8000、12000、 16000、24000、或 48000。in channelsint: 输入信号的通道数(1 or 2) 。in applicationint:编码模式(OPUS_APPLICATION_VOIP/OPUS_APPLICATION_AUDIO/OPUS_APPLICATION_RESTRI CTED_LOWDELAY)outerrorint*:错误代码注意:无论选择什么样的采样率和通道数, 如果选择的比特率太低,Opus编码器可以切换到一个较低的音频带宽或通道数。这也意味着总是使用48 kHz立体声输入和让编码器优化编码是安全的。int opus_encoder_ctl(OpusEncoder *st,intrequest,.)向一个 Opus 编码器执行一个CTL 函数 .一般其请求和后续的参数是由一个提供便利的宏来产生的。参数 :st OpusEncoder*: 编码器状态requestint :这个及所有其他参数应被1 个在 Generic CTLs或 Encoderrelated CTLs所提供便利的宏来替代参见 :Generic CTLsEncoder related CTLsvoid opus_encoder_destroy ( OpusEncoder * st ) Frees an OpusEncoder allocated by opus_encoder_create().释放一个根据opus_encoder_create() 已分配的OpusEncoder对象。参数 :instOpusEncoder*:用于释放的编码器状态。int opus_encoder_get_size(intchannels)获得OpusEncoder 结构的大小。参数 :inchannelsint: 通道数,必须是 1 或 2.返回 :字节数的大小 .int opus_encoder_init(OpusEncoder *st,opus_int32Fs,intchannels,intapplication)初始化一个以 前分配的 编码器状态。 状态所指向的内存必 须至少 是opus_encoder_get_size()返回的大小 .在这里,应用程序不要用系统自动分配内存,而要准备用自己的分配器。参见 :opus_encoder_create(),opus_encoder_get_size()。为重设一个以前初始化的状态,使用 OPUS_RESET_STATE CTL.参数 :ininstOpusEncoder*: 编码器状态Fs opus_int32: 输入信号的采样率(Hz),必须是8000、12000、16000、24000、或 48000。inchannelsint: 输入信号的通道数(1 or 2)inapplicationint:编码模式(OPUS_APPLICATION_VOIP/OPUS_APPLICATION_AUDIO/OPUS_APPLICATION_RESTRICTED_LOWDELAY)返回值 :成功, OPUS_OK,失败,错误代码。Opus Decod er本节描述了 Opus 解码器 OpusDecoder的过程和函数类型定义typedef struct OpusDecoderOpusDecoderOpus 解码器状态 .函数intopus_decoder_get_size (int channels)获得 OpusDecoder 结构的大小 .OpusDecoder* opus_decoder_create (opus_int32 Fs, int channels, int *error)分配和初始化解码器状态.intopus_decoder_init (OpusDecoder *st, opus_int32 Fs, int channels)初始化以前分配的解码器状态 .intopus_decode (OpusDecoder *st, const unsigned char *data, opus_int32len, opus_int16 *pcm, int frame_size, int decode_fec)解码一个Opus 包 .intopus_decode_float(OpusDecoder *st, const unsigned char*data,opus_int32 len, float *pcm, int frame_size, int decode_fec)解码一个浮点输出的Opus 包, .intopus_decoder_ctl (OpusDecoder *st, int request,.)向一个 Opus 解码器执行 CTL 函数。voidopus_decoder_destroy (OpusDecoder *st)释放通过 opus_decoder_create() .分配过的 OpusDecoder。intopus_packet_parse(constunsigned char *data, opus_int32len,unsigned char *out_toc, const unsigned char *frames48, short size48,int *payload_offset)将一个opus 包解析成 1 个或多个帧 .intopus_packet_get_bandwidth(const unsigned char *data)获得一个Opus 包的带宽 .intopus_packet_get_samples_per_frame (const unsignedchar*data,opus_int32 Fs)获得 Opus 包每帧的样本数。intopus_packet_get_nb_channels(const unsigned char *data)获得 Opus 包的通道数。intopus_packet_get_nb_frames (const unsigned char packet,opus_int32len)获得 Opus 包所有帧的数量 .intopus_packet_get_nb_samples (const unsigned char packet, opus_int32len, opus_int32 Fs)获得 Opus 包的样本数。intopus_decoder_get_nb_samples(const OpusDecoder*dec,constunsigned char packet, opus_int32 len)获得 Opus 包的样本数。详细描述本节描述了用于解码Opus 的过程和方法 .与编码相似,解码进程也是开始于创建一个解码器状态。用以下方法做到: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()返回解码器状态要求的大小. 注意 ,这段代码的未来版本可能改变大小 ,所以没有 assuptions 应该对它做出。解码器状态在内存中总是连续,复制它只要一个浅拷贝就足够了。为解码一个帧 , 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是可以放入解码帧的每个通道各样本中帧的最大值opus_decode() 和 opus_decode_float() 返回从包解码后的每通道样本的数量。如果这个值是负的,表示有错误发生。如果包损坏或音频缓冲太小不足以容纳解码后的音频,错误就会发生。Opus 是包含重叠块的有状态的编解码器,其结果是Opus 包并不是彼此独立编码。包必须按正确的次序,连续地进入解码器进行正确的解码。丢失的包可以用遗失隐藏来替换, 遗失隐藏用一个空的指针和0 长度的包来调用解码器。一个单独的编解码器状态在一个时间只能由一个单独的线程来访问,调用者执行任何需要的锁定。 各分开的音频数据流可以用各自分开的解码器状态平行地进行解码,除非 API库在编译时用了 NONTHREADSAFE_PSEUDOSTACK定义。类型定义文档typedef struct OpusDecoder OpusDecoderOpus 解码器状态 .这包含了一个 Opus 解码器的完整状态。 它是位置独立的, 并且可以自由复制。参见 :opus_decoder_create,opus_decoder_init函数文档int opus_decode(OpusDecoder *const unsigned char *data,opus_int32len,opus_int16 *pcm,intframe_size,intdecode_fecst,)对一个 Opus 包进行解码。参数 :in stOpusDecoder*: 解码器状态in datachar*:输入负载 .对包丢失使用一个空指针来表示。in len opus_int32:在输入负载中的字节数outpcmopus_int16*: 输出信号(如果是 2 通道有交叉)。长度等于 frame_size*channels*sizeof(opus_int16)in frame_size :在 PCM 可用空间中每通道的样本数。如果小于最大包的时长( 120 毫秒, 4848kHz5760个),这个函数将不能解码一些包。如果是 PLC (data=NULL)或 FEC (decode_fec=1)的情况,那么 frame_size 必须正好是丢失音频的时长,否则解码器无法在解码下一个包时进入优化状态。对于 PLC 和 FEC 的情况, frame_size 必须是 2.5 毫秒的倍数。in decode_fec int: 对于请求任何带内前向错误纠正数据进行解码的状态标志(0 or 1) 。如果没有这样的数据可用,帧在解码时被认为已经丢失。返回 :解码样本的数量,或错误代码。int opus_decode_float(OpusDecoder *const unsigned char *data,opus_int32len,float *pcm,intframe_size,intdecode_fecst,)用浮点输出格式解码一个Opus 包。参数 :in stOpusDecoder*: 解码器状态in datachar*:输入负载 .对包丢失使用一个空指针来表示。in len opus_int32: 在输入负载中的字节数outpcmfloat*: 输出信号(如果是2 通道有交叉) 。长度等于frame_size*channels*sizeof(float)in frame_size :在 PCM 可用空间中每通道的样本数。如果小于最大包的时长( 120 毫秒, 4848kHz5760个),这个函数将不能解码一些包。如果是 PLC (data=NULL)或 FEC (decode_fec=1)的情况,那么 frame_size 必须正好是丢失音频的时长,否则解码器无法在解码下一个包时进入优化状态。对于 PLC 和 FEC 的情况, frame_size 必须是 2.5 毫秒的倍数。in decode_fec int: 对于请求任何带内前向错误纠正数据进行解码的状态标志(0 or 1) 。如果没有这样的数据可用,帧在解码时被认为已经丢失。返回 :解码样本的数量,或错误代码。OpusDecoder* opus_decoder_create (opus_int32Fs,intchannels,int *error)分配和初始化解码器状态.参数 :in Fs opus_int32: 解码的采样率(Hz). 必须是8000, 12000, 16000,24000,或48000.in channelsouterrorint: 用于解码的通道数 (1 or 2)int*: 成功时是OPUS_OK Success或错误代码Opus 在内部用 48000 Hz来存储数据,所以对于 FS来说 48000 Hz 是缺省值。然而,解码器在 8, 12, 16, 和 24 kHz下也可以有效解码到缓冲,所以,由于某些原因调用者不能在全采样率下使用数据, 或知道被压缩的数据不能在全频率范围内使用,可以请求用更小的频率解码。同样的,解码器可以根据调用者的请求,填充单声道或交叉立体声的PCM缓冲区。int opus_decoder_ctl(OpusDecoder *st,intrequest,.)向一个 Opus 解码器执行一个CTL 函数 .一般其请求和后续的参数是由一个提供便利的宏来产生的。参数 :stOpusDecoder*: 解码器状态 .request :这个及所有其他剩余参数应被1 个在Generic CTLs 或Encoder related CTLs所提供便利的宏来替代参见 :Generic CTLsDecoder related CTLsvoid opus_decoder_destroy(OpusDecoder *st)释放一个根据 opus_decoder_create()已分配的 OpusDecoder 对象 .参数 :in stOpusDecoder*:用于释放的解码器状态。int opus_decoder_get_nb_samples(const OpusDecoder *const unsigned charpacket,opus_int32lendec,)获得一个 Opus 包的样本数参数 :in dec OpusDecoder*: 解码器状态in packetchar*: Opus 包in len opus_int32: 包的长度返回 :样本的数量返回值 :OPUS_INVALID_PACKET:通过的被压缩数据已损坏或其格式不被支持。int opus_decoder_get_size(intchannels)获得 OpusDecoder结构的大小。参数 :in channelsint: 通道数,必须是 1 或 2.返回 :字节数的大小 .int opus_decoder_init(OpusDecoder *st,opus_int32Fs,intchannels)初始化一个以前分配过的解码器状态.状态必须至少是 opus_decoder_get_size()返回的大小 .在这里,应用程序不要用系统自动分配内存,而要准备用自己的分配器。参见 :opus_decoder_create,opus_decoder_get_size,为重设一个以前初始化的状态,使用OPUS_RESET_STATE CTL.参数 :in stOpusDecoder*:解码器状态.in Fs opus_int32:准备解码的采样率(Hz).必须是8000、12000、16000、24000、或48000.in channelsint: 解码的通道数(1 or 2)返回值 :成功, OPUS_OK ,失败,错误代码。int opus_packet_get_bandwidth(const unsigned char *data)获得一个 Opus 包的带宽。参数 :in datachar*: Opus 包返回值 :OPUS_BANDWIDTH_NARROWBAND窄带 (4kHz bandpass)OPUS_BANDWIDTH_MEDIUMBAND中等带宽(6kHz bandpass)OPUS_BANDWIDTH_WIDEBAND宽带 (8kHz bandpass)OPUS_BANDWIDTH_SUPERWIDEBAND高 宽 带 (12kHz bandpass)OPUS_BANDWIDTH_FULLBAND全宽带 (20kHz bandpass) OPUS_INVALID_PACKET通过的被压缩数据已损坏或其格式不被支持int opus_packet_get_nb_channels(const unsigned char *data)获得 Opus 包的通道数。参数 :in datachar*: Opus 包返回 :通道数量返回值 :OPUS_INVALID_PACKET通过的被压缩数据已损坏或其格式不被支持int opus_packet_get_nb_frames(const unsigned charpacket,opus_int32len)获得 Opus 包所有帧的数量 .参数 :in packetchar*: Opus 包in len opus_int32:包的长度返回 :帧的数量返回值 :OPUS_INVALID_PACKET通过的被压缩数据已损坏或其格式不被支持int opus_packet_get_nb_samplespacket,opus_int32len,opus_int32Fs(constunsignedchar)获得 Opus 包的样本数。参数 :in packetchar*: Opus 包in len opus_int32: 包的长度in Fs opus_int32: 采样率( Hz). 必须是 400 的倍数,否则结果不准确。返回 :样本的数量返回值 :OPUS_INVALID_PACKET通过的被压缩数据已损坏或其格式不被支持int opus_packet_get_samples_per_frame ( const unsigned char * data,opus_int32Fs)获得 Opus 包每帧的样本数。参数 :in datachar*: Opus 包. 必须包含至少一个字节的数据。in Fs opus_int32: 采样率( Hz) .必须是 400 的倍数,否则结果不准确。返回 :每帧样本的数量 .int opus_packet_parse(const unsigned char *opus_int32len,unsigned char *out_toc,const unsigned char *frames48,shortsize48,int *payload_offsetdata,)将一个opus 包解析成 1 个或多个帧 .Opus_decode 在内部执行这个操作,所以大多数应用程序不需要用到这个函数。这个函数不复制各帧,返回的指针是输入包内部的指针。参数 :in datachar*:要进行解析的Opus包in len opus_int32: 数据的大小outout_toc char*: TOC 指针outframes char*48 封装过的帧outsize short48 封装过的帧的大小outpayload_offsetint*:返回在包内负载的位置(按字节 )返回 :帧的数量RepacketizerRepacketizer可将多个包 Opus 合并成一个包,或将以前合并的包分离成多个 Opus 包。类型定义typedef struct OpusRepacketizerOpusRepacketizer函数intopus_repacketizer_get_size (void)获得 OpusRepacketizer 结构的大小OpusRepacketizer* opus_repacketizer_init (OpusRepacketizer *rp)(重新 )初始化以前分配过的 repacketizer 状态 .OpusRepacketizer* opus_repacketizer_create (void)为用 opus_repacketizer_init() 产生的新 repacketizer 分配内存和初始化。voidopus_repacketizer_destroy(OpusRepacketizer *rp)释 放 通 过opus_repacketizer_create() 分 配过的OpusRepacketizerintopus_repacketizer_cat (OpusRepacketizer *rp, const unsignedchar*data, opus_int32 len)给当前的 repacketizer 状态增加一个包。opus_int32opus_repacketizer_out_range (OpusRepacketizer *rp, intbegin, intend, unsigned char *data, opus_int32 maxlen)通过 opus_repacketizer_cat() 从以前提交给 repacketizer状态的数据构建一个新的包。intopus_repacketizer_get_nb_frames (OpusRepacketizer *rp)返 回 最 后 一次调用opus_repacketizer_init()或opus_repacketizer_create()后,到 当 前 为 止 通过opus_repacketizer_cat() 提交的包数据所包含的帧的总数。opus_int32opus_repacketizer_out (OpusRepacketizer *rp, unsigned char *data,opus_int32 maxlen)通过 opus_repacketizer_cat() 从以前提交给 repacketizer 状态的数据构建一个新的包。详细描述Repacketizer可将多个包 Opus 合并成一个包,或将以前合并的包分离成多个 Opus 包。分离有效的包可以保证成功,然而,只有在所有的帧都有相同的编码模式、带宽、帧大小,并且合并后的包总的时长不超过120 毫秒,合并有效的包才能成功。对多流包的操作不会成功,除了这些包由来自同一音频流的数据组成的退化情况。重构包的过程开始于创建一个repacketizer 状态,创建既可以通过调用opus_repacketizer_create()函数也可以通过自己分配内存的方式来进行,例如OpusRepacketizer *rp;rp = (OpusRepacketizer*)malloc(opus_repacketizer_get_size();if(rp != NULL)opus_repacketizer_init(rp);之 后 应 用 程 序 应 通 过opus_repacketizer_cat() 来 提 交 包 , 用opus_repacketizer_out()或 opus_repacketizer_out_range()提取新的包,然后通过 opus_repacketizer_init()为下一套输入包重设状态。下面的例子中,将一个系列的包分离成各单独的帧:unsignedchar *data;intlen;while(get_next_packet(&data, &len)unsignedchar out1276;opus_int32 out_len;intnb_frames;interr;inti;err = opus_repacketizer_cat(rp, data, len);if(err != OPUS_OK)release_packet(data);returnerr;nb_frames = opus_repacketizer_get_nb_frames(rp);for (i = 0; i nb_frames; i+)out_len = opus_repacketizer_out_range(rp, i, i+1, out,if(out_len 0)sizeof(out);release_packet(data);return( int )out_len;output_next_packet(out, out_len);opus_repacketizer_init(rp);release_packet(data);可 选 择 将 一 个 系 列 的 帧 合 并 到 各 个 包 中 , 每 个
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学培训


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!