VOIP听筒与扬声器的切换

    xiaoxiao2021-12-14  21

    最近在学习用pjsip开发网络电话,中间遇到了各种问题,现把解决方法记录下来。

    - (void)setSpeaker:(BOOL)isOpen { UInt32 route; OSStatus error; UInt32 sessionCategory = kAudioSessionCategory_PlayAndRecord; error = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory); route = isOpen ? kAudioSessionOverrideAudioRoute_Speaker : kAudioSessionOverrideAudioRoute_None; error = AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(route), &route); } AudioSessionSetProperty这个方法在iOS7以后已经废弃掉了,编译时会警告,但是仍然可以用。可能因为是个人习惯,不太喜欢项目通篇报黄色警告,所以写了一个iOS7以后可以用的方法,需要用到AVAudioSession这个类,需要引入AVFoundation.framework。其中AVaudioSessionPortOverrideNone是听筒播放语音流,AVaudioSessionPortOverrideSpeaker是扬声器播放。

    -(void)receive:(BOOL)isSpeaker{ NSLog(@"+++++speaker:%@",isSpeaker?@"YES":@"NO"); if (!isSpeaker) { [[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideNone error:nil]; }else{//speaker [[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil]; } } 另外我还实现了用红外线感应去控制听筒与扬声器的播放,代码如下:

    #pragma mark --设置距离传感器 - (void)setproximity{ //添加近距离事件监听,添加前先设置为YES,如果设置完后还是NO的读话,说明当前设备没有近距离传感器 [[UIDevice currentDevice] setProximityMonitoringEnabled:YES]; if ([UIDevice currentDevice].proximityMonitoringEnabled) { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sensorStateChange:) name:UIDeviceProximityStateDidChangeNotification object:nil]; } } //proximityState 属性 如果用户接近手机,此时属性值为YES,并且屏幕关闭(非休眠)。 -(void)sensorStateChange:(NSNotificationCenter *)notification{ if ([[UIDevice currentDevice] proximityState]) { NSLog(@"Device is close to user"); //设置AVAudioSession 的播放模式 //[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; [[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideNone error:nil]; }else{ NSLog(@"Device is not close to user"); //[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; [[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil]; } } - (void)dealloc{ if ([UIDevice currentDevice].proximityMonitoringEnabled) { [[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceProximityStateDidChangeNotification object:nil]; } [[UIDevice currentDevice] setProximityMonitoringEnabled:NO]; } 把setproximity放在应用一加载完成的方法里,我是写在viewDidLoad中的。

    另外网上有很多听筒与扬声器的切换方法,但是用在我这里都不起作用,不过我也记录下来,说不定以后可以用于其他场景。

    -(void)speakerAction:(UIButton *)sender{ sender.selected = !sender.selected; if (!sender.selected) { [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; }else{ [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; } } 参考链接:https://segmentfault.com/a/1190000007474125 http://www.cnblogs.com/lancely/p/5782748.html

    转载请注明原文地址: https://ju.6miu.com/read-963854.html

    最新回复(0)