音頻編解碼器 - Opus

簡介

Opus是一款完全開放、免版稅、功能多樣的音頻編解碼器。它適用于互聯(lián)網(wǎng)上的交互式語音和音樂傳輸,但也適用于存儲和流媒體應(yīng)用。

Opus的前身是celt編碼器。在當(dāng)今的有損音頻格式爭奪上,擁有眾多不同編碼器的AAC格式打敗了同樣頗有潛力的Musepack、Vorbis等格式,而在Opus格式誕生后,情況似乎不同了。通過諸多的對比測試,低碼率下Opus完勝曾經(jīng)優(yōu)勢明顯的HE AAC,中碼率就已經(jīng)可以媲敵碼率高出30%左右的AAC格式,而高碼率下更接近原始音頻。

Opus可以處理各種音頻應(yīng)用,包括IP語音,視頻會議,游戲內(nèi)聊天,甚至遠程現(xiàn)場音樂表演。它可以從低比特率窄帶語音擴展到非常高質(zhì)量的立體聲音樂。支持的特性包括:

  • 比特率從 6kb/s 到 510 kb/s
  • 采樣率從 8kHz(窄帶)到 48kHz(全頻段)
  • 幀大小從 2.5ms 到 60ms
  • 支持恒定比特率(CBR)和可變比特率(VBR)
  • 從窄帶到全頻帶的音頻帶寬
  • 支持語音和音樂
  • 支持單聲道和立體聲
  • 支持多達255個通道(多流幀)
  • 動態(tài)可調(diào)比特率,音頻帶寬和幀大小
  • 良好的穩(wěn)健性和隱蔽性
  • 浮點和定點實現(xiàn)

可以在RFC 6716中閱讀完整說明書,包括參考實現(xiàn)。下載頁面還提供了最新的Opus標(biāo)準(zhǔn)實現(xiàn)。

編譯opus靜態(tài)庫

  • 從GitHub下載Opus-iOS編譯工程
  • 在Opus-iOS編譯工程根目錄下創(chuàng)建Opus-iOS/build/src目錄。
  • 下載opus穩(wěn)定版,得到opus-xx.tar文件。
  • 將opus-xx.tar放到Opus-iOS/build/src目錄下。
  • 如果你下載的opus版本和build-libopus.sh中的opus版本信息不一樣,你要修改以下版本信息。
VERSION="1.2"       #這是opus版本
SDKVERSION="11.4"   #這是SDK版本
MINIOSVERSION="9.0" #這是最低iOS版本
  • 在命令行中執(zhí)行編譯:
$ ./build-libopus.sh
  • 編譯完成后在Opus-iOS/dependencies中會看到includelib
  • 關(guān)于編譯Static LibraryFramework 的詳細步驟請看Opus-iOS/README.md

集成opus到Xcode工程

用Xcode新建OpusDemo,將includelib一同拷貝到工程中即可。
這一步就不細說了,新手請自行搜索Xcode集成靜態(tài)庫的方法。
不想往下看的話請直接看示例OpusDemo

opus主要接口

  • opus的接口聲明在include/opus.h中,下面是四個主要的函數(shù):
// 創(chuàng)建編碼器
OpusEncoder *opus_encoder_create(
    opus_int32 Fs,
    int channels,
    int application,
    int *error
)

// 修改編碼器參數(shù)
int opus_encoder_ctl(
    OpusEncoder *st, 
    int request, ...
)

// 創(chuàng)建解碼器
OpusDecoder *opus_decoder_create(
    opus_int32 Fs,
    int channels,
    int *error
)

// 將PCM編碼成opus
opus_int32 opus_encode(
    OpusEncoder *st,
    const opus_int16 *pcm,
    int frame_size,
    unsigned char *data,
    opus_int32 max_data_bytes
) 

// 從opus中譯碼出PCM
int opus_decode(
    OpusDecoder *st,
    const unsigned char *data,
    opus_int32 len,
    opus_int16 *pcm,
    int frame_size,
    int decode_fec
) 

Tips

  • 使用動態(tài)碼率?

編碼器默認使用動態(tài)碼率,因此需要記錄每一個幀編碼之后的大小。我的demo使用2字節(jié)的頭來記錄每一塊opus數(shù)據(jù)的大小,具體請看我的demo。

靜態(tài)碼率需要設(shè)置編碼器的初始化參數(shù)如下,編碼后產(chǎn)生固定的大小的opus塊。

opus_encoder_ctl(_encoder, OPUS_SET_VBR(0));  // 0固定碼率,1動態(tài)碼率
  • 指定碼率?

你可以指定opus編碼的碼率大小,比特率從 6kb/s 到 510 kb/s,想要壓縮比大一些就設(shè)置碼率小一點,但是相應(yīng)的也會使聲音失真多一些。

#define BITRATE 16000 
opus_encoder_ctl(_encoder, OPUS_SET_BITRATE(BITRATE));
  • 語音信號優(yōu)化?

如果你用于語音而不是音樂,那你完全可以設(shè)置如下,以使編碼器針對語音模式做優(yōu)化處理。

opus_encoder_ctl(_encoder, 
OPUS_SET_APPLICATION(OPUS_APPLICATION_VOIP));

opus_encoder_ctl(_encoder, OPUS_SET_SIGNAL(OPUS_SIGNAL_VOICE));

一組測試數(shù)據(jù)

(以下結(jié)果只在本例參數(shù)條件下有效)

15:47:17.948335 WAV => PCM: 39584
15:47:17.958745 encodedBytes: 97
15:47:17.961646 encodedBytes: 116
15:47:17.964055 encodedBytes: 121
15:47:17.966504 encodedBytes: 112
15:47:17.969272 encodedBytes: 104
15:47:17.972323 encodedBytes: 118
15:47:17.975030 encodedBytes: 116
15:47:17.977766 encodedBytes: 115
15:47:17.980185 encodedBytes: 116
15:47:17.982257 encodedBytes: 101
15:47:17.984174 encodedBytes: 143
15:47:17.986285 encodedBytes: 147
15:47:17.988596 encodedBytes: 134
15:47:17.990366 encodedBytes: 112
15:47:17.991779 encodedBytes: 97
15:47:17.993259 encodedBytes: 93
15:47:17.994783 encodedBytes: 100
15:47:17.996292 encodedBytes: 105
15:47:17.997766 encodedBytes: 110
15:47:17.999361 encodedBytes: 94
15:47:17.999390 PCM => OPUS: 2291
15:47:17.999658 decodedSamples:960
15:47:17.999843 decodedSamples:960
15:47:17.999992 decodedSamples:960
15:47:18.000191 decodedSamples:960
15:47:18.000347 decodedSamples:960
15:47:18.000585 decodedSamples:960
15:47:18.000696 decodedSamples:960
15:47:18.000807 decodedSamples:960
15:47:18.000893 decodedSamples:960
15:47:18.001011 decodedSamples:960
15:47:18.001111 decodedSamples:960
15:47:18.001216 decodedSamples:960
15:47:18.001486 decodedSamples:960
15:47:18.001615 decodedSamples:960
15:47:18.002240 decodedSamples:960
15:47:18.002357 decodedSamples:960
15:47:18.002445 decodedSamples:960
15:47:18.002570 decodedSamples:960
15:47:18.002729 decodedSamples:960
15:47:18.002813 decodedSamples:960
15:47:18.002877 OPUS => PCM: 38400

采樣率 16000
碼率 16000
通道數(shù) 1
幀大小 960

--

壓縮比: 13.4
編碼耗時: 大約60ms
譯碼耗時: 大約10ms

示例

更多代碼示例信息請移步OpusDemo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • OpusEncoder 1:獲得 OpusEncoder結(jié)構(gòu)的大小 2:分配和初始化 encoder狀態(tài).一個編碼...
    今憶Zoe閱讀 7,130評論 0 3
  • 摘要 該配置文件定義了支持高質(zhì)量音頻分發(fā)所需的Bluetooth?設(shè)備的要求。這些要求以終端用戶服務(wù)的方式表達,并...
    公子小水閱讀 10,410評論 0 4
  • 昨晚寶兒和我哭訴了,想結(jié)婚,遲遲看不到希望,看不到未來。 我倒是可以看到未來。今年年底大概月薪能過萬。健身。停藥以...
    不愛背誦的人閱讀 200評論 0 0

友情鏈接更多精彩內(nèi)容