1. 程式人生 > IOS開發 >iOS 使用WebRTC進行直播推流時,對聲音進行音質優化

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進行直播推流時,音樂等背景音的音質有了大幅提升,也沒有異常的聲音忽高忽低的問題了