// // YOUPAIBBBaseVideoCallVC.m // VQU // // Created by Elaine on 2021/10/28. // Copyright © 2021 MS. All rights reserved. // #import "YOUPAIBBBaseVideoCallVC.h" #import "FUOpenGLView.h" #import "FUCamera.h" #import "FUManager.h" #import "FULiveModel.h" #import "FUAPIDemoBar.h" //#import "YOUPAIAGVideoProcessing.h" #import "AppDelegate.h" #import "YOUPAIBBCustomSystomNotification.h" @interface YOUPAIBBBaseVideoCallVC () @property (assign,nonatomic) CGPoint youpaipstartPoint; //用来做清屏 @property (nonatomic, strong) FUCamera *youpaipmCamera; //Faceunity Camera @property (strong, nonatomic) FUAPIDemoBar *youpaipdemoBar; //Tool Bar @property (nonatomic, strong) FULiveModel *youpaipliveModel ; @property(nonatomic,assign)BOOL youpaipisRecordScreen; @property(nonatomic,strong)UIView *youpaiprecoderHideView; @property (nonatomic, assign) BOOL youpaipisHangupCallVideo; /// 是否手动挂断 @property(nonatomic,strong)UIImageView *timeLogo; @property(nonatomic,strong)UIButton *closeBtn; @end @implementation YOUPAIBBBaseVideoCallVC //@synthesize consumer; -(BOOL)prefersStatusBarHidden { return YES; } - (FUAPIDemoBar*)youpaipdemoBar{ if (!_youpaipdemoBar) { _youpaipdemoBar = [[FUAPIDemoBar alloc] initWithFrame:CGRectMake(0, KScreenHeight-182, KScreenWidth, 182)]; if (Is_iPhoneX) { _youpaipdemoBar.frame = CGRectMake(0, KScreenHeight-182-30, KScreenWidth, 182); } _youpaipdemoBar.mDelegate = self ; } return _youpaipdemoBar ; } - (FUCamera *)youpaipmCamera { if (!_youpaipmCamera) { _youpaipmCamera = [[FUCamera alloc] init]; _youpaipmCamera.delegate = self; } return _youpaipmCamera; } - (void)dealloc{ NSLog(@"dealloc basevideo"); [[NSNotificationCenter defaultCenter] removeObserver:self]; [[UIApplication sharedApplication] setIdleTimerDisabled:NO]; } - (void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; self.navigationController.navigationBarHidden = YES; [LCSaveData saveIsVideo:YES]; if (self.youpaipliveModel.type == FULiveModelTypeBeautifyFace) { [self youpaifdemoBarSetBeautyDefultParams]; } [self.youpaipmCamera startCapture]; // [IQKeyboardManager sharedManager].enable = NO; } - (void)viewDidAppear:(BOOL)animated{ [super viewDidAppear:animated]; } - (void)viewWillDisappear:(BOOL)animated{ [super viewWillDisappear:animated]; [self.youpaipplayer stop]; //add by leo 此处会导致vc无法释放 self.youpaipplayer =nil; //add by leo 异常退出/被踢 显示处于视频中 [LCSaveData saveIsVideo:NO]; self.navigationController.navigationBarHidden = NO; // [IQKeyboardManager sharedManager].enable = YES; } - (void)viewDidLoad{ [super viewDidLoad]; self.sx_disableInteractivePop = YES; NSString* path = [[NSBundle mainBundle] pathForResource:@"sound"ofType:@"bundle"]; NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/call_bg.mp3",path]]; self.youpaipplayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; [self.youpaipplayer prepareToPlay]; self.youpaipplayer.numberOfLoops = -1; [self.youpaipplayer play]; [self youpaifinitView]; [self youpaifinitAgora]; NSString* str=[AgoraRtcEngineKit getSdkVersion]; self.youpaipliveModel = [FUManager shareManager].dataSource[0][0]; //设置默认曝光度 [self.youpaipmCamera setExposureValue:0]; [self.youpaipmCamera startCapture]; [self youpaifdemoBarSetBeautyDefultParams]; [[FUManager shareManager] loadFilter] ; [[FUManager shareManager] setAsyncTrackFaceEnable:NO]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(youpaifwillResignActive) name:UIApplicationWillResignActiveNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(youpaifwillEnterForeground) name:UIApplicationWillEnterForegroundNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(youpaifdidBecomeActive) name:UIApplicationDidBecomeActiveNotification object:nil]; //挂断视频,接听通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(youpaifhangupCallVideoNotification) name:@"HangupCallVideo" object:nil]; } - (void)youpaifhangupCallVideoNotification{ [self youpaifvideoEnd:BBCustomSystomNotificationTypeWithHangupCallVideo]; [ZCHUDHelper showTitle:@"对方已挂断"]; } - (void)youpaifinitView{ self.youpaipremoteVideo = [[UIView alloc]initWithFrame:CGRectMake(0,0,KScreenWidth,KScreenHeight)]; self.youpaipremoteVideo.backgroundColor = [UIColor blackColor]; [self.view addSubview:self.youpaipremoteVideo]; self.youpaiprecoderHideView = [[UIView alloc]init]; [self.youpaiprecoderHideView setBackgroundColor:[UIColor whiteColor]]; [self.youpaiprecoderHideView setHidden:YES]; [self.view addSubview:self.youpaiprecoderHideView]; UIView* msgCoverView = [[UIView alloc]initWithFrame:CGRectMake(-KScreenWidth, 0, KScreenWidth*2, KScreenHeight)]; msgCoverView.backgroundColor = [UIColor clearColor]; UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(youpaifmsgViewPanHandel:)]; [msgCoverView addGestureRecognizer:pan]; UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(youpaifdoubleTapHandel:)]; doubleTap.numberOfTapsRequired = 2; [msgCoverView addGestureRecognizer:doubleTap]; self.youpaipmsgCoverView = msgCoverView; [self.view addSubview:msgCoverView]; UIView* interView = [[UIView alloc]initWithFrame:CGRectMake(KScreenWidth, 0, KScreenWidth, KScreenHeight)]; interView.backgroundColor = [UIColor clearColor]; self.youpaipinterView = interView; UITapGestureRecognizer* interTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(youpaifinterHandel:)]; [self.youpaipinterView addGestureRecognizer:interTap]; [msgCoverView addSubview:interView]; //设置顶部按钮 UIButton* closeBtn = [[UIButton alloc]initWithFrame:CGRectMake(16,StatusBarHeight+4, 30, 30)]; [closeBtn setImage:[UIImage imageNamed:@"vqu_images_video_end"] forState:(UIControlStateNormal)]; [closeBtn addTarget:self action:@selector(youpaifcloseBtnClick) forControlEvents:(UIControlEventTouchUpInside)]; [closeBtn setEnlargeEdge:10]; [self.view addSubview:closeBtn]; self.closeBtn = closeBtn; self.closeBtn.hidden = YES; UIView *timeBgv = [[UIView alloc] init]; timeBgv.layer.cornerRadius = 12.0f; timeBgv.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.3f]; [self.view addSubview:timeBgv]; [timeBgv mas_makeConstraints:^(MASConstraintMaker *make) { make.left.offset(54.0f); make.top.offset(StatusBarHeight+7); make.height.offset(24.0f); }]; UIImageView* timeLogo = [[UIImageView alloc]initWithFrame:CGRectMake(0,0, 30, 30)]; timeLogo.contentMode = UIViewContentModeScaleAspectFill; timeLogo.image = [UIImage imageNamed:@"vqu_images_video_time"]; [timeBgv addSubview:timeLogo]; [timeLogo mas_makeConstraints:^(MASConstraintMaker *make) { make.left.offset(0); make.centerY.equalTo(timeBgv); make.size.mas_offset(CGSizeMake(30, 30)); }]; self.timeLogo = timeLogo; self.timeLogo.hidden = YES; UILabel* timeLabel = [self youpaifcreateLabelWithFrame:CGRectMake(44,0,100,30) text:@"00:00"]; timeLabel.textColor = HexColorFromRGB(0xFFFFFF); self.youpaiptimeLabel = timeLabel; [timeBgv addSubview:timeLabel]; [self youpaiftimeStart]; [timeLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.top.bottom.offset(0.0f); make.right.offset(-8.0f); make.left.equalTo(timeLogo.mas_right); }]; [self.view addSubview:self.youpaipdemoBar]; self.youpaipdemoBar.hidden = YES; self.youpaiptimeLabel.hidden = YES; self.youpaiplocalVideo = [[UIView alloc]initWithFrame:CGRectMake(KScreenWidth-106,StatusBarHeight+4, 90,120)]; self.youpaiplocalVideo.backgroundColor = [UIColor blackColor]; self.youpaiplocalVideo.layer.cornerRadius = 5.0; self.youpaiplocalVideo.layer.masksToBounds = YES; [self.view addSubview:self.youpaiplocalVideo]; UITapGestureRecognizer* localTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(youpaifloaclVideoHandel:)]; [self.youpaiplocalVideo addGestureRecognizer:localTap]; //摄像 UIButton* cameraBtn = [[UIButton alloc]initWithFrame:CGRectMake(self.youpaiplocalVideo.center.x-16,StatusBarHeight+4+120+8.5,32,25)]; [cameraBtn setImage:[UIImage imageNamed:@"vqu_images_video_off"] forState:(UIControlStateNormal)]; [cameraBtn addTarget:self action:@selector(youpaifcameraBtnClick:) forControlEvents:(UIControlEventTouchUpInside)]; [self.view addSubview:cameraBtn]; cameraBtn.selected = YES; self.youpaipcameraBtn = cameraBtn; self.youpaipcameraBtn.hidden = YES; self.youpaipcameraBtn.centerX = self.youpaiplocalVideo.center.x; } - (UILabel*)youpaifcreateLabelWithFrame:(CGRect)frame text:(NSString*)contentText{ UILabel* lab = [[UILabel alloc]initWithFrame:frame]; lab.textColor = [UIColor whiteColor]; lab.font = [UIFont systemFontOfSize:11]; lab.textAlignment = NSTextAlignmentLeft; lab.text = contentText; return lab; } - (void)youpaifdemoBarSetBeautyDefultParams { _youpaipdemoBar.mDelegate = nil ; [_youpaipdemoBar reloadSkinView:[FUManager shareManager].skinParams]; [_youpaipdemoBar reloadShapView:[FUManager shareManager].shapeParams]; [_youpaipdemoBar reloadFilterView:[FUManager shareManager].filters]; _youpaipdemoBar.mDelegate = self; } #pragma mark --- FUAPIDemoBarDelegate -(void)restDefaultValue:(int)type{ if (type == 1) {//美肤 [[FUManager shareManager] setBeautyDefaultParameters:FUBeautyModuleTypeSkin]; } if (type == 2) { [[FUManager shareManager] setBeautyDefaultParameters:FUBeautyModuleTypeShape]; } } -(void)filterValueChange:(FUBeautyParam *)param{ int handle = [[FUManager shareManager] getHandleAboutType:FUNamaHandleTypeBeauty]; [FURenderer itemSetParam:handle withName:@"filter_name" value:[param.mParam lowercaseString]]; [FURenderer itemSetParam:handle withName:@"filter_level" value:@(param.mValue)]; //滤镜程度 [FUManager shareManager].seletedFliter = param; } -(void)beautyParamValueChange:(FUBeautyParam *)param{ if (_youpaipdemoBar.selBottomIndex == 3) {//风格栏 if (param.beautyAllparams) { [[FUManager shareManager] setStyleBeautyParams:param.beautyAllparams]; [FUManager shareManager].currentStyle = param; }else{// 点击无 [FUManager shareManager].currentStyle = param; [[FUManager shareManager] loadFilter]; } return; } if ([param.mParam isEqualToString:@"cheek_narrow"] || [param.mParam isEqualToString:@"cheek_small"]){//程度值 只去一半 [[FUManager shareManager] setParamItemAboutType:FUNamaHandleTypeBeauty name:param.mParam value:param.mValue * 0.5]; }else if([param.mParam isEqualToString:@"blur_level"]) {//磨皮 0~6 [[FUManager shareManager] setParamItemAboutType:FUNamaHandleTypeBeauty name:param.mParam value:param.mValue * 6]; }else{ [[FUManager shareManager] setParamItemAboutType:FUNamaHandleTypeBeauty name:param.mParam value:param.mValue]; } } #pragma mark - Agora - (void)youpaifinitAgora{ self.agoraKit = [AgoraRtcEngineKit sharedEngineWithAppId:AgoraID delegate:self]; NSLog(@"version is %@",[AgoraRtcEngineKit getSdkVersion]); AgoraVideoEncoderConfiguration *configuration = [[AgoraVideoEncoderConfiguration alloc] initWithSize:AgoraVideoDimension1280x720 frameRate:AgoraVideoFrameRateFps24 bitrate:AgoraVideoBitrateCompatible orientationMode:AgoraVideoOutputOrientationModeAdaptative mirrorMode:AgoraVideoMirrorModeAuto]; [self.agoraKit setVideoEncoderConfiguration:configuration]; [self.agoraKit enableVideo]; [self.agoraKit setExternalVideoSource:YES useTexture:YES sourceType:AgoraExternalVideoSourceTypeVideoFrame]; //只允许外部源 [self.agoraKit setChannelProfile:AgoraChannelProfileLiveBroadcasting]; [self.agoraKit setClientRole:AgoraClientRoleBroadcaster]; //add by leo 修复视频镜像问题 [self.agoraKit setLocalVideoMirrorMode:AgoraVideoMirrorModeDisabled]; [self.agoraKit enableWebSdkInteroperability:YES]; AgoraRtcVideoCanvas *videoCanvas = [[AgoraRtcVideoCanvas alloc] init]; videoCanvas.uid = 0; videoCanvas.view = self.youpaiplocalVideo; videoCanvas.renderMode = AgoraVideoRenderModeHidden; self.localCanvas = videoCanvas; [self.agoraKit setupLocalVideo:videoCanvas]; } #pragma mark - AgoraRtcEngineDelegate //收到对方的视频 - (void)rtcEngine:(AgoraRtcEngineKit *)engine firstRemoteVideoDecodedOfUid:(NSUInteger)uid size: (CGSize)size elapsed:(NSInteger)elapsed { self.youpaipremoteVideo.hidden = NO; self.youpaipcameraBtn.hidden = NO; self.youpaiptimeLabel.hidden = NO; self.closeBtn.hidden = NO; self.timeLogo.hidden = NO; AgoraRtcVideoCanvas *videoCanvas = [[AgoraRtcVideoCanvas alloc] init]; videoCanvas.renderMode = AgoraVideoRenderModeHidden; self.remoteCanvas= videoCanvas; self.remoteCanvas.uid = uid; self.remoteCanvas.view = self.youpaipremoteVideo; int value =[self.agoraKit setupRemoteVideo:self.remoteCanvas]; NSLog(@"%d",value); } - (void)rtcEngine:(AgoraRtcEngineKit *)engine didVideoMuted:(BOOL)muted byUid:(NSUInteger)uid{ if (muted) {//对端关闭了视频 self.localCanvas.view = self.youpaipremoteVideo; self.remoteCanvas.view = self.youpaiplocalVideo; [self.agoraKit setupLocalVideo:self.localCanvas]; [self.agoraKit setupRemoteVideo:self.remoteCanvas]; self.youpaiplocalVideo.hidden = YES; }else{ self.localCanvas.view = self.youpaiplocalVideo; self.remoteCanvas.view = self.youpaipremoteVideo; [self.agoraKit setupLocalVideo:self.localCanvas]; [self.agoraKit setupRemoteVideo:self.remoteCanvas]; self.youpaiplocalVideo.hidden = NO; } } - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine didOfflineOfUid:(NSUInteger)uid reason:(AgoraUserOfflineReason)reason{ if (!self.youpaipisHangupCallVideo) { [self youpaifvideoEnd:BBCustomSystomNotificationTypeWithWasInterruptedCallVideo]; [ZCHUDHelper showTitle:[YOUPAIBBCustomSystomNotification youpaifnotificationTitleWithType:BBCustomSystomNotificationTypeWithWasInterruptedCallVideo]]; } } - (void)rtcEngine:(AgoraRtcEngineKit *)engine didAudioRouteChanged:(AgoraAudioOutputRouting)routing{ // [ZCHUDHelper showTitle:[NSString stringWithFormat:@"音频路由已切换%d",routing]]; } //踢人 v1.1.1 //- (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine connectionChangedToState:(AgoraConnectionStateType)state reason:(AgoraConnectionChangedReason)reason //{ // if(reason ==3) // { // NSLog(@"收到踢人消息"); // // [self youpaifvideoEnd:5]; // } //} #pragma mark - Agora Video Source Protocol - (BOOL)shouldInitialize { return YES; } - (void)shouldStart { [self.youpaipmCamera startCapture]; } - (void)shouldStop { [self.youpaipmCamera stopCapture]; } - (void)shouldDispose { } // // //- (AgoraVideoBufferType)bufferType { // return AgoraVideoBufferTypePixelBuffer; //} //- (AgoraVideoCaptureType)captureType{ // return AgoraVideoCaptureTypeCamera; //} #pragma mark - FUCameraDelegate bool lzIsNeeded = YES; -(void)didOutputVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer { if (lzIsNeeded) { lzIsNeeded = !lzIsNeeded; return; } lzIsNeeded = !lzIsNeeded; // CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent(); CVPixelBufferRef pixelBuffer = (CVPixelBufferRef)CMSampleBufferGetImageBuffer(sampleBuffer) ; CVPixelBufferLockBaseAddress(pixelBuffer, 0); // CFAbsoluteTime startRenderTime = CFAbsoluteTimeGetCurrent(); //render the items to pixelbuffer [[FUManager shareManager] renderItemsToPixelBuffer:pixelBuffer]; // CFAbsoluteTime renderTime = (CFAbsoluteTimeGetCurrent() - startRenderTime); // // // CFAbsoluteTime frameTime = (CFAbsoluteTimeGetCurrent() - startTime); // // int frameWidth = (int)CVPixelBufferGetWidth(pixelBuffer); // int frameHeight = (int)CVPixelBufferGetHeight(pixelBuffer); CGSize frameSize; if (CVPixelBufferGetPixelFormatType(pixelBuffer) == kCVPixelFormatType_32BGRA) { frameSize = CGSizeMake(CVPixelBufferGetBytesPerRow(pixelBuffer) / 4, CVPixelBufferGetHeight(pixelBuffer)); }else{ frameSize = CGSizeMake(CVPixelBufferGetWidth(pixelBuffer), CVPixelBufferGetHeight(pixelBuffer)); } // push video frame to agora // [self.consumer consumePixelBuffer:pixelBuffer withTimestamp:CMSampleBufferGetPresentationTimeStamp(sampleBuffer) rotation:AgoraVideoRotationNone]; CVPixelBufferUnlockBaseAddress(pixelBuffer, 0); } #pragma mark - WebSocketDelegate - (void)youpaifrequestSuccess{ } - (void)youpaifresponseConnent{ } - (void)youpaifresponseChoosing:(NSString*)tip{ } //add by leo 剩余可通话时间 - (void)youpaifcanCallTime:(NSString*)tip { } //v1.1.1断连重连 - (void)youpaifvideoStart{ [self.youpaipplayer stop]; // self.videoModel.duration = [dict[@"duration"] integerValue]; //是否主叫 BOOL callfrom = [[LCSaveModel getUserModel].youpaipuserinfo.youpaipuser_id isEqualToString:self.youpaipvideoModel.youpaipfrom_uid]; if (self.youpaipvideoModel.youpaipporn_check_v2.youpaipis_open&&(self.youpaipvideoModel.youpaipporn_check_v2.youpaipcheck_from_user||callfrom)) { NSLog(@"鉴黄已打开"); [YOUPAIXLVideoShotTool sharedPusher].shotCycle = self.youpaipvideoModel.youpaipporn_check_v2.youpaipinterval_time; [YOUPAIXLVideoShotTool sharedPusher].periodArray = self.youpaipvideoModel.youpaipporn_check_v2.youpaipperiod_array; // [YOUPAIAGVideoProcessing registerVideoPreprocessing:self.agoraKit]; //老版本 /* [YOUPAIXLVideoShotTool sharedPusher].shotCycle = self.videoModel.porn_check.interval_time; [YOUPAIXLVideoShotTool sharedPusher].period = self.videoModel.porn_check.period; */ [YOUPAIXLVideoShotTool sharedPusher].room_id = self.youpaipvideoModel.youpaiproom_id; [YOUPAIXLVideoShotTool sharedPusher].localVideo = self.youpaiplocalVideo; [YOUPAIXLVideoShotTool sharedPusher].remoteVideo = self.youpaipremoteVideo; [YOUPAIXLVideoShotTool sharedPusher].isPornCheckOpen = YES; if ([[LCSaveModel getUserModel].youpaipuserinfo.youpaipuser_id isEqualToString:self.youpaipvideoModel.youpaipfrom_uid]) {//自己是被叫端 [YOUPAIXLVideoShotTool sharedPusher].isFrom = YES; [YOUPAIXLVideoShotTool sharedPusher].uid = self.youpaipvideoModel.youpaipto_uid; }else{ [YOUPAIXLVideoShotTool sharedPusher].isFrom = NO; [YOUPAIXLVideoShotTool sharedPusher].uid = self.youpaipvideoModel.youpaipfrom_uid; } [YOUPAIXLVideoShotTool start]; } //加入声网频道 //modify by leo fix bug object unrelease WeakSelf; [self.agoraKit joinChannelByToken:nil channelId:self.youpaipvideoModel.youpaiproom_id info:nil uid:[[LCSaveModel getUserModel].youpaipuserinfo.youpaipuser_id integerValue] joinSuccess:^(NSString *channel, NSUInteger uid, NSInteger elapsed) { if([weakSelf.agoraKit isSpeakerphoneEnabled]){ [weakSelf.agoraKit setEnableSpeakerphone:YES]; } // self.localVideo.hidden = YES; [UIApplication sharedApplication].idleTimerDisabled = YES; }]; } //1主动取消 2。拒绝 3.超时 4.被叫者挂断 5.主叫者挂断 6.费用不足 - (void)youpaifvideoEnd:(NSInteger)type{ kAppDelegate.ksocketManager = nil; [LCSaveData saveIsVideo:NO]; [[NSNotificationCenter defaultCenter] removeObserver:self]; if (self.timer) { dispatch_source_cancel(self.timer);//删除GCD定时器 self.timer = nil; } dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [self.youpaipmCamera stopCapture]; dispatch_async(self.youpaipmCamera.videoCaptureQueue, ^{ [[FUManager shareManager] destoryItems]; }); [self.agoraKit setExternalVideoSource:YES useTexture:YES sourceType:AgoraExternalVideoSourceTypeVideoFrame]; //只允许外部源 [self.agoraKit leaveChannel:nil]; [AgoraRtcEngineKit destroy]; if (type==11) { if ([[LCSaveModel getUserModel].youpaipuserinfo.youpaipuser_id isEqualToString:self.youpaipvideoModel.youpaipto_uid]){//自己是被叫端 [self.navigationController dismissViewControllerAnimated:YES completion:^{ }]; }else{//自己是主叫端 [YOUPAIXLVideoShotTool stop]; [self.navigationController dismissViewControllerAnimated:YES completion:^{ NSLog(@"1111111"); }]; } } if (type==4|| type==5 || type==6 || type==10) {//去往评价结束界面 //add by leo 关闭上传截图 定时器 [YOUPAIXLVideoShotTool stop]; [self.navigationController dismissViewControllerAnimated:YES completion:^{ NSLog(@"12121212"); }]; }else{ [self.navigationController dismissViewControllerAnimated:YES completion:^{ NSLog(@"2222222"); }]; } }); } - (void)youpaifcloseBtnClick{ //确定退出视频咨询 UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil message:@"确定挂断视频通话?" preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action){ }]; UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action){ self.youpaipisHangupCallVideo = YES; [self youpaifvideoEnd:4]; [YOUPAIBBCustomSystomNotification youpaifcustomSystomNotificationWithModel:self.youpaipvideoModel type:BBCustomSystomNotificationTypeWithHangupCallVideo block:^(NSError * _Nonnull error) { }]; [ZCHUDHelper showTitle:@"已挂断"]; }]; [alertController addAction:cancelAction]; [alertController addAction:okAction]; [self presentViewController:alertController animated:YES completion:nil]; } #pragma mark - interActive - (void)youpaiftimeStart{ //v1.1.1断连重连 __block int timeout = self.youpaipvideoModel.youpaipduration; WeakSelf; dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue); self.timer = timer; dispatch_source_set_timer(timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); //每秒执行 dispatch_source_set_event_handler(timer, ^{ timeout++; dispatch_async(dispatch_get_main_queue(), ^{ weakSelf.youpaiptimeLabel.text =[ZCUtils getMMSSFromSS:timeout]; kAppDelegate.logCallTime = weakSelf.youpaiptimeLabel.text; }); }); dispatch_resume(timer); } - (void)youpaifinterHandel:(UITapGestureRecognizer*)interTap{ if (interTap.state == UIGestureRecognizerStateEnded) { if (interTap.view == self.youpaipinterView) { dispatch_async(dispatch_get_main_queue(), ^{ self.youpaipdemoBar.hidden = YES; [self.view endEditing:YES]; }); }else{} } } - (void)youpaifdoubleTapHandel:(UITapGestureRecognizer*)tap{ if (tap.state == UIGestureRecognizerStateEnded) { if (self.youpaipinterView.frame.origin.x == KScreenWidth) { [self youpaifmsgViewAnimWithX:0]; }else{ [self youpaifmsgViewAnimWithX:KScreenWidth]; } } } - (void)youpaifmsgViewPanHandel:(UIPanGestureRecognizer*)panGesture{ //移动两点之间的绝对距离 dispatch_async(dispatch_get_main_queue(), ^{ [self.view endEditing:YES]; }); CGPoint translation = [panGesture translationInView:self.youpaipinterView]; if (self.youpaipinterView.frame.origin.x==0 && translation.x<0) { }else if(self.youpaipinterView.frame.origin.x==KScreenWidth && translation.x>0){ }else { CGPoint endPosition; if (panGesture.state == UIGestureRecognizerStateBegan){ self.youpaipstartPoint = [panGesture locationInView:self.youpaipinterView]; }else if (panGesture.state == UIGestureRecognizerStateChanged){ CGPoint origin = self.youpaipinterView.frame.origin; origin.x+=translation.x; if (origin.x<=0) { origin.x = 0; self.youpaipinterView.frame= CGRectMake(origin.x, 0, KScreenWidth, KScreenHeight); }else if(origin.x>=KScreenWidth){ origin.x = KScreenWidth; self.youpaipinterView.frame= CGRectMake(origin.x, 0, KScreenWidth, KScreenHeight); } }else if (panGesture.state == UIGestureRecognizerStateEnded) { endPosition = [panGesture locationInView:self.youpaipinterView]; if (endPosition.x-self.youpaipstartPoint.x>80) {//右移 小动画 [self youpaifmsgViewAnimWithX:KScreenWidth]; }else if(endPosition.x-self.youpaipstartPoint.x<-80){ //移 [self youpaifmsgViewAnimWithX:0]; } } } } - (void)youpaifmsgViewAnimWithX:(CGFloat)x{ NSTimeInterval durtionTime = fabs(self.youpaipinterView.x-x)*0.5/KScreenWidth; [UIView animateWithDuration:durtionTime animations:^{ self.youpaipinterView.frame = CGRectMake(x, 0, KScreenWidth, KScreenHeight); } completion:^(BOOL finished) { self.youpaipinterView.frame = CGRectMake(x, 0, KScreenWidth, KScreenHeight); }]; } - (void)youpaifloaclVideoHandel:(UITapGestureRecognizer*)localTap{ if (localTap.state == UIGestureRecognizerStateEnded) { if([self.remoteCanvas.view isEqual:self.youpaipremoteVideo]){ self.remoteCanvas.view = self.youpaiplocalVideo; self.localCanvas.view = self.youpaipremoteVideo; [self.agoraKit setupLocalVideo:self.localCanvas]; [self.agoraKit setupRemoteVideo:self.remoteCanvas]; }else{ self.remoteCanvas.view = self.youpaipremoteVideo; self.localCanvas.view = self.youpaiplocalVideo; [self.agoraKit setupLocalVideo:self.localCanvas]; [self.agoraKit setupRemoteVideo:self.remoteCanvas]; } } } #pragma mark - ButtonClick - (void)youpaifbeautyBtnClick{ self.youpaipdemoBar.hidden = NO; } - (void)youpaifswitchBtnClick:(UIButton*)btn{ [_youpaipmCamera changeCameraInputDeviceisFront:!_youpaipmCamera.isFrontCamera]; [self.agoraKit switchCamera]; [[FUManager shareManager] onCameraChange]; } - (void)youpaifvoiceBtnClick:(UIButton*)btn{ if (btn.selected == YES) { btn.selected = NO; [btn setImage:[UIImage imageNamed:@"vqu_images_video_sound_off"] forState:(UIControlStateNormal)]; [self.agoraKit disableAudio]; }else{ btn.selected = YES; [btn setImage:[UIImage imageNamed:@"vqu_images_video_sound_on"] forState:(UIControlStateNormal)]; [self.agoraKit enableAudio]; } } - (void)youpaifcameraBtnClick:(UIButton*)btn{ if (btn.selected == YES) { btn.selected = NO; self.localCanvas.view = self.youpaiplocalVideo; self.remoteCanvas.view = self.youpaipremoteVideo; [self.agoraKit setupLocalVideo:self.localCanvas]; [self.agoraKit setupRemoteVideo:self.remoteCanvas]; [btn setImage:[UIImage imageNamed:@"vqu_images_video_on"] forState:(UIControlStateNormal)]; [self.agoraKit muteLocalVideoStream:YES]; self.youpaiplocalVideo.hidden = YES; }else{ btn.selected = YES; [btn setImage:[UIImage imageNamed:@"vqu_images_video_off"] forState:(UIControlStateNormal)]; [self.agoraKit muteLocalVideoStream:NO]; self.youpaiplocalVideo.hidden = NO; } } #pragma mark - 键盘交互事件 - (void)youpaifwillResignActive { [_youpaipmCamera stopCapture]; } - (void)youpaifwillEnterForeground { [_youpaipmCamera startCapture]; if (self.youpaipvoiceBtn.selected == NO) { [self.agoraKit enableAudio]; [self.agoraKit disableAudio]; }else{ [self.agoraKit disableAudio]; [self.agoraKit enableAudio]; } } - (void)youpaifdidBecomeActive { [_youpaipmCamera startCapture]; } @end