webRTC注意事项

  1. 4g网络通信需要
 RTCConfiguration *config = [[RTCConfiguration alloc]init];
    config.iceServers = @[[[RTCIceServer alloc] initWithURLStrings:defaultIceServers],[[RTCIceServer alloc] initWithURLStrings:@[@"turn:numb.viagenie.ca"] username:@"webrtc@live.com" credential:@"muazkh"]];
  1. 视频质量处理
-(void)startCaptureLocalVideoPosition:(AVCaptureDevicePosition)position{
  
      [self.localVideoTrack removeRenderer:self.localRenderer];
    
      RTCCameraVideoCapturer *capturer = (RTCCameraVideoCapturer *)self.videoCapturer;
      capturer.captureSession.sessionPreset = AVCaptureSessionPresetHigh;
      AVCaptureDevice * camera;
      for (AVCaptureDevice * device in RTCCameraVideoCapturer.captureDevices) {
          if (device.position == position) {
              camera =  device;
          }
      }
      NSArray<AVCaptureDeviceFormat *> * formats =  [RTCCameraVideoCapturer supportedFormatsForDevice:camera];
      AVCaptureDeviceFormat * format = [[formats sortedArrayUsingComparator:^NSComparisonResult(AVCaptureDeviceFormat * obj1, AVCaptureDeviceFormat* obj2) {
          
          float width1 =  CMVideoFormatDescriptionGetDimensions(obj1.formatDescription).width;
          float width2 =  CMVideoFormatDescriptionGetDimensions(obj2.formatDescription).width;
          return width1 < width2;
      }] firstObject];
      
      for (AVCaptureDeviceFormat * obj1 in formats) {
          float width1 =  CMVideoFormatDescriptionGetDimensions(obj1.formatDescription).width;
          NSLog(@"width1====%f",width1);
      }
      
      
      AVFrameRateRange *fps =  [[format.videoSupportedFrameRateRanges sortedArrayUsingComparator:^NSComparisonResult(AVFrameRateRange * obj1,  AVFrameRateRange* obj2) {
          return  obj1.maxFrameRate < obj2.maxFrameRate;
      }] firstObject];
      __weak typeof(self) weakSelf = self;
      [capturer startCaptureWithDevice:camera format:format fps:fps.maxFrameRate completionHandler:^(NSError * _Nonnull e) {
          AVCaptureSession* session = capturer.captureSession;
              for (AVCaptureVideoDataOutput* output in session.outputs) {
                  NSLog(@"%@", output.connections);
                      for (AVCaptureConnection * av in output.connections) {
                          //判断是否是前置摄像头状态
                          if (position == AVCaptureDevicePositionFront) {
          
                              av.videoMirrored = YES;
                              av.videoOrientation = AVCaptureVideoOrientationLandscapeRight;
                              NSLog(@"%@镜像",av.supportsVideoMirroring?@"支持":@"不支持");
                          }else{
                              //镜像设置
          
                              av.videoMirrored = NO;
                              av.videoOrientation = AVCaptureVideoOrientationLandscapeRight;
                              NSLog(@"%@镜像",av.supportsVideoMirroring?@"支持":@"不支持");
                          }
                      }
              }
          
          
          if (weakSelf.delegate) {
              [weakSelf.localVideoTrack addRenderer:weakSelf.localVideo];
          }
          [weakSelf.delegate webRTCManager:weakSelf AddLocalPeerId:weakSelf.username localVideo:weakSelf.localVideo];
      }];
}

3.声音设置

// 静音设置
-(void)setAllAudioEnabled:(BOOL)isEnabled {
    for (RTCPeerConnection *peerConnection in [self.peers allValues]) {
        for (RTCRtpTransceiver * transceiver in peerConnection.transceivers) {
            if ([transceiver.sender.track isKindOfClass:[RTCAudioTrack class]] ) {
                RTCAudioTrack *track = (RTCAudioTrack *)transceiver.sender.track;
                track.isEnabled = isEnabled;
            }
        }
    }
    
}
-(void)setAudioEnabled:(BOOL)isEnabled peerId:(NSString *) peerId{
    RTCPeerConnection *peerConnection  = [self.peers objectForKey:peerId];
    for (RTCRtpTransceiver * transceiver in peerConnection.transceivers) {
        if ([transceiver.sender.track isKindOfClass:[RTCAudioTrack class]] ) {
            RTCAudioTrack *track = (RTCAudioTrack *)transceiver.sender.track;
            track.isEnabled = isEnabled;
        }
    }
}
//听筒模式
-(void)setAudioSession {
    AVAudioSession *audioSession=[AVAudioSession sharedInstance];

    [audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideNone error:nil];
    [audioSession setActive:YES error:nil];
}
//扬声器模式
-(void)setAudioWaiFangSession {
    AVAudioSession *audioSession=[AVAudioSession sharedInstance];
    //设置为公放模式
    [audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil];
    [audioSession setActive:YES error:nil];
}
  1. 响铃处理,iOS没有呼叫功能,变相硬推送来实现
//铃声拷贝 app启动时要确保铃声靠边完成
-(void)initBadge{
    
//    NSURL *groupURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.com.jzb.share"];
//    NSURL *fileURL = [groupURL URLByAppendingPathComponent:@"push_badge.txt"];
    
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSURL *containerUrl = [fileManager containerURLForSecurityApplicationGroupIdentifier:@"group.com.jzb.share"];
    

    
    NSString *localPath = [containerUrl.path stringByAppendingPathComponent:[NSString stringWithFormat:@"/%@.%@", @"push_badge", @"txt"]];
//    NSURL *localURL = [NSURL fileURLWithPath:localPath];
    NSLog(@"%@",localPath);
    if (![fileManager fileExistsAtPath:localPath]) {
        [fileManager createDirectoryAtPath:localPath withIntermediateDirectories:NO attributes:nil error:nil];
    }
    
//    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"push_badge" ofType:@"txt"];
//
//    [fileManager moveItemAtURL:[NSURL fileURLWithPath:filePath] toURL:localURL error:nil];
}

-(void)ringing{
    //1.获得音效文件的全路径
      NSURL *url=[[NSBundle mainBundle] URLForResource:@"voip_call.mp3" withExtension:nil];
    //2.加载音效文件,创建音效ID(SoundID,一个ID对应一个音效文件)
    _soundID = 12345;
      AudioServicesCreateSystemSoundID((__bridge CFURLRef)url, &_soundID);
    // 完成播放之后执行的soundCompleteCallback函数
//        AudioServicesAddSystemSoundCompletion(soundID, NULL, NULL, soundCompleteCallback, NULL);
    //3.播放音效文件
    //下面的两个函数都可以用来播放音效文件,第一个函数伴随有震动效果
        AudioServicesPlayAlertSound(_soundID);
   
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容