webRTC實(shí)現(xiàn)音頻通話(huà)聽(tīng)筒和揚(yáng)聲器的切換

前一陣做音視頻會(huì)議,底層用webRTC實(shí)現(xiàn)的,音頻通話(huà)實(shí)現(xiàn)揚(yáng)聲器和聽(tīng)筒切換時(shí)遇到了不少問(wèn)題,查了很多的資料的,但都不能很好的實(shí)現(xiàn)揚(yáng)聲器和聽(tīng)筒的切換,下面寫(xiě)一下我們最后的實(shí)現(xiàn)方案,供跟我一樣正在研究聽(tīng)筒和揚(yáng)聲器切換的程序員參考指正,然而,雖然實(shí)現(xiàn)了基本功能,但還是存在一定的問(wèn)題,希望大家能給出好的建議。下面直接上程序代碼:

//監(jiān)聽(tīng)聲道的變化
- (void)observeHeadset {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(roteChange:) name:AVAudioSessionRouteChangeNotification object:nil];
}

- (void)roteChange:(NSNotification *)noti {
    if (![self isHeadPhoneEnable]) {//沒(méi)有耳機(jī)根據(jù)當(dāng)前狀態(tài)切換
        if (self.isSpeaker) {
            [self switchAudioCategaryWithSpeaker:YES];
        } else {
           [self switchAudioCategaryWithSpeaker:NO];
        }
    } else {//有耳機(jī)走聽(tīng)筒
       [self switchAudioCategaryWithSpeaker:NO];
    }
}

- (BOOL)isHeadPhoneEnable {//判斷是否插入耳機(jī)
    AVAudioSessionRouteDescription *route = [[AVAudioSession sharedInstance] currentRoute];
    BOOL isHeadPhoneEnable = NO;
    for (AVAudioSessionPortDescription *desc in [route outputs]) {
        if ([[desc portType] isEqualToString:AVAudioSessionPortHeadphones]) {
            isHeadPhoneEnable = YES;
        }
    }
    return isHeadPhoneEnable;
}
//揚(yáng)聲器和聽(tīng)筒的切換
- (void)switchAudioCategaryWithSpeaker:(BOOL)isSpeaker {
    AVAudioSession* audioSession = [AVAudioSession sharedInstance];
    if (isSpeaker) {
        [[UIDevice currentDevice] setProximityMonitoringEnabled:NO];
        [audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil];
    } else {
        [[UIDevice currentDevice] setProximityMonitoringEnabled:YES];
        [audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideNone error:nil];
    }
}

每次點(diǎn)擊按鈕切換揚(yáng)聲器和聽(tīng)筒時(shí),調(diào)用- (void)switchAudioCategaryWithSpeaker:(BOOL)isSpeaker方法對(duì)揚(yáng)聲器和聽(tīng)筒進(jìn)行切換,但此時(shí)的切換好像并沒(méi)有真正的生效,而是通過(guò)系統(tǒng)的通知,監(jiān)聽(tīng)到roteChange:然后進(jìn)行揚(yáng)聲器和聽(tīng)筒的實(shí)現(xiàn)真正切換。猜測(cè)是因?yàn)閣ebRTC的底層對(duì)音頻做了操作,但沒(méi)有仔細(xì)的去研究webRTC底層的代碼,如果有什么問(wèn)題歡迎大家批評(píng)指正,謝謝。

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

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