iOS 使用WebRTC進行直播推流時,對聲音進行音質優化
最近我們在使用WebRTC進行直播推流的時候,遇到了音樂音質不好的問題,對此進行優化後,音樂音質有很大提升,因此記錄下優化過程,分享出來
1. 關閉AEC,AGC,NS
因為WebRTC是專為實時視訊通話設計的,所以WebRTC的語音處理演演算法也是專門為視訊通話優化的,為了進行正常的視訊通話,必須對語音進行AEC,AGC演演算法處理,但是AEC對人聲有特殊處理,但是對音樂的背景聲音處理的不好,如果進行直播的時候,使用AEC,會對音樂的背景音產生消噪,從而影響音質,可以關閉iOS端的硬體AEC,AGC,NS等演演算法
關閉方法
在voice_processing_audio_unit.mm檔案中,修改
vpio_unit_description.componentSubType = kAudioUnitSubType_VoiceProcessingIO;
//修改為kAudioUnitSubtype_RemoteIO
vpio_unit_description.componentManufacturer = kAudioUnitManufacturer_Apple;
UInt32 enable_agc = 0;
result = AudioUnitSetProperty(vpio_unit_,kAUVoiceIOProperty_VoiceProcessingEnableAGC,kAudioUnitScope_Global,kInputBus,&enable_agc,sizeof(enable_agc));
2. 修改Opus編碼演演算法
WebRTC中預設是採用Opus編碼,Opus編碼是由silk編碼和celt編碼合併在一起,silk編碼是由skype公司開源的一種語音編碼,特別適合人聲,適合於Voip語音通訊。celt和mp3,aac類似,適合於傳輸音樂。Opus編碼具備以下特點:
6 kb /秒到510 kb / s的位元率
取樣率從8 kHz(窄帶)到48 kHz(全頻)
幀大小從2.5毫秒到60毫秒
支援恆定位元率(CBR)和可變位元率(VBR)
從窄帶到全頻段的音訊頻寬
支援語音和音樂
支援單聲道和立體聲
支援多達255個頻道(多資料流的幀)
可動態調節位元率,音訊頻寬和幀大小
良好的魯棒性丟失率和資料包丟失隱藏(PLC)
浮點和定點實現
WebRTC中預設是使用Opus編碼的,在SDP中有標記
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1
音訊取樣率是48000,音訊打包時間是10ms,單聲道,編碼採用的是Opus裡面的silk編碼,適合傳人聲,不適合傳音樂,所以如果需要使用WebRTC進行直播推流,需要對audio編碼進行修改
3. 修改聲道數
在a=ftmp這一行中加入stereo=1代表雙聲道,stereo=0代表單聲道,雙聲道一般用來傳音樂,從WebRTC程式碼中可以發現,當我們設定聲道數為2時,opus編碼內部將使用celt, celt適合傳輸音樂,程式碼如下:
config.application = config.num_channels == 1 ? AudioEncoderOpus::kVoip : AudioEncoderOpus::kAudio;
kVoip適合於語音通話,kAudio適合於傳輸音樂
4. audio碼流修改
在a=ftmp這一行中加入maxaveragebitrate代表接收方能接受的最大碼流,單位為bit。比如maxaveragebitrate=128000代表碼流為128kbps,提高audio碼流可以提升音樂音質
聲道數,碼流等引數,可以在sdp中統一修改
a=fmtp:111 minptime=10;useinbandfec=1;stereo=1;maxaveragebitrate=128000;maxplaybackrate=48000
總結:在修改完WebRTC這些引數,再使用WebRTC進行直播推流時,音樂等背景音的音質有了大幅提升,也沒有異常的聲音忽高忽低的問題了