簡介
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中會看到include和lib
- 關(guān)于編譯
Static Library和Framework的詳細步驟請看Opus-iOS/README.md
集成opus到Xcode工程
用Xcode新建OpusDemo,將include 和 lib一同拷貝到工程中即可。
這一步就不細說了,新手請自行搜索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