Opus低延遲音頻編解碼器API手冊中文翻譯

上傳人:仙*** 文檔編號:39244787 上傳時間:2021-11-10 格式:DOC 頁數(shù):69 大?。?23.52KB
收藏 版權(quán)申訴 舉報 下載
Opus低延遲音頻編解碼器API手冊中文翻譯_第1頁
第1頁 / 共69頁
Opus低延遲音頻編解碼器API手冊中文翻譯_第2頁
第2頁 / 共69頁
Opus低延遲音頻編解碼器API手冊中文翻譯_第3頁
第3頁 / 共69頁

下載文檔到電腦,查找使用更方便

10 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《Opus低延遲音頻編解碼器API手冊中文翻譯》由會員分享,可在線閱讀,更多相關(guān)《Opus低延遲音頻編解碼器API手冊中文翻譯(69頁珍藏版)》請在裝配圖網(wǎng)上搜索。

1、Opus:IETF低延遲音頻編解碼器:API和操作手冊 Opus簡介 Opus編解碼器是專門設(shè)計用于互聯(lián)網(wǎng)的交互式語音和音頻傳輸。它是由IETF的編解碼器工作組設(shè)計的,合并了Skype的SILK和Xiph. Org的CELT技術(shù)。 Opus編解碼器的設(shè)計目的是處理廣泛的交互式音頻應(yīng)用程序,包括IP語音,視頻,游戲內(nèi)聊天,甚至遠(yuǎn)程現(xiàn)場音樂表演。它可以適用于從低碼率窄帶語音到非常高質(zhì)量的立體聲音樂。它的主要特點(diǎn)是: 采樣率從8至48 kHz 比特率從6kb/s到510kb/s 對固定碼率(CBR)和可變碼率(VBR)都能支持 從窄帶到寬帶的音頻帶寬 支持語音和音樂 支

2、持單聲道和立體聲 支持多通道(最多255通道) 幀規(guī)格從2.5毫秒到60毫秒 良好的損失魯棒性和包丟失隱藏性(PLC)(注:應(yīng)是指丟包也不容易被發(fā)現(xiàn)) 浮點(diǎn)和定點(diǎn)執(zhí)行 文檔包括: Opus Encoder Opus Decoder Repacketizer Opus Multistream API Opus library information functions Opus Custom Opus Encoder 本節(jié)描述了Opus編碼器OpusEncoder的過程和函數(shù) 類型定義 typedef struct Opu

3、sEncoder OpusEncoder Opus encoder 狀態(tài). 函數(shù) int opus_encoder_get_size (int channels) 獲得 OpusEncoder結(jié)構(gòu)的大小 OpusEncoder * opus_encoder_create (opus_int32 Fs, int channels, int application, int *error) 分配和初始化 encoder狀態(tài). int opus_encoder_init (OpusEncoder *st, opus_int32 Fs, int cha

4、nnels, int application) 初始化一個以前分配的編碼器狀態(tài)。所指向的內(nèi)存圣必須至少是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幀進(jìn)行編碼. opus_int32 opus_encode_float (OpusEncoder *st, const float *pcm

5、, int frame_size, unsigned char *data, opus_int32 max_data_bytes) 根據(jù)浮點(diǎn)輸入對一個 Opus幀進(jìn)行編碼. void opus_encoder_destroy (OpusEncoder *st) 釋放一個根據(jù)opus_encoder_create()已分配的OpusEncoder 對象。 int opus_encoder_ctl (OpusEncoder *st, int request,...) 向一個Opus編碼器執(zhí)行一個 CTL 函數(shù). 詳細(xì)描述 本節(jié)描述了用于編碼Opus的過程和函

6、數(shù)。 既然Opus是一個有狀態(tài)的編解碼器,編碼過程始于創(chuàng)建一個編碼器狀態(tài),用以下方法做到: int error; OpusEncoder *enc; enc = opus_encoder_create(Fs, channels, application, &error); 從這一點(diǎn)上, enc可以用于編碼音頻流。一個編碼器狀態(tài)在同一時間不得用于多于一個音頻流。同樣,編碼器狀態(tài)不能對于每幀重新初始化。 當(dāng)opus_encoder_create()為狀態(tài)分配內(nèi)存時,它也可以初始化預(yù)分配的內(nèi)存: int size; int error; OpusEncoder *enc; siz

7、e = opus_encoder_get_size(channels); enc = malloc(size); error = opus_encoder_init(enc, Fs, channels, application); opus_encoder_get_size()返回編碼器狀態(tài)要求的大小。注意,這段代碼的未來版本可能改變大小,所以沒有assuptions應(yīng)該對它做出。 編碼器狀態(tài)在內(nèi)存中總是連續(xù),復(fù)制它只要一個淺拷貝就足夠了。 使用opus_encoder_ctl()接口可以改變一些編碼器的參數(shù)設(shè)置。所有這些參數(shù)都已有缺省值,所以只在必要的情況下改變它們。最常見的參數(shù)設(shè)

8、置修改是: 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(復(fù)雜性)是一個值從1到10,1最低,10最高,值越大越復(fù)雜 signal_type(信號的類型)包括OPUS_AUTO (缺省), OPUS_SIGNAL_

9、VOICE, or OPUS_SIGNAL_MUSIC。 看Encoder related CTLs 和 Generic CTLs可以獲得可設(shè)置和查詢的參數(shù)詳細(xì)清單。在一個音頻流處理過程中,大多數(shù)參數(shù)可以設(shè)置或修改。 為了對一個幀進(jìn)行編碼,必須正確地用音頻數(shù)據(jù)的幀(2.5, 5, 10, 20, 40 或60 毫秒)來調(diào)用opus_encode() 或opus_encode_float()函數(shù)。 len = opus_encode(enc, audio_frame, frame_size, packet, max_packet); 在這里: l audio_frame(音頻幀)是op

10、us_int16(或用于opus_encode_float()的浮點(diǎn))格式的音頻數(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_encode_float()返回實(shí)際寫入包的字節(jié)數(shù)。返回值可以是負(fù)數(shù),這表明一個錯誤已經(jīng)發(fā)生。如果返回值是1個字節(jié),那么包不需要傳播(DTX)。 一旦一個編碼器狀態(tài)已

11、不再需要,可以用以下方式解構(gòu): opus_encoder_destroy(enc); 如果編碼器是用opus_encoder_init() 創(chuàng)建的,而不是使用opus_encoder_create()函數(shù),那么不需要采取行動,要求從潛在的釋放為它手動分配的內(nèi)存(上述例子是調(diào)用 free(enc))中分離。 類型定義文檔 typedef struct OpusEncoder OpusEncoder Opus編碼器狀態(tài)。 這包含了一個Opus編碼器的完整狀態(tài)。它是位置獨(dú)立的,并且可以自由復(fù)制。 函數(shù)文檔 opus_int32 opus_encode ( OpusEncoder

12、* st, const opus_int16 * pcm, int frame_size, unsigned char * data, opus_int32 max_data_bytes ) 對一個Opus幀進(jìn)行編碼。 參數(shù): [in] st OpusEncoder*:編碼器狀態(tài) [in] pcm opus_int16*: 輸入信號(如果是2 通道有交叉). 長度是 frame_size*channels*sizeof(opus_int16) [in] frame_size int:輸入信號的每通道樣本數(shù). 這必須是編碼器采樣率的

13、Opus幀大小。比如,48 kHz 下允許值有120, 240, 480, 960, 1920, 和 2880。少于10毫秒的采樣(48 kHz 有480個樣本),將阻止編碼器使用LPC或混合模式。 [out] data unsigned char*: 輸出負(fù)載。必須包含至少max_data_bytes 的容量。 [in] max_data_bytes opus_int32: 為輸出負(fù)載所分配的內(nèi)存大小??梢杂糜谙拗乒潭ū忍芈实淖畲笊舷?,但不能用作唯一的比特率限制,可以用OPUS_SET_BITRATE來控制比特率。 返回值:成功,是被編碼包的長度(字節(jié)數(shù)),失敗,一個負(fù)的錯誤代碼

14、 opus_int32 opus_encode_float ( OpusEncoder * st, const float * pcm, int frame_size, unsigned char * data, opus_int32 max_data_bytes ) 根據(jù)浮點(diǎn)輸入對一個 Opus幀進(jìn)行編碼. 參數(shù): [in] st OpusEncoder*:編碼器狀態(tài) [in] pcm float*:浮點(diǎn)格式的輸入(如果是2 通道有交叉),正常范圍在+/-1.0之間. 超過該范圍的采樣也是支持的,但它將被解碼器用整型API截取

15、,并且只能在知道遠(yuǎn)端支持?jǐn)U展的動態(tài)范圍的情況下使用。長度是 frame_size*channels*sizeof(float) [in] frame_size int: 輸入信號的每通道樣本數(shù). 這必須是編碼器采樣率的Opus幀大小。比如,48 kHz 下允許值有120, 240, 480, 960, 1920, 和 2880。少于10毫秒的采樣(48 kHz 有480個樣本),將阻止編碼器使用LPC或混合模式。 [out] data unsigned char*:輸出負(fù)載。必須包含至少max_data_bytes 的容量。 [in] max_data_bytes opus_int32

16、: 為輸出負(fù)載所分配的內(nèi)存大小。可以用于限制固定比特率的最大上限,但不能用作唯一的比特率限制,可以用OPUS_SET_BITRATE來控制比特率。. 返回值: 成功,是被編碼包的長度(字節(jié)數(shù)),失敗,一個負(fù)的錯誤代碼。 OpusEncoder* opus_encoder_create ( opus_int32 Fs, int channels, int application, int * error ) 分配和初始化一個編碼器狀態(tài)。 包括三種編碼模式: OPUS_APPLICATION_VOIP:在給定比特率條件下為聲音信號提供最高

17、質(zhì)量,它通過高通濾波和強(qiáng)調(diào)共振峰和諧波增強(qiáng)了輸入信號。它包括帶內(nèi)前向錯誤檢查以預(yù)防包丟失。典型的VOIP應(yīng)用程序使用這種模式。由于進(jìn)行了增強(qiáng),即使是高比特率的情況下,輸出的聲音與輸入相比,聽起來可能不一樣。 OPUS_APPLICATION_AUDIO:對大多數(shù)非語音信號,如音樂,在給定比特率條件下提供了最高的質(zhì)量。使用這種模式的場合包括音樂、混音(音樂/聲音),廣播,和需要不到15 毫秒的信號延遲的其他應(yīng)用。 OPUS_APPLICATION_RESTRICTED_LOWDELAY:配置低延遲模式將為減少延遲禁用語音優(yōu)化模式。這種模式只能在剛初始化或剛重設(shè)編碼器的情況下使用,因?yàn)樵谶@些情

18、況下編解碼器的延遲被修改了。 (當(dāng)心?。┊?dāng)調(diào)用者知道語音優(yōu)化模式不再需要時,配置低延遲模式是有用的。 參數(shù): [in] Fs opus_int32: 輸入信號的采樣率 (Hz),必須是8000、12000、16000、24000、或48000。 [in] channels int:輸入信號的通道數(shù) (1 or 2) 。 [in] application int:編碼模式(OPUS_APPLICATION_VOIP/OPUS_APPLICATION_AUDIO/OPUS_APPLICATION_RESTRICTED_LOWDELAY) [out] error int*: 錯誤代碼

19、注意:無論選擇什么樣的采樣率和通道數(shù), 如果選擇的比特率太低,Opus編碼器可以切換到一個較低的音頻帶寬或通道數(shù)。這也意味著總是使用48 kHz立體聲輸入和讓編碼器優(yōu)化編碼是安全的。 int opus_encoder_ctl ( OpusEncoder * st, int request, ... ) 向一個Opus編碼器執(zhí)行一個 CTL 函數(shù). 一般其請求和后續(xù)的參數(shù)是由一個提供便利的宏來產(chǎn)生的。 參數(shù): st OpusEncoder*: 編碼器狀態(tài) request int:這個及所有其他參數(shù)應(yīng)被1個在Generic

20、 CTLs 或Encoder related CTLs所提供便利的宏來替代 參見: Generic CTLs Encoder related CTLs void opus_encoder_destroy ( OpusEncoder * st ) Frees an OpusEncoder allocated by opus_encoder_create(). 釋放一個根據(jù)opus_encoder_create()已分配的OpusEncoder 對象。 參數(shù): [in] st OpusEncoder*: 用于釋放的編碼器狀態(tài)。 int

21、 opus_encoder_get_size ( int channels ) 獲得 OpusEncoder結(jié)構(gòu)的大小。 參數(shù): [in] channels int: 通道數(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()返回

22、的大小. 在這里,應(yīng)用程序不要用系統(tǒng)自動分配內(nèi)存,而要準(zhǔn)備用自己的分配器。 參見: opus_encoder_create(),opus_encoder_get_size()。為重設(shè)一個以前初始化的狀態(tài),使用OPUS_RESET_STATE CTL. 參數(shù): [in] st OpusEncoder*: 編碼器狀態(tài) [in] Fs opus_int32: 輸入信號的采樣率 (Hz),必須是8000、12000、16000、24000、或48000。 [in] channels int: 輸入信號的通道數(shù) (1 or 2) [in] appl

23、ication int: 編碼模式(OPUS_APPLICATION_VOIP/OPUS_APPLICATION_AUDIO/OPUS_APPLICATION_RESTRICTED_LOWDELAY) 返回值: 成功,OPUS_OK ,失敗,錯誤代碼。 Opus Decoder 本節(jié)描述了Opus解碼器OpusDecoder的過程和函數(shù) 類型定義 typedef struct OpusDecoder OpusDecoder Opus 解碼器狀態(tài). 函數(shù) int opus_decoder_get_size (int channels) 獲得

24、OpusDecoder 結(jié)構(gòu)的大小. OpusDecoder * opus_decoder_create (opus_int32 Fs, int channels, int *error) 分配和初始化解碼器狀態(tài). int opus_decoder_init (OpusDecoder *st, opus_int32 Fs, int channels) 初始化以前分配的解碼器狀態(tài). int opus_decode (OpusDecoder *st, const unsigned char *data, opus_int32 len, opus_int16 *pcm,

25、 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) 解碼一個浮點(diǎn)輸出的Opus 包,. int opus_decoder_ctl (OpusDecoder *st, int request,...) 向一個Opus解碼器執(zhí)行CTL 函數(shù)。 void opus_decod

26、er_destroy (OpusDecoder *st) 釋放通過opus_decoder_create().分配過的OpusDecoder。 int opus_packet_parse (const unsigned char *data, opus_int32 len, unsigned char *out_toc, const unsigned char *frames[48], short size[48], int *payload_offset) 將一個 opus 包解析成1個或多個幀. int opus_packet_get_bandwidth (const

27、 unsigned char *data) 獲得一個 Opus包的帶寬. int opus_packet_get_samples_per_frame (const unsigned char *data, opus_int32 Fs) 獲得Opus 包每幀的樣本數(shù)。 int opus_packet_get_nb_channels (const unsigned char *data) 獲得Opus 包的通道數(shù)。 int opus_packet_get_nb_frames (const unsigned char packet[], opus_int32 len

28、) 獲得Opus 包所有幀的數(shù)量. int opus_packet_get_nb_samples (const unsigned char packet[], opus_int32 len, opus_int32 Fs) 獲得Opus 包的樣本數(shù)。 int opus_decoder_get_nb_samples (const OpusDecoder *dec, const unsigned char packet[], opus_int32 len) 獲得Opus 包的樣本數(shù)。 詳細(xì)描述 本節(jié)描述了用于解碼Opus的過程和方法. 與編碼相似,解碼進(jìn)程也

29、是開始于創(chuàng)建一個解碼器狀態(tài)。用以下方法做到: int error; OpusDecoder *dec; dec = opus_decoder_create(Fs, channels, &error); 在這里: n Fs 是采樣率,必須是8000, 12000, 16000, 24000, 或 48000 n channels 是通道數(shù) (1 或 2) n error 將保存出錯情況下的錯誤代碼(或成功狀態(tài)下的 OPUS_OK ) n 返回值是一個新創(chuàng)建的用于解碼的解碼器狀態(tài) 當(dāng) opus_decoder_create() 為狀態(tài)分配內(nèi)存時, 它也可以初始化預(yù)分配的內(nèi)存:

30、 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ù)制它只要一個淺拷貝就足夠了。 為解碼一個幀, opus_decode() 或 opus_deco

31、de_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()定義的浮點(diǎn)型)格式的解碼后的音頻數(shù)據(jù)。 n max_size是可以放入解碼幀的每個通道各樣本中幀的最大值 opus_decode() 和 opus_decode_float() 返回從包解碼后的每通道樣本的數(shù)量。如果這個值是負(fù)

32、的,表示有錯誤發(fā)生。如果包損壞或音頻緩沖太小不足以容納解碼后的音頻,錯誤就會發(fā)生。 Opus是包含重疊塊的有狀態(tài)的編解碼器,其結(jié)果是Opus 包并不是彼此獨(dú)立編碼。包必須按正確的次序,連續(xù)地進(jìn)入解碼器進(jìn)行正確的解碼。丟失的包可以用遺失隱藏來替換,遺失隱藏用一個空的指針和0長度的包來調(diào)用解碼器。 一個單獨(dú)的編解碼器狀態(tài)在一個時間只能由一個單獨(dú)的線程來訪問,調(diào)用者執(zhí)行任何需要的鎖定。各分開的音頻數(shù)據(jù)流可以用各自分開的解碼器狀態(tài)平行地進(jìn)行解碼,除非API庫在編譯時用了NONTHREADSAFE_PSEUDOSTACK定義。 類型定義文檔 typedef struct OpusDecode

33、r OpusDecoder Opus 解碼器狀態(tài). 這包含了一個Opus解碼器的完整狀態(tài)。它是位置獨(dú)立的,并且可以自由復(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包進(jìn)行解

34、碼。 參數(shù): [in] st OpusDecoder*: 解碼器狀態(tài) [in] data char*:輸入負(fù)載.對包丟失使用一個空指針來表示。 [in] len opus_int32:在輸入負(fù)載中的字節(jié)數(shù) [out] pcm opus_int16*: 輸出信號(如果是2通道有交叉)。長度等于frame_size*channels*sizeof(opus_int16) [in] frame_size :在PCM可用空間中每通道的樣本數(shù)。如果小于最大包的時長(120毫秒,4848kHz5760個),這個函數(shù)將不能解碼一些包。如果是PLC (dat

35、a==NULL) 或 FEC (decode_fec=1)的情況,那么frame_size必須正好是丟失音頻的時長,否則解碼器無法在解碼下一個包時進(jìn)入優(yōu)化狀態(tài)。對于PLC 和 FEC 的情況,frame_size必須是2.5毫秒的倍數(shù)。 [in] decode_fec int: 對于請求任何帶內(nèi)前向錯誤糾正數(shù)據(jù)進(jìn)行解碼的狀態(tài)標(biāo)志 (0 or 1) 。如果沒有這樣的數(shù)據(jù)可用,幀在解碼時被認(rèn)為已經(jīng)丟失。 返回: 解碼樣本的數(shù)量,或錯誤代碼。 int opus_decode_float ( OpusDecoder * st, const unsigned c

36、har * data, opus_int32 len, float * pcm, int frame_size, int decode_fec ) 用浮點(diǎn)輸出格式解碼一個Opus包。 參數(shù): [in] st OpusDecoder*: 解碼器狀態(tài) [in] data char*:輸入負(fù)載.對包丟失使用一個空指針來表示。 [in] len opus_int32: 在輸入負(fù)載中的字節(jié)數(shù) [out] pcm float*:輸出信號(如果是2通道有交叉)。長度等于frame_size*channels*

37、sizeof(float) [in] frame_size :在PCM可用空間中每通道的樣本數(shù)。如果小于最大包的時長(120毫秒,4848kHz5760個),這個函數(shù)將不能解碼一些包。如果是PLC (data==NULL) 或 FEC (decode_fec=1)的情況,那么frame_size必須正好是丟失音頻的時長,否則解碼器無法在解碼下一個包時進(jìn)入優(yōu)化狀態(tài)。對于PLC 和 FEC 的情況,frame_size必須是2.5毫秒的倍數(shù)。 [in] decode_fec int: 對于請求任何帶內(nèi)前向錯誤糾正數(shù)據(jù)進(jìn)行解碼的狀態(tài)標(biāo)志 (0 or 1) 。如果沒有這樣的數(shù)據(jù)可用

38、,幀在解碼時被認(rèn)為已經(jīng)丟失。 返回: 解碼樣本的數(shù)量,或錯誤代碼。 OpusDecoder* opus_decoder_create ( opus_int32 Fs, int channels, int * error ) 分配和初始化解碼器狀態(tài). 參數(shù): [in] Fs opus_int32: 解碼的采樣率 (Hz). 必須是 8000, 12000, 16000, 24000, 或 48000. [in] channels int: 用于解碼的通道數(shù)(1 or 2) [out] error int*

39、:成功時是 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解碼

40、器執(zhí)行一個 CTL 函數(shù). 一般其請求和后續(xù)的參數(shù)是由一個提供便利的宏來產(chǎn)生的。 參數(shù): n st OpusDecoder*: 解碼器狀態(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 對象

41、. 參數(shù): [in] st OpusDecoder*:用于釋放的解碼器狀態(tài)。 int opus_decoder_get_nb_samples ( const OpusDecoder * dec, const unsigned char packet[], opus_int32 len ) 獲得一個Opus包的樣本數(shù) 參數(shù): [in] dec OpusDecoder*: 解碼器狀態(tài) [in] packet char*: Opus包 [in] len opus_int32: 包的長度 返回: 樣

42、本的數(shù)量 返回值: OPUS_INVALID_PACKET:通過的被壓縮數(shù)據(jù)已損壞或其格式不被支持。 int opus_decoder_get_size ( int channels ) 獲得 OpusDecoder結(jié)構(gòu)的大小。 參數(shù): [in] channels int: 通道數(shù),必須是1或2. 返回: 字節(jié)數(shù)的大小. int opus_decoder_init ( OpusDecoder * st, opus_int32 Fs, int channels ) 初始化一個以前分配過的解

43、碼器狀態(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ù): [in] st OpusDecoder*: 解碼器狀態(tài). [in] Fs opus_int32: 準(zhǔn)備解碼的采樣率 (Hz). 必須是8000、12000、16000、24000、或48000. [in] channels

44、int: 解碼的通道數(shù) (1 or 2) 返回值: 成功,OPUS_OK ,失敗,錯誤代碼。 int opus_packet_get_bandwidth ( const unsigned char * data ) 獲得一個Opus包的帶寬。 參數(shù): [in] data char*: Opus 包 返回值: n OPUS_BANDWIDTH_NARROWBAND 窄帶 (4kHz bandpass) n OPUS_BANDWIDTH_MEDIUMBAND 中等帶寬 (6kHz bandpass) n OPUS_BANDWIDTH_WIDEBAND

45、 寬帶 (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ù): [in] data char*: Opus 包 返回: 通道數(shù)量

46、 返回值: OPUS_INVALID_PACKET 通過的被壓縮數(shù)據(jù)已損壞或其格式不被支持 int opus_packet_get_nb_frames ( const unsigned char packet[], opus_int32 len ) 獲得Opus 包所有幀的數(shù)量. 參數(shù): [in] packet char*: Opus 包 [in] len opus_int32:包的長度 返回: 幀的數(shù)量 返回值: OPUS_INVALID_PACKET 通過的被壓縮數(shù)據(jù)已損壞或其格式不被支持

47、int opus_packet_get_nb_samples ( const unsigned char packet[], opus_int32 len, opus_int32 Fs ) 獲得Opus 包的樣本數(shù)。 參數(shù): [in] packet char*: Opus 包 [in] len opus_int32: 包的長度 [in] Fs opus_int32: 采樣率(Hz). 必須是400的倍數(shù),否則結(jié)果不準(zhǔn)確。 返回: 樣本的數(shù)量 返回值: OPUS_INVALID_PACKET 通過的

48、被壓縮數(shù)據(jù)已損壞或其格式不被支持 int opus_packet_get_samples_per_frame ( const unsigned char * data, opus_int32 Fs ) 獲得Opus 包每幀的樣本數(shù)。 參數(shù): [in] data char*: Opus 包. 必須包含至少一個字節(jié)的數(shù)據(jù)。 [in] Fs opus_int32: 采樣率(Hz).必須是400的倍數(shù),否則結(jié)果不準(zhǔn)確。 返回: 每幀樣本的數(shù)量. int opus_packet_parse ( const unsig

49、ned char * data, opus_int32 len, unsigned char * out_toc, const unsigned char * frames[48], short size[48], int * payload_offset ) 將一個 opus 包解析成1個或多個幀. Opus_decode在內(nèi)部執(zhí)行這個操作,所以大多數(shù)應(yīng)用程序不需要用到這個函數(shù)。這個函數(shù)不復(fù)制各幀,返回的指針是輸入包內(nèi)部的指針。 參數(shù): [in] data char*:要進(jìn)行解析的 Opus包 [in

50、] len opus_int32: 數(shù)據(jù)的大小 [out] out_toc char*: TOC 指針 [out] frames char*[48] 封裝過的幀 [out] size short[48] 封裝過的幀的大小 [out] payload_offset int*: 返回在包內(nèi)負(fù)載的位置(按字節(jié)) 返回: 幀的數(shù)量 Repacketizer Repacketizer可將多個包Opus合并成一個包,或?qū)⒁郧昂喜⒌陌蛛x成多個Opus包。 類型定義 typedef struct OpusRepacketizer Op

51、usRepacketizer 函數(shù) int opus_repacketizer_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)存和初始化。

52、 void opus_repacketizer_destroy (OpusRepacketizer *rp) 釋放通過opus_repacketizer_create()分配過的OpusRepacketizer int opus_repacketizer_cat (OpusRepacketizer *rp, const unsigned char *data, opus_int32 len) 給當(dāng)前的repacketizer 狀態(tài)增加一個包。 opus_int32 opus_repacketizer_out_range (OpusRepacketizer *rp, i

53、nt begin, int end, unsigned char *data, opus_int32 maxlen) 通過opus_repacketizer_cat()從以前提交給repacketizer狀態(tài)的數(shù)據(jù)構(gòu)建一個新的包。 int opus_repacketizer_get_nb_frames (OpusRepacketizer *rp) 返回最后一次調(diào)用opus_repacketizer_init() 或 opus_repacketizer_create()后,到當(dāng)前為止通過opus_repacketizer_cat()提交的包數(shù)據(jù)所包含的幀的總數(shù)。 opus_i

54、nt32 opus_repacketizer_out (OpusRepacketizer *rp, unsigned char *data, opus_int32 maxlen) 通過opus_repacketizer_cat()從以前提交給repacketizer狀態(tài)的數(shù)據(jù)構(gòu)建一個新的包。 詳細(xì)描述 Repacketizer可將多個包Opus合并成一個包,或?qū)⒁郧昂喜⒌陌蛛x成多個Opus包。 分離有效的包可以保證成功,然而,只有在所有的幀都有相同的編碼模式、帶寬、幀大小,并且合并后的包總的時長不超過120毫秒,合并有效的包才能成功。對多流包的操作不會成功,除了這些包由來自

55、同一音頻流的數(shù)據(jù)組成的退化情況。 重構(gòu)包的過程開始于創(chuàng)建一個repacketizer狀態(tài),創(chuàng)建既可以通過調(diào)用opus_repacketizer_create()函數(shù)也可以通過自己分配內(nèi)存的方式來進(jìn)行,例如 OpusRepacketizer *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(

56、)或opus_repacketizer_out_range()提取新的包,然后通過opus_repacketizer_init()為下一套輸入包重設(shè)狀態(tài)。 下面的例子中,將一個系列的包分離成各單獨(dú)的幀: unsigned char *data; int len; while (get_next_packet(&data, &len)) { unsigned char out[1276]; opus_int32 out_len; int nb_frames; int err; int i; err = opus_repacketizer_cat(rp, da

57、ta, 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_range(rp, i, i+1, out, sizeof(out)); if (out_len < 0) { release_packet(data); retu

58、rn (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 (TA

59、RGET_DURATION_MS*2/5) // packets. unsigned char *data[(TARGET_DURATION_MS*2/5)+1]; opus_int32 len[(TARGET_DURATION_MS*2/5)+1]; int nb_packets; unsigned char out[1277*(TARGET_DURATION_MS*2/2)]; opus_int32 out_len; int prev_toc; nb_packets = 0; while (get_next_packet(data+nb_packets, len+nb_p

60、ackets)) { int nb_frames; int err; nb_frames = opus_packet_get_nb_frames(data[nb_packets], len[nb_packets]); if (nb_frames < 1) { release_packets(data, nb_packets+1); return nb_frames; } nb_frames += opus_repacketizer_get_nb_frames(rp); // If adding the next packet would excee

61、d our target, or it has an // incompatible TOC sequence, output the packets we already have before // submitting it. // N.B., The nb_packets > 0 check ensures weve submitted at least one // packet since the last call to opus_repacketizer_init(). Otherwise a // single packet longer than TAR

62、GET_DURATION_MS would cause us to try to // output an (invalid) empty packet. It also ensures that prev_toc has // been set to a valid value. Additionally, len[nb_packets] > 0 is // guaranteed by the call to opus_packet_get_nb_frames() above, so the // reference to data[nb_packets][0] should

63、 be valid. if (nb_packets > 0 && ( ((prev_toc & 0xFC) != (data[nb_packets][0] & 0xFC)) || opus_packet_get_samples_per_frame(data[nb_packets], 48000)*nb_frames > TARGET_DURATION_MS*48)) { out_len = opus_repacketizer_out(rp, out, sizeof(out)); if (out_len < 0) { release_packe

64、ts(data, nb_packets+1); return (int)out_len; } output_next_packet(out, out_len); opus_repacketizer_init(rp); release_packets(data, nb_packets); data[0] = data[nb_packets]; len[0] = len[nb_packets]; nb_packets = 0; } err = opus_repacketizer_cat(rp, data[nb_packets], len[n

65、b_packets]); if (err != OPUS_OK) { release_packets(data, nb_packets+1); return err; } prev_toc = data[nb_packets][0]; nb_packets++; } // Output the final, partial packet. if (nb_packets > 0) { out_len = opus_repacketizer_out(rp, out, sizeof(out)); release_packets(data, nb_pac

66、kets); if (out_len < 0) return (int)out_len; output_next_packet(out, out_len); } 合并包的一個可替代方案是僅僅無條件地調(diào)用opus_repacketizer_cat()直到失敗。這樣,可以用opus_repacketizer_out()來獲得合并后的包,opus_repacketizer_cat()輸入的包需要重新添加到一個新的重新初始化的repacketizer狀態(tài). 類型定義文檔 typedef struct OpusRepacketizer OpusRepacketizer 函數(shù)文檔 int opus_repacketizer_cat ( OpusRepacketizer * rp, const unsigned char * data, opus_int32 len )

展開閱讀全文
溫馨提示:
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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!