Opus_低延遲音頻編解碼器API手冊(cè)中文翻譯
《Opus_低延遲音頻編解碼器API手冊(cè)中文翻譯》由會(huì)員分享,可在線閱讀,更多相關(guān)《Opus_低延遲音頻編解碼器API手冊(cè)中文翻譯(76頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、 Opus: IETF低延遲音頻編解碼器 :API 和操作手冊(cè) Opus 簡(jiǎn)介 Opus編解碼器是專門設(shè)計(jì)用于互聯(lián)網(wǎng)的交互式語(yǔ)音和音頻傳輸。 它是由 IETF 的編解碼器工作組設(shè)計(jì)的,合并了 Skype 的 SILK和 Xiph. Org的 CELT技術(shù)。 Opus 編解碼器的設(shè)計(jì)目的是處理廣泛的交互式音頻應(yīng)用程序 ,包括 IP 語(yǔ)音 , 視頻 ,游戲內(nèi)聊天 ,甚至遠(yuǎn)程現(xiàn)場(chǎng)音樂(lè)表演。它可以適用于從低碼率窄帶語(yǔ)音到非 常高質(zhì)量的立體聲音樂(lè)。它的主要特點(diǎn)
2、是 : 采樣率從 8 至 48 kHz 比特率從 6kb/s 到 510kb/s 對(duì)固定碼率 (CBR)和可變碼率 (VBR)都能支持 從窄帶到寬帶的音頻帶寬 支持語(yǔ)音和音樂(lè) 支持單聲道和立體聲 支持多通道 ( 最多 255 通道 ) 幀規(guī)格從 2.5 毫秒到 60 毫秒 良好的損失魯棒性和包丟失隱藏性 (PLC)(注:應(yīng)是指丟包也不容易被發(fā)現(xiàn)) 浮點(diǎn)和定點(diǎn)執(zhí)行 文檔包括 : Opus Encoder Opus Decoder Repacketizer Opus Multistream A
3、PI Opus library information functions Opus Custom Opus Encod er 本節(jié)描述了 Opus 編碼器 OpusEncoder的過(guò)程和函數(shù) 類型定義 typedef struct OpusEncoder OpusEncoder Opus encoder 狀態(tài) . 函數(shù)
4、 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 channels, int application)
5、 初始化一個(gè)以前分配的編碼器狀態(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) 對(duì)一個(gè) Opus 幀進(jìn)行編碼 . opus_int32 opus_encode_float (OpusEncoder *st, const float *pcm,
6、 int frame_size, unsigned char *data, opus_int32 max_data_bytes) 根據(jù)浮點(diǎn)輸入對(duì)一個(gè) Opus 幀進(jìn)行編碼 . void opus_encoder_destroy (OpusEncoder *st) 釋放一個(gè)根據(jù) opus_encoder_create() 已分配的 OpusEncoder 對(duì)象。 int opus_encoder_ctl (OpusEncoder *st, int request,...) 向一個(gè) Opus 編碼器執(zhí)行一個(gè) CTL 函數(shù) .
7、 詳細(xì)描述 本節(jié)描述了用于編碼 Opus 的過(guò)程和函數(shù)。 既然 Opus 是一個(gè)有狀態(tài)的編解碼器,編碼過(guò)程始于創(chuàng)建一個(gè)編碼器狀態(tài), 用以下方法做到: int error; OpusEncoder *enc; enc = opus_encoder_create (Fs, channels, application, &error); 從這一點(diǎn)上 , enc 可以用于編碼音頻流。 一個(gè)編碼器狀態(tài)在同一時(shí)間不得用于 多于一個(gè)音頻流。同樣 ,編碼器狀態(tài)不能對(duì)于每幀重新初始化。 當(dāng) opus_encoder_crea
8、te() 為狀態(tài)分配內(nèi)存時(shí),它也可以初始化預(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)要求的大小。 注意 ,這段代碼的未來(lái)版本 可能改變大小 ,所以沒(méi)有 assuptions 應(yīng)該對(duì)它做出。
9、 編碼器狀態(tài)在內(nèi)存中總是連續(xù) ,復(fù)制它只要一個(gè)淺拷貝就足夠了。 使用 opus_encoder_ctl() 接口可以改變一些編碼器的參數(shù)設(shè)置。所有這些參數(shù) 都已有缺省值,所以只在必要的情況下改變它們。最常見(jiàn)的參數(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)); 在這里:
10、 bitrate (比特率)的單位是比特 / 秒 (b / s) complexity (復(fù)雜性)是一個(gè)值從 1 到 10,1 最低, 10 最高,值越大越 復(fù)雜 signal_type (信號(hào)的類型)包括 OPUS_AUTO (缺省 ), OPUS_SIGNAL_VOICE, or OPUS_SIGNAL_MUSIC。 看 Encoder related CTLs 和 Generic CTLs可以獲得可設(shè)置和查詢的參數(shù)詳細(xì)清單。在一個(gè)音頻流處理過(guò)程中,大
11、多數(shù)參數(shù)可以設(shè)置或修改。 為了對(duì)一個(gè)幀進(jìn)行編碼, 必須正確地用音頻數(shù)據(jù)的幀 (2.5, 5, 10, 20, 40 或 60 毫 秒 )來(lái)調(diào)用 opus_encode() 或 opus_encode_float() 函數(shù)。 len = opus_encode(enc, audio_frame, frame_size, packet, max_packet); 在這里: audio_frame ( 音頻幀)是 opus_int16( 或用于 opus_encode_float() 的浮點(diǎn) ) 格 式的音頻數(shù)據(jù) frame_s
12、ize (幀大小)是樣本中幀的最大數(shù) ( 每個(gè)通道 ) packet (包)是寫成壓縮數(shù)據(jù)的字節(jié)數(shù)組 , max_packet 是可以寫入包的字節(jié)數(shù)的最大值推薦 (4000 字節(jié) ) 。不要使用 max_packet 控制 VBR的目標(biāo)比特率 , 而應(yīng)該用 OPUS_SET_BITRATECTL。 opus_encode() 和 opus_encode_float() 返回實(shí)際寫入包的字節(jié)數(shù)。返回值可以是 負(fù)數(shù) ,這表明一個(gè)
13、錯(cuò)誤已經(jīng)發(fā)生。 如果返回值是 1 個(gè)字節(jié) ,那么包不需要傳播 (DTX)。 一旦一個(gè)編碼器狀態(tài)已不再需要,可以用以下方式解構(gòu): opus_encoder_destroy (enc); 如果編碼器是用 opus_encoder_init() 創(chuàng)建的,而不是使用 opus_encoder_create() 函數(shù),那么不需要采取行動(dòng),要求從潛在的釋放為它手動(dòng)分配的內(nèi)存 (上述例子是調(diào)用 free(enc))中分離。 類型定義文檔 typedef struct OpusEncoder OpusEncoder Opus編碼器狀態(tài)
14、。 這包含了一個(gè) Opus編碼器的完整狀態(tài)。它是位置獨(dú)立的,并且可以自由復(fù)制。 函數(shù)文檔 opus_int32 opus_encode ( OpusEncoder * const opus_int16 * pcm, int frame_size, unsigned char * data, opus_int32 max_data_bytes st, ) 對(duì)一個(gè) Opus 幀進(jìn)行編碼。 參數(shù): [in] st OpusEncoder*:編碼器狀態(tài) [i
15、n] pcmopus_int16*: 輸 入 信 號(hào) ( 如 果 是 2 通 道 有 交 叉 ). 長(zhǎng) 度 是 frame_size*channels*sizeof(opus_int16) [in] frame_size int: 輸入信號(hào)的每通道樣本數(shù) . 這必須是編碼器采樣率的 Opus 幀大小。比如,48 kHz 下允許值有 120, 240, 480, 960, 1920, 和 2880。少于 10 毫秒的采樣( 48 kHz 有 480 個(gè)樣本 ),將阻止編碼器使用 LPC或混合模式。 [out] data unsigned char*: 輸出負(fù)
16、載。必須包含至少 max_data_bytes 的 容量。 [in] max_data_bytes opus_int32: 為輸出負(fù)載所分配的內(nèi)存大小。 可以用于限制 固 定 比 特 率 的 最 大 上 限 , 但 不 能 用作 唯 一 的 比特 率限 制 ,可 以用 OPUS_SET_BITRATE來(lái)控制比特率。 返回值:成功,是被編碼包的長(zhǎng)度(字節(jié)數(shù)) ,失敗,一個(gè)負(fù)的錯(cuò)誤代碼 opus_int32 opus_encode_float ( Op
17、usEncoder * st, const float * pcm, int frame_size, unsigned char * data, opus_int32 max_data_bytes ) 根據(jù)浮點(diǎn)輸入對(duì)一個(gè) Opus 幀進(jìn)行編碼 . 參數(shù): [in] st OpusEncoder*:編碼器狀態(tài) [in] pcmfloat*: 浮點(diǎn)格式的輸入 (如果是 2 通道有交叉 ),正常范圍在 +/-1.0 之 間 . 超過(guò)該范圍的采樣也是支持的,但它將被解碼器用整型 API截
18、取,并且只能在 知 道 遠(yuǎn) 端 支 持 擴(kuò) 展 的 動(dòng) 態(tài) 范 圍 的 情 況 下 使 用 。 長(zhǎng) 度 是 frame_size*channels*sizeof(float) [in] frame_size int: 輸入信號(hào)的每通道樣本數(shù) . 這必須是編碼器采樣率的 Opus 幀大小。比如, 48 kHz 下允許值有 120, 240, 480, 960, 1920, 和 2880。 少于 10 毫秒的采樣( 48 kHz 有 480 個(gè)樣本 ),將阻止編碼器使用 LPC或混合模式。 [out] data unsigned char*:輸出負(fù)
19、載。必須包含至少 max_data_bytes 的 容量。 [in] max_data_bytes opus_int32: 為輸出負(fù)載所分配的內(nèi)存大小。 可以用于限制 固 定 比 特 率 的 最 大 上 限 , 但 不 能 用作 唯 一 的 比特 率限 制 ,可 以用 OPUS_SET_BITRATE來(lái)控制比特率。 . 返回值: 成功,是被編碼包的長(zhǎng)度(字節(jié)數(shù)) ,失敗,一個(gè)負(fù)的錯(cuò)誤代碼。 OpusEncoder* opus_encoder_create ( opus_int32 Fs, int channels, int applicatio
20、n, int * error ) 分配和初始化一個(gè)編碼器狀態(tài)。 包括三種編碼模式: OPUS_APPLICATION_VOIP:在給定比特率條件下為聲音信號(hào)提供最高質(zhì)量, 它通過(guò)高通濾波和強(qiáng)調(diào)共振峰和諧波增強(qiáng)了輸入信號(hào)。 它包括帶內(nèi)前向錯(cuò)誤檢查 以預(yù)防包丟失。典型的 VOIP 應(yīng)用程序使用這種模式。由于進(jìn)行了增強(qiáng),即使是 高比特率的情況下,輸出的聲音與輸入相比,聽(tīng)起來(lái)可能不一樣。 OPUS_APPLICATION_AUDIO:對(duì)大多數(shù)非語(yǔ)音信號(hào),如音樂(lè),在給定比特率 條件下提供了最高的質(zhì)量。使用這種模式的場(chǎng)合包括音樂(lè)、混音 (音樂(lè) /
21、 聲音 ),廣 播 ,和需要不到 15 毫秒的信號(hào)延遲的其他應(yīng)用。 OPUS_APPLICATION_RESTRICTED_LOWDELAY:配置低延遲模式將為減少延遲禁用語(yǔ)音優(yōu)化模式。 這種模式只能在剛初始化或剛重設(shè)編碼器的情況下使用, 因?yàn)樵谶@些情況下編解碼器的延遲被修改了。 (當(dāng)心?。┊?dāng)調(diào)用者知道語(yǔ)音優(yōu)化模式不再需要時(shí),配置低延遲模式是有用 的。 參數(shù): [in] Fs opus_int32: 輸入信號(hào)的采樣率 (Hz),必須是 8000、12000、 16000、 24000、或 48000。 [in] chann
22、els int: 輸入信號(hào)的通道數(shù) (1 or 2) 。 [in] application int: 編 碼 模 式 (OPUS_APPLICATION_VOIP/OPUS_APPLICATION_AUDIO/OPUS_APPLICATION_RESTRI CTED_LOWDELAY) [out] error int*: 錯(cuò)誤代碼 注意:無(wú)論選擇什么樣的采樣率和通道數(shù) , 如果選擇的比特率太低, Opus 編碼器可以切換到一個(gè)較低的音頻帶寬或通道數(shù)。這也意味著總是使用 48 kHz 立體聲輸入和讓編碼器優(yōu)化編碼是安全的。 int opu
23、s_encoder_ctl ( OpusEncoder * st, int request, ... ) 向一個(gè) Opus 編碼器執(zhí)行一個(gè) CTL 函數(shù) . 一般其請(qǐng)求和后續(xù)的參數(shù)是由一個(gè)提供便利的宏來(lái)產(chǎn)生的。 參數(shù) : st OpusEncoder*: 編碼器狀態(tài) request int :這個(gè)及所有其他參數(shù)應(yīng)被 1 個(gè)在 Generic CTLs或 Encoder related CTLs所提供便利的宏來(lái)替代 參見(jiàn) : Generic CTLs Encoder related CTLs void
24、opus_encoder_destroy ( OpusEncoder * st ) Frees an OpusEncoder allocated by opus_encoder_create(). 釋放一個(gè)根據(jù) opus_encoder_create() 已分配的 OpusEncoder 對(duì)象。 參數(shù) : [in] st OpusEncoder*: 用于釋放的編碼器狀態(tài)。 int opus_encoder_get_size ( int channels ) 獲得 Opu
25、sEncoder 結(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 ) 初始化一個(gè)以 前分配的 編碼器狀態(tài)。 狀態(tài)所指向的內(nèi)存必 須至少 是 opus_encoder_get_size()返回的大小 . 在這里,應(yīng)用程序不要用系統(tǒng)自動(dòng)分配內(nèi)存,而要
26、準(zhǔn)備用自己的分配器。 參見(jiàn) : opus_encoder_create(),opus_encoder_get_size()。為重設(shè)一個(gè)以前初始化的狀態(tài),使用 OPUS_RESET_STATE CTL. 參數(shù) : [in] [in] st OpusEncoder*: 編碼器狀態(tài) Fs opus_int32: 輸入信號(hào)的采樣率 (Hz),必須是 8000、12000、 16000、24000、或 48000。 [in] channels int: 輸入信號(hào)的通道數(shù) (
27、1 or 2) [in] application int: 編 碼 模 式 (OPUS_APPLICATION_VOIP/OPUS_APPLICATION_AUDIO/OPUS_APPLICATION_RESTRI CTED_LOWDELAY) 返回值 : 成功, OPUS_OK,失敗,錯(cuò)誤代碼。 Opus Decod er 本節(jié)描述了 Opus 解碼器 OpusDecoder的過(guò)程和函數(shù) 類型定義 typedef struct OpusDecoder OpusDecode
28、r Opus 解碼器狀態(tài) . 函數(shù) int opus_decoder_get_size (int channels) 獲得 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)
29、. int opus_decode (OpusDecoder *st, const unsigned char *data, opus_int32 len, opus_int16 *pcm, int frame_size, int decode_fec) 解碼一個(gè) Opus 包 . int opus_decode_float (OpusDecoder *st, const unsigned char *data, opus_int32 len, float *pcm, int frame_size, int decode_fec)
30、 解碼一個(gè)浮點(diǎn)輸出的 Opus 包, . int opus_decoder_ctl (OpusDecoder *st, int request,...) 向一個(gè) Opus 解碼器執(zhí)行 CTL 函數(shù)。 void opus_decoder_destroy (OpusDecoder *st) 釋放通過(guò) opus_decoder_create() .分配過(guò)的 OpusDecoder。 int opus_packet_parse (const unsigned char *data, opus_int32 len, u
31、nsigned char *out_toc, const unsigned char *frames[48], short size[48], int *payload_offset) 將一個(gè) opus 包解析成 1 個(gè)或多個(gè)幀 . int opus_packet_get_bandwidth (const unsigned char *data) 獲得一個(gè) Opus 包的帶寬 . int opus_packet_get_samples_per_frame (const u
32、nsigned 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) 獲得 Opus 包所有幀的數(shù)量 . int opus_packet_ge
33、t_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 的過(guò)程和方法 .
34、 與編碼相似,解碼進(jìn)程也是開(kāi)始于創(chuàng)建一個(gè)解碼器狀態(tài)。用以下方法做 到: int error; OpusDecoder *dec; dec = opus_decoder_create(Fs, channels, &error); 在這里: Fs 是采樣率,必須是 8000, 12000, 16000, 24000, 或 48000 channels 是通道數(shù) (1 或 2) error 將 保 存 出 錯(cuò) 情 況 下 的 錯(cuò) 誤 代 碼 ( 或 成 功 狀 態(tài) 下 的 OPUS_OK ) 返回值是一個(gè)新創(chuàng)建的用于解碼的解碼器狀態(tài)
35、 當(dāng) opus_decoder_create() 為狀態(tài)分配內(nèi)存時(shí) , 它也可以初始化預(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)要求的大小 . 注意 ,這段代碼的 未來(lái)版本可能改變大小 ,
36、所以沒(méi)有 assuptions 應(yīng)該對(duì)它做出。 解碼器狀態(tài)在內(nèi)存中總是連續(xù) ,復(fù)制它只要一個(gè)淺拷貝就足夠了。 為解碼一個(gè)幀 , opus_decode() 或 opus_decode_float()必須用壓縮音頻數(shù)據(jù)的包來(lái)調(diào)用 : frame_size = opus_decode(dec, packet, len, decoded, max_size, 0); 在這里 packet 是包含壓縮數(shù)據(jù)的字節(jié)數(shù)組 len 是包內(nèi)字節(jié)的精確數(shù)量 decoded 是 opus_int16 (或由 opus_decode_float()定義的浮點(diǎn)
37、型 ) 格式的解碼后的音頻數(shù)據(jù)。 max_size是可以放入解碼幀的每個(gè)通道各樣本中幀的最大值 opus_decode() 和 opus_decode_float() 返回從包解碼后的每通道樣本的 數(shù)量。如果這個(gè)值是負(fù)的,表示有錯(cuò)誤發(fā)生。如果包損壞或音頻緩沖太小不 足以容納解碼后的音頻,錯(cuò)誤就會(huì)發(fā)生。 Opus 是包含重疊塊的有狀態(tài)的編解碼器,其結(jié)果是 Opus 包并不是彼此 獨(dú)立編碼。包必須按正確的次序,連續(xù)地進(jìn)入解碼器進(jìn)行正確的解碼。丟失 的包可以用遺失隱藏來(lái)替換, 遺失隱藏用一個(gè)空的指針和 0 長(zhǎng)度的
38、包來(lái)調(diào)用 解碼器。 一個(gè)單獨(dú)的編解碼器狀態(tài)在一個(gè)時(shí)間只能由一個(gè)單獨(dú)的線程來(lái)訪問(wèn),調(diào) 用者執(zhí)行任何需要的鎖定。 各分開(kāi)的音頻數(shù)據(jù)流可以用各自分開(kāi)的解碼器狀 態(tài)平行地進(jìn)行解碼,除非 API庫(kù)在編譯時(shí)用了 NONTHREADSAFE_PSEUDOSTACK 定義。 類型定義文檔 typedef struct OpusDecoder OpusDecoder Opus 解碼器狀態(tài) . 這包含了一個(gè) Opus 解碼器的完整狀態(tài)。 它是位置獨(dú)立的, 并且可以自由 復(fù)制。 參見(jiàn) : opus_dec
39、oder_create,opus_decoder_init 函數(shù)文檔 int opus_decode ( OpusDecoder * const unsigned char * data, opus_int32 len, opus_int16 * pcm, int frame_size, int decode_fec st, ) 對(duì)一個(gè) Opus 包進(jìn)行解碼。 參數(shù) : [in] st OpusDecoder*: 解碼器狀態(tài) [in] data char*:輸入負(fù)載
40、.對(duì)包丟失使用一個(gè)空指針來(lái)表示。 [in] len opus_int32:在輸入負(fù)載中的字節(jié)數(shù) [out] pcmopus_int16*: 輸出信號(hào)(如果是 2 通道有交叉)。長(zhǎng)度等 于 frame_size*channels*sizeof(opus_int16) [in] frame_size :在 PCM 可用空間中每通道的樣本數(shù)。如果小于最 大包的時(shí)長(zhǎng)( 120 毫秒, 4848kHz5760個(gè)),這個(gè)函數(shù)將不能解碼一些包。如 果是 PLC (data==NULL)或 FEC (decode_fec=1)的情況,那么 frame
41、_size 必須正 好是丟失音頻的時(shí)長(zhǎng),否則解碼器無(wú)法在解碼下一個(gè)包時(shí)進(jìn)入優(yōu)化狀態(tài)。對(duì) 于 PLC 和 FEC 的情況, frame_size 必須是 2.5 毫秒的倍數(shù)。 [in] decode_fec int: 對(duì)于請(qǐng)求任何帶內(nèi)前向錯(cuò)誤糾正數(shù)據(jù)進(jìn)行解碼 的狀態(tài)標(biāo)志 (0 or 1) 。如果沒(méi)有這樣的數(shù)據(jù)可用,幀在解碼時(shí)被認(rèn)為已經(jīng)丟 失。 返回 : 解碼樣本的數(shù)量,或錯(cuò)誤代碼。 int opus_decode_float ( OpusDecoder * const unsigned char * data, o
42、pus_int32 len, float * pcm, int frame_size, int decode_fec st, ) 用浮點(diǎn)輸出格式解碼一個(gè) Opus 包。 參數(shù) : [in] st OpusDecoder*: 解碼器狀態(tài) [in] data char*:輸入負(fù)載 .對(duì)包丟失使用一個(gè)空指針來(lái)表示。 [in] len opus_int32: 在輸入負(fù)載中的字節(jié)數(shù) [out] pcmfloat*: 輸出信號(hào)(如果是 2 通道有交叉) 。長(zhǎng)度等于 frame_size*channel
43、s*sizeof(float) [in] frame_size :在 PCM 可用空間中每通道的樣本數(shù)。如果小于最 大包的時(shí)長(zhǎng)( 120 毫秒, 4848kHz5760個(gè)),這個(gè)函數(shù)將不能解碼一些包。如 果是 PLC (data==NULL)或 FEC (decode_fec=1)的情況,那么 frame_size 必須正 好是丟失音頻的時(shí)長(zhǎng),否則解碼器無(wú)法在解碼下一個(gè)包時(shí)進(jìn)入優(yōu)化狀態(tài)。對(duì) 于 PLC 和 FEC 的情況, frame_size 必須是 2.5 毫秒的倍數(shù)。 [in] decode_fec int: 對(duì)于請(qǐng)求任何帶內(nèi)前
44、向錯(cuò)誤糾正數(shù)據(jù)進(jìn)行解碼 的狀態(tài)標(biāo)志 (0 or 1) 。如果沒(méi)有這樣的數(shù)據(jù)可用,幀在解碼時(shí)被認(rèn)為已經(jīng)丟 失。 返回 : 解碼樣本的數(shù)量,或錯(cuò)誤代碼。 OpusDecoder* opus_decoder_create ( opus_int32 Fs, int channels, int * error ) 分配和初始化解碼器狀態(tài) . 參數(shù) : [in] Fs opus_int32: 解碼的采樣率 (Hz). 必須是 8000, 12000, 16000, 24000, 或 4800
45、0. [in] channels [out] error int: 用于解碼的通道數(shù) (1 or 2) int*: 成功時(shí)是 OPUS_OK Success或錯(cuò)誤代碼 Opus 在內(nèi)部用 48000 Hz來(lái)存儲(chǔ)數(shù)據(jù),所以對(duì)于 FS來(lái)說(shuō) 48000 Hz 是缺省 值。然而,解碼器在 8, 12, 16, 和 24 kHz下也可以有效解碼到緩沖,所以,由于某些原因調(diào)用者不能在全采樣率下使用數(shù)據(jù), 或知道被壓縮的數(shù)據(jù)不能在全頻率范圍內(nèi)使用,可以請(qǐng)求用更小的頻率解碼。同樣的,解碼器可以根 據(jù)調(diào)用者的請(qǐng)求,填充單聲道或交叉立體聲的 PCM
46、緩沖區(qū)。 int opus_decoder_ctl ( OpusDecoder * st, int request, ... ) 向一個(gè) Opus 解碼器執(zhí)行一個(gè) CTL 函數(shù) . 一般其請(qǐng)求和后續(xù)的參數(shù)是由一個(gè)提供便利的宏來(lái)產(chǎn)生的。 參數(shù) : st OpusDecoder*: 解碼器狀態(tài) . request :這個(gè)及所有其他剩余參數(shù)應(yīng)被 1 個(gè)在 Generic CTLs 或 Encoder related CTLs所提供便利的宏
47、來(lái)替代 參見(jiàn) : Generic CTLs Decoder related CTLs void opus_decoder_destroy ( OpusDecoder * st ) 釋放一個(gè)根據(jù) opus_decoder_create()已分配的 OpusDecoder 對(duì)象 . 參數(shù) : [in] st OpusDecoder*:用于釋放的解碼器狀態(tài)。 int opus_decoder_get_nb_samples ( const OpusDecoder * const unsigned char p
48、acket[], opus_int32 len dec, ) 獲得一個(gè) Opus 包的樣本數(shù) 參數(shù) : [in] dec OpusDecoder*: 解碼器狀態(tài) [in] packet char*: Opus 包 [in] len opus_int32: 包的長(zhǎng)度 返回 : 樣本的數(shù)量 返回值 : OPUS_INVALID_PACKET:通過(guò)的被壓縮數(shù)據(jù)已損壞或其格式不被支 持。 int opus_decoder_get_size ( int channel
49、s ) 獲得 OpusDecoder結(jié)構(gòu)的大小。 參數(shù) : [in] channels int: 通道數(shù),必須是 1 或 2. 返回 : 字節(jié)數(shù)的大小 . int opus_decoder_init ( OpusDecoder * st, opus_int32 Fs, int channels ) 初始化一個(gè)以前分配過(guò)的解碼器狀態(tài) . 狀態(tài)必須至少是 opus_decoder_get_size()返回的大小 . 在這里,應(yīng)用程序不要用系統(tǒng)自動(dòng)分配內(nèi)存, 而要準(zhǔn)備用自己的分配器。
50、 參見(jiàn) : opus_decoder_create,opus_decoder_get_size,為重設(shè)一個(gè)以前初始化的 狀態(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] chan
51、nels int: 解碼的通道數(shù) (1 or 2) 返回值 : 成功, OPUS_OK ,失敗,錯(cuò)誤代碼。 int opus_packet_get_bandwidth ( const unsigned char * data ) 獲得一個(gè) Opus 包的帶寬。 參數(shù) : [in] data char*: Opus 包 返回值 : OPUS_BANDWIDTH_NARROWBAND窄帶 (4kHz bandpass) OPUS_BANDWIDTH_MEDIUMBAND中等帶寬 (6kHz
52、 bandpass) OPUS_BANDWIDTH_WIDEBAND寬帶 (8kHz bandpass) OPUS_BANDWIDTH_SUPERWIDEBAND高 寬 帶 (12kHz bandpass) OPUS_BANDWIDTH_FULLBAND全寬帶 (20kHz bandpass) OPUS_INVALID_PACKET通過(guò)的被壓縮數(shù)據(jù)已損壞或其格式不被支持 int opus_packet_get_nb_channels ( const unsigned char * data ) 獲得 Opus 包的通道數(shù)。 參數(shù) :
53、 [in] data char*: Opus 包 返回 : 通道數(shù)量 返回值 : OPUS_INVALID_PACKET通過(guò)的被壓縮數(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:包的長(zhǎng)度 返回 :
54、 幀的數(shù)量 返回值 : OPUS_INVALID_PACKET通過(guò)的被壓縮數(shù)據(jù)已損壞或其格式不被支 持 int opus_packet_get_nb_samples packet[], opus_int32 len, opus_int32 Fs ( const unsigned char ) 獲得 Opus 包的樣本數(shù)。 參數(shù) : [in] packet char*: Opus 包 [
55、in] len opus_int32: 包的長(zhǎng)度 [in] Fs opus_int32: 采樣率( Hz). 必須是 400 的倍數(shù),否則結(jié)果不 準(zhǔn)確。 返回 : 樣本的數(shù)量 返回值 : OPUS_INVALID_PACKET通過(guò)的被壓縮數(shù)據(jù)已損壞或其格式不被支 持 int opus_packet_get_samples_per_frame ( const unsigned char * data, opus_int32 Fs ) 獲得 Opus 包每幀的樣本數(shù)。 參數(shù) :
56、 [in] data char*: Opus 包. 必須包含至少一個(gè)字節(jié)的數(shù)據(jù)。 [in] Fs opus_int32: 采樣率( Hz) .必須是 400 的倍數(shù),否則結(jié)果不 準(zhǔn)確。 返回 : 每幀樣本的數(shù)量 . int opus_packet_parse ( const unsigned char * opus_int32 len, unsigned char * out_toc, const unsigned char * frames[48], short size[48], int
57、 * payload_offset data, ) 將一個(gè) opus 包解析成 1 個(gè)或多個(gè)幀 . Opus_decode 在內(nèi)部執(zhí)行這個(gè)操作,所以大多數(shù)應(yīng)用程序不需要用到這 個(gè)函數(shù)。這個(gè)函數(shù)不復(fù)制各幀,返回的指針是輸入包內(nèi)部的指針。 參數(shù) : [in] data char*:要進(jìn)行解析的 Opus包 [in] len opus_int32: 數(shù)據(jù)的大小 [out] out_toc char*: TOC 指針 [out] frames char*[48] 封裝過(guò)的幀 [out] si
58、ze short[48] 封裝過(guò)的幀的大小 [out] payload_offset int*: 返回在包內(nèi)負(fù)載的位置 (按字節(jié) ) 返回 : 幀的數(shù)量 Repacketizer Repacketizer可將多個(gè)包 Opus 合并成一個(gè)包,或?qū)⒁郧昂喜⒌陌蛛x成 多個(gè) Opus 包。 類型定義 typedef struct OpusRepacketizer OpusRepacketizer
59、 函數(shù) int opus_repacketizer_get_size (void) 獲得 OpusRepacketizer 結(jié)構(gòu)的大小 OpusRepacketizer * opus_repacketizer_init (OpusRepacketizer *rp) (重新 )初始化以前分配過(guò)的 repacketizer 狀態(tài) . OpusRepacketizer * opus_repacketizer_create (void) 為用 opus_repacketizer_init() 產(chǎn)生的新 repacketiz
60、er 分配內(nèi)存和初始化。 void opus_repacketizer_destroy (OpusRepacketizer *rp) 釋 放 通 過(guò) opus_repacketizer_create() 分 配 過(guò) 的 OpusRepacketizer int opus_repacketizer_cat (OpusRepacketizer *rp, const unsigned char *data, opus_int32 len) 給當(dāng)前的 repacketizer 狀態(tài)
61、增加一個(gè)包。 opus_int32 opus_repacketizer_out_range (OpusRepacketizer *rp, int begin, int end, unsigned char *data, opus_int32 maxlen) 通過(guò) opus_repacketizer_cat() 從以前提交給 repacketizer 狀態(tài)的數(shù) 據(jù)構(gòu)建一個(gè)新的包。 int opus_repacketizer_get_nb_frames (OpusRepacketizer *rp) 返
62、 回 最 后 一 次 調(diào) 用 opus_repacketizer_init() 或 opus_repacketizer_create() 后 , 到 當(dāng) 前 為 止 通 過(guò) opus_repacketizer_cat() 提交的包數(shù)據(jù)所包含的幀的總數(shù)。 opus_int32 opus_repacketizer_out (OpusRepacketizer *rp, unsigned char *data, opus_int32 maxlen) 通過(guò) opus_repacketizer_cat() 從以前提交
63、給 repacketizer 狀態(tài)的數(shù)據(jù)構(gòu)建一個(gè)新的包。 詳細(xì)描述 Repacketizer可將多個(gè)包 Opus 合并成一個(gè)包,或?qū)⒁郧昂喜⒌陌蛛x成 多個(gè) Opus 包。 分離有效的包可以保證成功,然而,只有在所有的幀都有相同的編碼模 式、帶寬、幀大小,并且合并后的包總的時(shí)長(zhǎng)不超過(guò) 120 毫秒,合并有效的 包才能成功。對(duì)多流包的操作不會(huì)成功,除了這些包由來(lái)自同一音頻流的數(shù) 據(jù)組成的退化情況。 重構(gòu)包的過(guò)程開(kāi)始于創(chuàng)建一個(gè) repacketizer 狀態(tài),創(chuàng)建既可以通過(guò)調(diào)用 opus_repacketize
64、r_create()函數(shù)也可以通過(guò)自己分配內(nèi)存的方式來(lái)進(jìn)行, 例如 OpusRepacketizer *rp; rp = (OpusRepacketizer*)malloc(opus_repacketizer_get_size()); if (rp != NULL) opus_repacketizer_init(rp); 之 后 應(yīng) 用 程 序 應(yīng) 通 過(guò) opus_repacketizer_cat() 來(lái) 提 交 包 , 用 opus_repacketizer_out()或 opus_repacketizer_out_range()提取新的
65、包,然后通 過(guò) opus_repacketizer_init()為下一套輸入包重設(shè)狀態(tài)。 下面的例子中,將一個(gè)系列的包分離成各單獨(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, data, len)
66、; 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, 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); } 可 選 擇 將 一 個(gè) 系 列 的 幀 合 并 到 各 個(gè) 包 中 , 每 個(gè)
- 溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 銷售技巧培訓(xùn)課件:接近客戶的套路總結(jié)
- 20種成交的銷售話術(shù)和技巧
- 銷售技巧:接近客戶的8種套路
- 銷售套路總結(jié)
- 房產(chǎn)銷售中的常見(jiàn)問(wèn)題及解決方法
- 銷售技巧:值得默念的成交話術(shù)
- 銷售資料:讓人舒服的35種說(shuō)話方式
- 汽車銷售績(jī)效管理規(guī)范
- 銷售技巧培訓(xùn)課件:絕對(duì)成交的銷售話術(shù)
- 頂尖銷售技巧總結(jié)
- 銷售技巧:電話營(yíng)銷十大定律
- 銷售逼單最好的二十三種技巧
- 銷售最常遇到的10大麻煩
- 銷售資料:銷售10大黃金觀念
- 銷售資料:導(dǎo)購(gòu)常用的搭訕?lè)椒?/a>