最近在做音視頻相關(guān)的開發(fā),遇到的幾個(gè)問題如下:
1 .插入耳機(jī)的時(shí)候并沒有切換到耳機(jī)播放 仍然是揚(yáng)聲器播放
2 .當(dāng)一開始手機(jī)上已經(jīng)插入耳機(jī)時(shí) 趟紊,這時(shí)候開啟音頻播放時(shí) 仍然是揚(yáng)聲器播放
因此今天主要談的就是從這兩個(gè)問題:
先來解決第一個(gè)問題:其實(shí)解決耳機(jī)插入時(shí)揚(yáng)聲器播放很明顯我們需要獲取耳機(jī)插入的這個(gè)狀態(tài)氮双,通過什么來獲取呢?通知霎匈,沒錯(cuò) 就是通過通知的方式來獲取戴差,代碼如下有需要的自取:
//耳機(jī)狀態(tài)獲取的通知
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(audioRouteChangeListenerCallback:)
name:AVAudioSessionRouteChangeNotification
object:[AVAudioSession sharedInstance]];
/**
* 監(jiān)聽耳機(jī)插入拔出狀態(tài)的改變
* @param notification 通知
*/
- (void)audioRouteChangeListenerCallback:(NSNotification *)notification {
NSDictionary *interuptionDict = notification.userInfo;
NSInteger routeChangeReason = [[interuptionDict
valueForKey:AVAudioSessionRouteChangeReasonKey] integerValue];
switch (routeChangeReason) {
case AVAudioSessionRouteChangeReasonNewDeviceAvailable:
DLog(@"AVAudioSessionRouteChangeReasonNewDeviceAvailable");
//插入耳機(jī)時(shí)關(guān)閉揚(yáng)聲器播放
[self.agoraKit setEnableSpeakerphone:NO];
break;
case AVAudioSessionRouteChangeReasonOldDeviceUnavailable:
DLog(@"AVAudioSessionRouteChangeReasonOldDeviceUnavailable");
//拔出耳機(jī)時(shí)的處理為開啟揚(yáng)聲器播放
[self.agoraKit setEnableSpeakerphone:YES];
break;
case AVAudioSessionRouteChangeReasonCategoryChange:
// called at start - also when other audio wants to play
NSLog(@"AVAudioSessionRouteChangeReasonCategoryChange");
break;
}
}
第二個(gè)問題的解決:很明顯再開啟音視頻之前铛嘱,我們需要判斷是否手機(jī)上已經(jīng)插入了耳機(jī)或者其他設(shè)備(這里單純說耳機(jī))暖释,方法如下:
/**
* 判斷是否有耳機(jī)
*
* @return 判斷是否有耳機(jī)
*/
- (BOOL)hasHeadset {
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
AVAudioSessionRouteDescription *currentRoute = [audioSession currentRoute];
for (AVAudioSessionPortDescription *output in currentRoute.outputs) {
if ([[output portType] isEqualToString:AVAudioSessionPortHeadphones]) {
return YES;
}
}
return NO;
}
我們通過這個(gè)方法來進(jìn)行判斷袭厂,如果開啟音視頻之前判斷有耳機(jī)設(shè)備,那么直接關(guān)閉揚(yáng)聲器播放饭入,否則開啟嵌器,這樣就解決了我前面所說的兩個(gè)問題,希望可以幫到有需要的人谐丢,今天就說這么多吧,最近實(shí)在太忙了蚓让,過一陣子估計(jì)要做直播開發(fā)了乾忱,到時(shí)候分享一點(diǎn)直播開發(fā)的經(jīng)驗(yàn),敬請(qǐng)期待