VOIP 수화기 및 스피커 전환

3347 단어 pjsip
최근 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);
    }

Audio Session SetProperty 이 방법은 iOS7 이후 폐기되었습니다. 컴파일할 때 경고하지만 사용할 수 있습니다.개인적인 습관이라 그런지 프로젝트 통편지의 노란색 경고를 별로 좋아하지 않아서 iOS7 이후에 사용할 수 있는 방법을 썼습니다. AVAudioSession 같은 종류를 사용해야 하고 AVFoundation을 도입해야 합니다.framework.그 중에서 AVaudio Session Port Override None은 수화기로 음성 흐름을 재생하고, AVaudio Session Port Override Speaker는 스피커로 재생한다.
-(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

좋은 웹페이지 즐겨찾기