版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、Opus:IETF低延遲音頻編解碼器:API和操作手冊O(shè)pus簡介Opus編解碼器是專門設(shè)計用于互聯(lián)網(wǎng)的交互式語音和音頻傳輸。它是由IETF的編解碼器工作組設(shè)計的,合并了Skype的SILK和Xiph. Org的CELT技術(shù)。Opus編解碼器的設(shè)計目的是處理廣泛的交互式音頻應(yīng)用程序,包括IP語音,視頻,游戲內(nèi)聊天,甚至遠程現(xiàn)場音樂表演。它可以適用于從低碼率窄帶語音到非常高質(zhì)量的立體聲音樂。它的主要特點是: 采樣率從8至48 kHz 比特率從6kb/s到510kb/s 對固定碼率(CBR)和可變碼率(VBR)都能支持 從窄帶到寬帶的音頻帶寬 支持語音和音樂 支持單聲道和立體聲 支持多通道(最多2
2、55通道) 幀規(guī)格從2.5毫秒到60毫秒 良好的損失魯棒性和包丟失隱藏性(PLC)(注:應(yīng)是指丟包也不容易被發(fā)現(xiàn)) 浮點和定點執(zhí)行文檔包括: Opus Encoder Opus Decoder Repacketizer Opus Multistream API Opus library information functions Opus CustomOpus Encoder 本節(jié)描述了Opus編碼器OpusEncoder的過程和函數(shù)類型定義typedef structOpusEncoderOpusEncoderOpus encoder 狀態(tài). 函數(shù)intopus_encoder_get_si
3、ze (int channels)獲得OpusEncoder結(jié)構(gòu)的大小OpusEncoder *opus_encoder_create (opus_int32 Fs, int channels, int application, int *error)分配和初始化 encoder狀態(tài). intopus_encoder_init (OpusEncoder *st, opus_int32 Fs, int channels, int application)初始化一個以前分配的編碼器狀態(tài)。所指向的內(nèi)存圣必須至少是opus_encoder_get_size()返回的大小. opus_int32opus
4、_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)根據(jù)浮點輸入對一個 Opus幀進行編碼.voidopus_encoder_destroy (O
5、pusEncoder *st)釋放一個根據(jù)opus_encoder_create()已分配的OpusEncoder對象。intopus_encoder_ctl (OpusEncoder *st, int request,.)向一個Opus編碼器執(zhí)行一個 CTL 函數(shù). 詳細描述本節(jié)描述了用于編碼Opus的過程和函數(shù)。既然Opus是一個有狀態(tài)的編解碼器,編碼過程始于創(chuàng)建一個編碼器狀態(tài),用以下方法做到:int error;OpusEncoder *enc;enc = opus_encoder_create(Fs, channels, application, &error);從這一點上, enc可
6、以用于編碼音頻流。一個編碼器狀態(tài)在同一時間不得用于多于一個音頻流。同樣,編碼器狀態(tài)不能對于每幀重新初始化。當(dāng)opus_encoder_create()為狀態(tài)分配內(nèi)存時,它也可以初始化預(yù)分配的內(nèi)存: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()返回編碼器狀態(tài)要求的大小。注意,這段代碼的未來版本可能
7、改變大小,所以沒有assuptions應(yīng)該對它做出。編碼器狀態(tài)在內(nèi)存中總是連續(xù),復(fù)制它只要一個淺拷貝就足夠了。使用opus_encoder_ctl()接口可以改變一些編碼器的參數(shù)設(shè)置。所有這些參數(shù)都已有缺省值,所以只在必要的情況下改變它們。最常見的參數(shù)設(shè)置修改是: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(比特
8、率)的單位是比特/秒(b / s) complexity(復(fù)雜性)是一個值從1到10,1最低,10最高,值越大越復(fù)雜signal_type(信號的類型)包括OPUS_AUTO (缺省), OPUS_SIGNAL_VOICE, or OPUS_SIGNAL_MUSIC。看Encoder related CTLs和Generic CTLs可以獲得可設(shè)置和查詢的參數(shù)詳細清單。在一個音頻流處理過程中,大多數(shù)參數(shù)可以設(shè)置或修改。為了對一個幀進行編碼,必須正確地用音頻數(shù)據(jù)的幀(2.5, 5, 10, 20, 40 或60 毫秒)來調(diào)用opus_encode()或opus_encode_float()函數(shù)。
9、len = opus_encode(enc, audio_frame, frame_size, packet, max_packet);在這里:l audio_frame(音頻幀)是opus_int16(或用于opus_encode_float()的浮點)格式的音頻數(shù)據(jù)l frame_size(幀大小)是樣本中幀的最大數(shù)(每個通道)l packet(包)是寫成壓縮數(shù)據(jù)的字節(jié)數(shù)組,l max_packet是可以寫入包的字節(jié)數(shù)的最大值推薦(4000字節(jié))。不要使用max_packet控制VBR的目標(biāo)比特率,而應(yīng)該用OPUS_SET_BITRATE CTL。opus_encode()和opus_en
10、code_float()返回實際寫入包的字節(jié)數(shù)。返回值可以是負數(shù),這表明一個錯誤已經(jīng)發(fā)生。如果返回值是1個字節(jié),那么包不需要傳播(DTX)。一旦一個編碼器狀態(tài)已不再需要,可以用以下方式解構(gòu):opus_encoder_destroy(enc);如果編碼器是用opus_encoder_init()創(chuàng)建的,而不是使用opus_encoder_create()函數(shù),那么不需要采取行動,要求從潛在的釋放為它手動分配的內(nèi)存(上述例子是調(diào)用 free(enc)中分離。類型定義文檔typedef struct OpusEncoderOpusEncoderOpus編碼器狀態(tài)。這包含了一個Opus編碼器的完整狀態(tài)
11、。它是位置獨立的,并且可以自由復(fù)制。函數(shù)文檔opus_int32 opus_encode ( OpusEncoder * st,const opus_int16 * pcm,int frame_size,unsigned char * data,opus_int32 max_data_bytes ) 對一個Opus幀進行編碼。參數(shù):instOpusEncoder*:編碼器狀態(tài)inpcmopus_int16*: 輸入信號(如果是2 通道有交叉). 長度是 frame_size*channels*sizeof(opus_int16)inframe_sizeint:輸入信號的每通道樣本數(shù). 這必須是
12、編碼器采樣率的Opus幀大小。比如,48 kHz 下允許值有120, 240, 480, 960, 1920, 和 2880。少于10毫秒的采樣(48 kHz 有480個樣本),將阻止編碼器使用LPC或混合模式。outdataunsigned char*: 輸出負載。必須包含至少max_data_bytes 的容量。inmax_data_bytesopus_int32: 為輸出負載所分配的內(nèi)存大小??梢杂糜谙拗乒潭ū忍芈实淖畲笊舷?,但不能用作唯一的比特率限制,可以用OPUS_SET_BITRATE來控制比特率。返回值:成功,是被編碼包的長度(字節(jié)數(shù)),失敗,一個負的錯誤代碼opus_int32
13、 opus_encode_float ( OpusEncoder * st,const float * pcm,int frame_size,unsigned char * data,opus_int32 max_data_bytes ) 根據(jù)浮點輸入對一個 Opus幀進行編碼.參數(shù):instOpusEncoder*:編碼器狀態(tài)inpcmfloat*:浮點格式的輸入(如果是2 通道有交叉),正常范圍在+/-1.0之間. 超過該范圍的采樣也是支持的,但它將被解碼器用整型API截取,并且只能在知道遠端支持擴展的動態(tài)范圍的情況下使用。長度是 frame_size*channels*sizeof(fl
14、oat)inframe_sizeint: 輸入信號的每通道樣本數(shù). 這必須是編碼器采樣率的Opus幀大小。比如,48 kHz 下允許值有120, 240, 480, 960, 1920, 和 2880。少于10毫秒的采樣(48 kHz 有480個樣本),將阻止編碼器使用LPC或混合模式。outdataunsigned char*:輸出負載。必須包含至少max_data_bytes 的容量。inmax_data_bytesopus_int32:為輸出負載所分配的內(nèi)存大小??梢杂糜谙拗乒潭ū忍芈实淖畲笊舷?,但不能用作唯一的比特率限制,可以用OPUS_SET_BITRATE來控制比特率。.返回值:成
15、功,是被編碼包的長度(字節(jié)數(shù)),失敗,一個負的錯誤代碼。OpusEncoder* opus_encoder_create ( opus_int32 Fs,int channels,int application,int * error ) 分配和初始化一個編碼器狀態(tài)。包括三種編碼模式:OPUS_APPLICATION_VOIP:在給定比特率條件下為聲音信號提供最高質(zhì)量,它通過高通濾波和強調(diào)共振峰和諧波增強了輸入信號。它包括帶內(nèi)前向錯誤檢查以預(yù)防包丟失。典型的VOIP應(yīng)用程序使用這種模式。由于進行了增強,即使是高比特率的情況下,輸出的聲音與輸入相比,聽起來可能不一樣。OPUS_APPLICATI
16、ON_AUDIO:對大多數(shù)非語音信號,如音樂,在給定比特率條件下提供了最高的質(zhì)量。使用這種模式的場合包括音樂、混音(音樂/聲音),廣播,和需要不到15 毫秒的信號延遲的其他應(yīng)用。OPUS_APPLICATION_RESTRICTED_LOWDELAY:配置低延遲模式將為減少延遲禁用語音優(yōu)化模式。這種模式只能在剛初始化或剛重設(shè)編碼器的情況下使用,因為在這些情況下編解碼器的延遲被修改了。(當(dāng)心!)當(dāng)調(diào)用者知道語音優(yōu)化模式不再需要時,配置低延遲模式是有用的。參數(shù):inFsopus_int32: 輸入信號的采樣率 (Hz),必須是8000、12000、16000、24000、或48000。inchan
17、nelsint:輸入信號的通道數(shù) (1 or 2) 。inapplicationint:編碼模式(OPUS_APPLICATION_VOIP/OPUS_APPLICATION_AUDIO/OPUS_APPLICATION_RESTRICTED_LOWDELAY)outerrorint*: 錯誤代碼注意:無論選擇什么樣的采樣率和通道數(shù), 如果選擇的比特率太低,Opus編碼器可以切換到一個較低的音頻帶寬或通道數(shù)。這也意味著總是使用48 kHz立體聲輸入和讓編碼器優(yōu)化編碼是安全的。int opus_encoder_ctl ( OpusEncoder * st,int request, . ) 向一個
18、Opus編碼器執(zhí)行一個 CTL 函數(shù).一般其請求和后續(xù)的參數(shù)是由一個提供便利的宏來產(chǎn)生的。參數(shù): stOpusEncoder*: 編碼器狀態(tài) request int:這個及所有其他參數(shù)應(yīng)被1個在Generic CTLs 或Encoder related CTLs所提供便利的宏來替代參見: Generic CTLs Encoder related CTLsvoid opus_encoder_destroy ( OpusEncoder * st) Frees an OpusEncoder allocated by opus_encoder_create().釋放一個根據(jù)opus_encoder_c
19、reate()已分配的OpusEncoder對象。參數(shù): instOpusEncoder*: 用于釋放的編碼器狀態(tài)。int opus_encoder_get_size ( int channels) 獲得OpusEncoder結(jié)構(gòu)的大小。參數(shù): inchannelsint: 通道數(shù),必須是1或2.返回:字節(jié)數(shù)的大小.int opus_encoder_init ( OpusEncoder * st,opus_int32 Fs,int channels,int application ) 初始化一個以前分配的編碼器狀態(tài)。狀態(tài)所指向的內(nèi)存必須至少是opus_encoder_get_size()返回的
20、大小.在這里,應(yīng)用程序不要用系統(tǒng)自動分配內(nèi)存,而要準(zhǔn)備用自己的分配器。參見: opus_encoder_create(),opus_encoder_get_size()。為重設(shè)一個以前初始化的狀態(tài),使用OPUS_RESET_STATE CTL.參數(shù): instOpusEncoder*: 編碼器狀態(tài) inFsopus_int32: 輸入信號的采樣率 (Hz),必須是8000、12000、16000、24000、或48000。 inchannelsint: 輸入信號的通道數(shù) (1 or 2) inapplicationint: 編碼模式(OPUS_APPLICATION_VOIP/OPUS_APP
21、LICATION_AUDIO/OPUS_APPLICATION_RESTRICTED_LOWDELAY)返回值:成功,OPUS_OK,失敗,錯誤代碼。Opus Decoder 本節(jié)描述了Opus解碼器OpusDecoder的過程和函數(shù)類型定義typedef struct OpusDecoderOpusDecoderOpus 解碼器狀態(tài). 函數(shù)intopus_decoder_get_size (int channels)獲得OpusDecoder結(jié)構(gòu)的大小. OpusDecoder *opus_decoder_create (opus_int32 Fs, int channels, int *e
22、rror)分配和初始化解碼器狀態(tài). intopus_decoder_init (OpusDecoder *st, opus_int32 Fs, int channels)初始化以前分配的解碼器狀態(tài). intopus_decode (OpusDecoder *st, const unsigned char *data, opus_int32 len, opus_int16 *pcm, int frame_size, int decode_fec)解碼一個 Opus 包. intopus_decode_float (OpusDecoder *st, const unsigned char *dat
23、a, opus_int32 len, float *pcm, int frame_size, int decode_fec)解碼一個浮點輸出的Opus 包,. intopus_decoder_ctl (OpusDecoder *st, int request,.)向一個Opus解碼器執(zhí)行CTL 函數(shù)。voidopus_decoder_destroy (OpusDecoder *st)釋放通過opus_decoder_create().分配過的OpusDopus_packet_parse (const unsigned char *data, opus_int32 len,
24、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 unsigned char *data, opus_int32 Fs)獲得Opus 包每幀的樣本數(shù)。intopus_packet_get_nb_cha
25、nnels (const unsigned char *data)獲得Opus 包的通道數(shù)。intopus_packet_get_nb_frames (const unsigned char packet, opus_int32 len)獲得Opus 包所有幀的數(shù)量. intopus_packet_get_nb_samples (const unsigned char packet, opus_int32 len, opus_int32 Fs)獲得Opus 包的樣本數(shù)。intopus_decoder_get_nb_samples (const OpusDecoder *dec, const u
26、nsigned char packet, opus_int32 len)獲得Opus 包的樣本數(shù)。詳細描述本節(jié)描述了用于解碼Opus的過程和方法.與編碼相似,解碼進程也是開始于創(chuàng)建一個解碼器狀態(tài)。用以下方法做到:int error;OpusDecoder *dec;dec = opus_decoder_create(Fs, channels, &error);在這里:n Fs 是采樣率,必須是8000, 12000, 16000, 24000, 或 48000n channels 是通道數(shù) (1 或 2)n error 將保存出錯情況下的錯誤代碼(或成功狀態(tài)下的 OPUS_OK )n 返回值是
27、一個新創(chuàng)建的用于解碼的解碼器狀態(tài)當(dāng) opus_decoder_create() 為狀態(tài)分配內(nèi)存時, 它也可以初始化預(yù)分配的內(nèi)存: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()返回解碼器狀態(tài)要求的大小. 注意,這段代碼的未來版本可能改變大小,所以沒有assuptions應(yīng)該對它做出。解碼器狀態(tài)在內(nèi)存中總是連續(xù),復(fù)制它只要一
28、個淺拷貝就足夠了。為解碼一個幀, opus_decode() 或 opus_decode_float()必須用壓縮音頻數(shù)據(jù)的包來調(diào)用:frame_size = opus_decode(dec, packet, len, decoded, max_size, 0);在這里n packet 是包含壓縮數(shù)據(jù)的字節(jié)數(shù)組n len 是包內(nèi)字節(jié)的精確數(shù)量n decoded 是opus_int16 (或由 opus_decode_float()定義的浮點型)格式的解碼后的音頻數(shù)據(jù)。n max_size是可以放入解碼幀的每個通道各樣本中幀的最大值opus_decode() 和 opus_decode_floa
29、t() 返回從包解碼后的每通道樣本的數(shù)量。如果這個值是負的,表示有錯誤發(fā)生。如果包損壞或音頻緩沖太小不足以容納解碼后的音頻,錯誤就會發(fā)生。Opus是包含重疊塊的有狀態(tài)的編解碼器,其結(jié)果是Opus 包并不是彼此獨立編碼。包必須按正確的次序,連續(xù)地進入解碼器進行正確的解碼。丟失的包可以用遺失隱藏來替換,遺失隱藏用一個空的指針和0長度的包來調(diào)用解碼器。一個單獨的編解碼器狀態(tài)在一個時間只能由一個單獨的線程來訪問,調(diào)用者執(zhí)行任何需要的鎖定。各分開的音頻數(shù)據(jù)流可以用各自分開的解碼器狀態(tài)平行地進行解碼,除非API庫在編譯時用了NONTHREADSAFE_PSEUDOSTACK定義。類型定義文檔typedef
30、 struct OpusDecoder OpusDecoderOpus 解碼器狀態(tài).這包含了一個Opus解碼器的完整狀態(tài)。它是位置獨立的,并且可以自由復(fù)制。參見: opus_decoder_create,opus_decoder_init函數(shù)文檔int opus_decode ( OpusDecoder * st,const unsigned char * data,opus_int32 len,opus_int16 * pcm,int frame_size,int decode_fec ) 對一個Opus包進行解碼。參數(shù): instOpusDecoder*: 解碼器狀態(tài) indatachar
31、*:輸入負載.對包丟失使用一個空指針來表示。 inlenopus_int32:在輸入負載中的字節(jié)數(shù) outpcmopus_int16*: 輸出信號(如果是2通道有交叉)。長度等于frame_size*channels*sizeof(opus_int16) inframe_size:在PCM可用空間中每通道的樣本數(shù)。如果小于最大包的時長(120毫秒,4848kHz5760個),這個函數(shù)將不能解碼一些包。如果是PLC (data=NULL) 或 FEC (decode_fec=1)的情況,那么frame_size必須正好是丟失音頻的時長,否則解碼器無法在解碼下一個包時進入優(yōu)化狀態(tài)。對于PLC 和
32、FEC 的情況,frame_size必須是2.5毫秒的倍數(shù)。 indecode_fecint: 對于請求任何帶內(nèi)前向錯誤糾正數(shù)據(jù)進行解碼的狀態(tài)標(biāo)志 (0 or 1) 。如果沒有這樣的數(shù)據(jù)可用,幀在解碼時被認為已經(jīng)丟失。返回:解碼樣本的數(shù)量,或錯誤代碼。int opus_decode_float ( OpusDecoder * st,const unsigned char * data,opus_int32 len,float * pcm,int frame_size,int decode_fec ) 用浮點輸出格式解碼一個Opus包。參數(shù): instOpusDecoder*: 解碼器狀態(tài) in
33、datachar*:輸入負載.對包丟失使用一個空指針來表示。 inlenopus_int32: 在輸入負載中的字節(jié)數(shù) outpcmfloat*:輸出信號(如果是2通道有交叉)。長度等于frame_size*channels*sizeof(float) inframe_size:在PCM可用空間中每通道的樣本數(shù)。如果小于最大包的時長(120毫秒,4848kHz5760個),這個函數(shù)將不能解碼一些包。如果是PLC (data=NULL) 或 FEC (decode_fec=1)的情況,那么frame_size必須正好是丟失音頻的時長,否則解碼器無法在解碼下一個包時進入優(yōu)化狀態(tài)。對于PLC 和 FE
34、C 的情況,frame_size必須是2.5毫秒的倍數(shù)。 indecode_fecint: 對于請求任何帶內(nèi)前向錯誤糾正數(shù)據(jù)進行解碼的狀態(tài)標(biāo)志 (0 or 1) 。如果沒有這樣的數(shù)據(jù)可用,幀在解碼時被認為已經(jīng)丟失。返回:解碼樣本的數(shù)量,或錯誤代碼。OpusDecoder* opus_decoder_create ( opus_int32 Fs,int channels,int * error ) 分配和初始化解碼器狀態(tài).參數(shù): inFsopus_int32: 解碼的采樣率 (Hz). 必須是 8000, 12000, 16000, 24000, 或 48000. inchannelsint:
35、用于解碼的通道數(shù)(1 or 2) outerrorint*:成功時是 OPUS_OK Success或錯誤代碼Opus在內(nèi)部用48000 Hz來存儲數(shù)據(jù),所以對于FS來說48000 Hz是缺省值。然而,解碼器在8, 12, 16, 和 24 kHz下也可以有效解碼到緩沖,所以,由于某些原因調(diào)用者不能在全采樣率下使用數(shù)據(jù),或知道被壓縮的數(shù)據(jù)不能在全頻率范圍內(nèi)使用,可以請求用更小的頻率解碼。同樣的,解碼器可以根據(jù)調(diào)用者的請求,填充單聲道或交叉立體聲的PCM緩沖區(qū)。int opus_decoder_ctl ( OpusDecoder * st,int request, . ) 向一個Opus解碼器執(zhí)
36、行一個 CTL 函數(shù).一般其請求和后續(xù)的參數(shù)是由一個提供便利的宏來產(chǎn)生的。參數(shù):n stOpusDecoder*: 解碼器狀態(tài).n request:這個及所有其他剩余參數(shù)應(yīng)被1個在Generic CTLs 或Encoder related CTLs所提供便利的宏來替代參見: Generic CTLs Decoder related CTLs void opus_decoder_destroy ( OpusDecoder * st) 釋放一個根據(jù)opus_decoder_create()已分配的OpusDecoder對象.參數(shù): instOpusDecoder*:用于釋放的解碼器狀態(tài)。int o
37、pus_decoder_get_nb_samples ( const OpusDecoder * dec,const unsigned char packet,opus_int32 len ) 獲得一個Opus包的樣本數(shù)參數(shù): indecOpusDecoder*: 解碼器狀態(tài) inpacketchar*: Opus包 inlenopus_int32: 包的長度返回:樣本的數(shù)量返回值: OPUS_INVALID_PACKET:通過的被壓縮數(shù)據(jù)已損壞或其格式不被支持。int opus_decoder_get_size ( int channels) 獲得OpusDecoder結(jié)構(gòu)的大小。參數(shù): i
38、nchannelsint: 通道數(shù),必須是1或2.返回:字節(jié)數(shù)的大小.int opus_decoder_init ( OpusDecoder * st,opus_int32 Fs,int channels ) 初始化一個以前分配過的解碼器狀態(tài).狀態(tài)必須至少是opus_decoder_get_size()返回的大小.在這里,應(yīng)用程序不要用系統(tǒng)自動分配內(nèi)存,而要準(zhǔn)備用自己的分配器。參見: opus_decoder_create,opus_decoder_get_size,為重設(shè)一個以前初始化的狀態(tài),使用OPUS_RESET_STATE CTL.參數(shù): instOpusDecoder*: 解碼器狀態(tài)
39、. inFsopus_int32: 準(zhǔn)備解碼的采樣率 (Hz). 必須是8000、12000、16000、24000、或48000. inchannelsint: 解碼的通道數(shù) (1 or 2)返回值:成功,OPUS_OK,失敗,錯誤代碼。int opus_packet_get_bandwidth ( const unsigned char * data) 獲得一個Opus包的帶寬。參數(shù): indatachar*: Opus 包返回值:n OPUS_BANDWIDTH_NARROWBAND窄帶 (4kHz bandpass)n OPUS_BANDWIDTH_MEDIUMBAND中等帶寬 (6k
40、Hz bandpass)n OPUS_BANDWIDTH_WIDEBAND寬帶 (8kHz bandpass)n OPUS_BANDWIDTH_SUPERWIDEBAND高寬帶 (12kHz bandpass)n OPUS_BANDWIDTH_FULLBAND全寬帶 (20kHz bandpass)n OPUS_INVALID_PACKET通過的被壓縮數(shù)據(jù)已損壞或其格式不被支持int opus_packet_get_nb_channels ( const unsigned char * data) 獲得Opus 包的通道數(shù)。參數(shù): indatachar*: Opus 包返回:通道數(shù)量返回值:
41、OPUS_INVALID_PACKET通過的被壓縮數(shù)據(jù)已損壞或其格式不被支持int opus_packet_get_nb_frames ( const unsigned char packet,opus_int32 len ) 獲得Opus 包所有幀的數(shù)量.參數(shù): inpacketchar*: Opus 包 inlenopus_int32:包的長度返回:幀的數(shù)量返回值: OPUS_INVALID_PACKET通過的被壓縮數(shù)據(jù)已損壞或其格式不被支持int opus_packet_get_nb_samples ( const unsigned char packet,opus_int32 len,
42、opus_int32 Fs ) 獲得Opus 包的樣本數(shù)。參數(shù): inpacketchar*: Opus 包 inlenopus_int32: 包的長度 inFsopus_int32: 采樣率(Hz). 必須是400的倍數(shù),否則結(jié)果不準(zhǔn)確。返回:樣本的數(shù)量返回值: OPUS_INVALID_PACKET通過的被壓縮數(shù)據(jù)已損壞或其格式不被支持int opus_packet_get_samples_per_frame ( const unsigned char * data,opus_int32 Fs ) 獲得Opus 包每幀的樣本數(shù)。參數(shù): indatachar*: Opus 包. 必須包含至少
43、一個字節(jié)的數(shù)據(jù)。 inFsopus_int32:采樣率(Hz).必須是400的倍數(shù),否則結(jié)果不準(zhǔn)確。返回:每幀樣本的數(shù)量. int 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個或多個幀.Opus_decode在內(nèi)部執(zhí)行這個操作,所以大多數(shù)應(yīng)用程序不需要用到這個函數(shù)。這個函數(shù)不復(fù)制各幀,返回的指針是輸入包內(nèi)部
44、的指針。參數(shù): indatachar*:要進行解析的 Opus包 inlenopus_int32: 數(shù)據(jù)的大小 outout_tocchar*: TOC 指針 outframeschar*48 封裝過的幀 outsizeshort48 封裝過的幀的大小 outpayload_offsetint*: 返回在包內(nèi)負載的位置(按字節(jié))返回:幀的數(shù)量RepacketizerRepacketizer可將多個包Opus合并成一個包,或?qū)⒁郧昂喜⒌陌蛛x成多個Opus包。類型定義typedef struct OpusRepacketizerOpusRepacketizer函數(shù)intopus_repacket
45、izer_get_size (void)獲得OpusRepacketizer結(jié)構(gòu)的大小OpusRepacketizer *opus_repacketizer_init (OpusRepacketizer *rp)(重新)初始化以前分配過的repacketizer 狀態(tài). OpusRepacketizer *opus_repacketizer_create (void)為用opus_repacketizer_init()產(chǎn)生的新repacketizer 分配內(nèi)存和初始化。voidopus_repacketizer_destroy (OpusRepacketizer *rp)釋放通過opus_re
46、packetizer_create()分配過的OpusRepacketizerintopus_repacketizer_cat (OpusRepacketizer *rp, const unsigned char *data, opus_int32 len)給當(dāng)前的repacketizer 狀態(tài)增加一個包。opus_int32opus_repacketizer_out_range (OpusRepacketizer *rp, int begin, int end, unsigned char *data, opus_int32 maxlen)通過opus_repacketizer_cat()從
47、以前提交給repacketizer狀態(tài)的數(shù)據(jù)構(gòu)建一個新的包。intopus_repacketizer_get_nb_frames (OpusRepacketizer *rp)返回最后一次調(diào)用opus_repacketizer_init()或opus_repacketizer_create()后,到當(dāng)前為止通過opus_repacketizer_cat()提交的包數(shù)據(jù)所包含的幀的總數(shù)。opus_int32opus_repacketizer_out (OpusRepacketizer *rp, unsigned char *data, opus_int32 maxlen)通過opus_repack
48、etizer_cat()從以前提交給repacketizer狀態(tài)的數(shù)據(jù)構(gòu)建一個新的包。詳細描述Repacketizer可將多個包Opus合并成一個包,或?qū)⒁郧昂喜⒌陌蛛x成多個Opus包。分離有效的包可以保證成功,然而,只有在所有的幀都有相同的編碼模式、帶寬、幀大小,并且合并后的包總的時長不超過120毫秒,合并有效的包才能成功。對多流包的操作不會成功,除了這些包由來自同一音頻流的數(shù)據(jù)組成的退化情況。重構(gòu)包的過程開始于創(chuàng)建一個repacketizer狀態(tài),創(chuàng)建既可以通過調(diào)用opus_repacketizer_create()函數(shù)也可以通過自己分配內(nèi)存的方式來進行,例如OpusRepacketiz
49、er *rp;rp = (OpusRepacketizer*)malloc(opus_repacketizer_get_size();if (rp != NULL)opus_repacketizer_init(rp);之后應(yīng)用程序應(yīng)通過opus_repacketizer_cat()來提交包,用opus_repacketizer_out()或opus_repacketizer_out_range()提取新的包,然后通過opus_repacketizer_init()為下一套輸入包重設(shè)狀態(tài)。下面的例子中,將一個系列的包分離成各單獨的幀:unsignedchar *data;int len;whil
50、e (get_next_packet(&data, &len)unsignedchar out1276;opus_int32 out_len;int nb_frames;int err;int i;err = opus_repacketizer_cat(rp, data, len);if (err != OPUS_OK)release_packet(data);return err;nb_frames = opus_repacketizer_get_nb_frames(rp);for (i = 0; i nb_frames; i+)out_len = opus_repacketizer_out
51、_range(rp, i, i+1, out, sizeof(out);if (out_len 0)release_packet(data);return (int)out_len;output_next_packet(out, out_len);opus_repacketizer_init(rp);release_packet(data);可選擇將一個系列的幀合并到各個包中,每個包包含最多TARGET_DURATION_MS毫秒的數(shù)據(jù):/ The maximum number of packets with duration TARGET_DURATION_MS occurs/ when the frame size is 2.5 ms, for a total of (
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 七年級新生班級建設(shè)方案
- 小孩做家務(wù)協(xié)議書(2篇)
- POS機追償協(xié)議(可直接使用)
- 老年人健康管理合作協(xié)議書
- 綠化養(yǎng)護作業(yè)安全執(zhí)行方案
- 南充-PEP-2024年小學(xué)四年級上冊英語第三單元寒假試卷
- 定向鉆在通信設(shè)施鋪設(shè)中的方案
- 高校國慶主題演講活動方案
- 小學(xué)戲曲與傳統(tǒng)文化結(jié)合方案
- 媒體行業(yè)人才引進競聘方案
- 六年級信息科技上全冊教案 浙教版2023年
- 【體能大循環(huán)】聚焦體能循環(huán)-探索運動奧秘-幼兒園探究體能大循環(huán)有效開展策略課件
- 乳房下垂個案護理
- AI在航空航天領(lǐng)域中的應(yīng)用
- 《果樹嫁接技術(shù)》課件
- 中醫(yī)合理膳食
- 早產(chǎn)兒腦出血預(yù)防
- 酒店服務(wù)品質(zhì)提升方案
- T-SZHW 001-2024 深圳市城市管家服務(wù)管理規(guī)范(試行)
- 益母草化學(xué)成分與藥理作用研究進展
- 五年級上冊小數(shù)乘除口算練習(xí)400題及答案
評論
0/150
提交評論