YOUPAIBBBaseVideoCallVC.m 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701
  1. //
  2. // YOUPAIBBBaseVideoCallVC.m
  3. // VQU
  4. //
  5. // Created by Elaine on 2021/10/28.
  6. // Copyright © 2021 MS. All rights reserved.
  7. //
  8. #import "YOUPAIBBBaseVideoCallVC.h"
  9. #import "FUOpenGLView.h"
  10. #import "FUCamera.h"
  11. #import "FUManager.h"
  12. #import "FULiveModel.h"
  13. #import "FUAPIDemoBar.h"
  14. //#import "YOUPAIAGVideoProcessing.h"
  15. #import "AppDelegate.h"
  16. #import "YOUPAIBBCustomSystomNotification.h"
  17. @interface YOUPAIBBBaseVideoCallVC ()<FUCameraDelegate,FUAPIDemoBarDelegate>
  18. @property (assign,nonatomic) CGPoint youpaipstartPoint; //用来做清屏
  19. @property (nonatomic, strong) FUCamera *youpaipmCamera; //Faceunity Camera
  20. @property (strong, nonatomic) FUAPIDemoBar *youpaipdemoBar; //Tool Bar
  21. @property (nonatomic, strong) FULiveModel *youpaipliveModel ;
  22. @property(nonatomic,assign)BOOL youpaipisRecordScreen;
  23. @property(nonatomic,strong)UIView *youpaiprecoderHideView;
  24. @property (nonatomic, assign) BOOL youpaipisHangupCallVideo; /// 是否手动挂断
  25. @property(nonatomic,strong)UIImageView *timeLogo;
  26. @property(nonatomic,strong)UIButton *closeBtn;
  27. @end
  28. @implementation YOUPAIBBBaseVideoCallVC
  29. //@synthesize consumer;
  30. -(BOOL)prefersStatusBarHidden
  31. {
  32. return YES;
  33. }
  34. - (FUAPIDemoBar*)youpaipdemoBar{
  35. if (!_youpaipdemoBar) {
  36. _youpaipdemoBar = [[FUAPIDemoBar alloc] initWithFrame:CGRectMake(0, KScreenHeight-182, KScreenWidth, 182)];
  37. if (Is_iPhoneX) {
  38. _youpaipdemoBar.frame = CGRectMake(0, KScreenHeight-182-30, KScreenWidth, 182);
  39. }
  40. _youpaipdemoBar.mDelegate = self ;
  41. }
  42. return _youpaipdemoBar ;
  43. }
  44. - (FUCamera *)youpaipmCamera {
  45. if (!_youpaipmCamera) {
  46. _youpaipmCamera = [[FUCamera alloc] init];
  47. _youpaipmCamera.delegate = self;
  48. }
  49. return _youpaipmCamera;
  50. }
  51. - (void)dealloc{
  52. NSLog(@"dealloc basevideo");
  53. [[NSNotificationCenter defaultCenter] removeObserver:self];
  54. [[UIApplication sharedApplication] setIdleTimerDisabled:NO];
  55. }
  56. - (void)viewWillAppear:(BOOL)animated{
  57. [super viewWillAppear:animated];
  58. self.navigationController.navigationBarHidden = YES;
  59. [LCSaveData saveIsVideo:YES];
  60. if (self.youpaipliveModel.type == FULiveModelTypeBeautifyFace) {
  61. [self youpaifdemoBarSetBeautyDefultParams];
  62. }
  63. [self.youpaipmCamera startCapture];
  64. // [IQKeyboardManager sharedManager].enable = NO;
  65. }
  66. - (void)viewDidAppear:(BOOL)animated{
  67. [super viewDidAppear:animated];
  68. }
  69. - (void)viewWillDisappear:(BOOL)animated{
  70. [super viewWillDisappear:animated];
  71. [self.youpaipplayer stop];
  72. //add by leo 此处会导致vc无法释放
  73. self.youpaipplayer =nil;
  74. //add by leo 异常退出/被踢 显示处于视频中
  75. [LCSaveData saveIsVideo:NO];
  76. self.navigationController.navigationBarHidden = NO;
  77. // [IQKeyboardManager sharedManager].enable = YES;
  78. }
  79. - (void)viewDidLoad{
  80. [super viewDidLoad];
  81. self.sx_disableInteractivePop = YES;
  82. NSString* path = [[NSBundle mainBundle] pathForResource:@"sound"ofType:@"bundle"];
  83. NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/call_bg.mp3",path]];
  84. self.youpaipplayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
  85. [self.youpaipplayer prepareToPlay];
  86. self.youpaipplayer.numberOfLoops = -1;
  87. [self.youpaipplayer play];
  88. [self youpaifinitView];
  89. [self youpaifinitAgora];
  90. NSString* str=[AgoraRtcEngineKit getSdkVersion];
  91. self.youpaipliveModel = [FUManager shareManager].dataSource[0][0];
  92. //设置默认曝光度
  93. [self.youpaipmCamera setExposureValue:0];
  94. [self.youpaipmCamera startCapture];
  95. [self youpaifdemoBarSetBeautyDefultParams];
  96. [[FUManager shareManager] loadFilter] ;
  97. [[FUManager shareManager] setAsyncTrackFaceEnable:NO];
  98. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(youpaifwillResignActive) name:UIApplicationWillResignActiveNotification object:nil];
  99. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(youpaifwillEnterForeground) name:UIApplicationWillEnterForegroundNotification object:nil];
  100. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(youpaifdidBecomeActive) name:UIApplicationDidBecomeActiveNotification object:nil];
  101. //挂断视频,接听通知
  102. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(youpaifhangupCallVideoNotification) name:@"HangupCallVideo" object:nil];
  103. }
  104. - (void)youpaifhangupCallVideoNotification{
  105. [self youpaifvideoEnd:BBCustomSystomNotificationTypeWithHangupCallVideo];
  106. [ZCHUDHelper showTitle:@"对方已挂断"];
  107. }
  108. - (void)youpaifinitView{
  109. self.youpaipremoteVideo = [[UIView alloc]initWithFrame:CGRectMake(0,0,KScreenWidth,KScreenHeight)];
  110. self.youpaipremoteVideo.backgroundColor = [UIColor blackColor];
  111. [self.view addSubview:self.youpaipremoteVideo];
  112. self.youpaiprecoderHideView = [[UIView alloc]init];
  113. [self.youpaiprecoderHideView setBackgroundColor:[UIColor whiteColor]];
  114. [self.youpaiprecoderHideView setHidden:YES];
  115. [self.view addSubview:self.youpaiprecoderHideView];
  116. UIView* msgCoverView = [[UIView alloc]initWithFrame:CGRectMake(-KScreenWidth, 0, KScreenWidth*2, KScreenHeight)];
  117. msgCoverView.backgroundColor = [UIColor clearColor];
  118. UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(youpaifmsgViewPanHandel:)];
  119. [msgCoverView addGestureRecognizer:pan];
  120. UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(youpaifdoubleTapHandel:)];
  121. doubleTap.numberOfTapsRequired = 2;
  122. [msgCoverView addGestureRecognizer:doubleTap];
  123. self.youpaipmsgCoverView = msgCoverView;
  124. [self.view addSubview:msgCoverView];
  125. UIView* interView = [[UIView alloc]initWithFrame:CGRectMake(KScreenWidth, 0, KScreenWidth, KScreenHeight)];
  126. interView.backgroundColor = [UIColor clearColor];
  127. self.youpaipinterView = interView;
  128. UITapGestureRecognizer* interTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(youpaifinterHandel:)];
  129. [self.youpaipinterView addGestureRecognizer:interTap];
  130. [msgCoverView addSubview:interView];
  131. //设置顶部按钮
  132. UIButton* closeBtn = [[UIButton alloc]initWithFrame:CGRectMake(16,StatusBarHeight+4, 30, 30)];
  133. [closeBtn setImage:[UIImage imageNamed:@"vqu_images_video_end"] forState:(UIControlStateNormal)];
  134. [closeBtn addTarget:self action:@selector(youpaifcloseBtnClick) forControlEvents:(UIControlEventTouchUpInside)];
  135. [closeBtn setEnlargeEdge:10];
  136. [self.view addSubview:closeBtn];
  137. self.closeBtn = closeBtn;
  138. self.closeBtn.hidden = YES;
  139. UIView *timeBgv = [[UIView alloc] init];
  140. timeBgv.layer.cornerRadius = 12.0f;
  141. timeBgv.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.3f];
  142. [self.view addSubview:timeBgv];
  143. [timeBgv mas_makeConstraints:^(MASConstraintMaker *make) {
  144. make.left.offset(54.0f);
  145. make.top.offset(StatusBarHeight+7);
  146. make.height.offset(24.0f);
  147. }];
  148. UIImageView* timeLogo = [[UIImageView alloc]initWithFrame:CGRectMake(0,0, 30, 30)];
  149. timeLogo.contentMode = UIViewContentModeScaleAspectFill;
  150. timeLogo.image = [UIImage imageNamed:@"vqu_images_video_time"];
  151. [timeBgv addSubview:timeLogo];
  152. [timeLogo mas_makeConstraints:^(MASConstraintMaker *make) {
  153. make.left.offset(0);
  154. make.centerY.equalTo(timeBgv);
  155. make.size.mas_offset(CGSizeMake(30, 30));
  156. }];
  157. self.timeLogo = timeLogo;
  158. self.timeLogo.hidden = YES;
  159. UILabel* timeLabel = [self youpaifcreateLabelWithFrame:CGRectMake(44,0,100,30) text:@"00:00"];
  160. timeLabel.textColor = HexColorFromRGB(0xFFFFFF);
  161. self.youpaiptimeLabel = timeLabel;
  162. [timeBgv addSubview:timeLabel];
  163. [self youpaiftimeStart];
  164. [timeLabel mas_makeConstraints:^(MASConstraintMaker *make) {
  165. make.top.bottom.offset(0.0f);
  166. make.right.offset(-8.0f);
  167. make.left.equalTo(timeLogo.mas_right);
  168. }];
  169. [self.view addSubview:self.youpaipdemoBar];
  170. self.youpaipdemoBar.hidden = YES;
  171. self.youpaiptimeLabel.hidden = YES;
  172. self.youpaiplocalVideo = [[UIView alloc]initWithFrame:CGRectMake(KScreenWidth-106,StatusBarHeight+4, 90,120)];
  173. self.youpaiplocalVideo.backgroundColor = [UIColor blackColor];
  174. self.youpaiplocalVideo.layer.cornerRadius = 5.0;
  175. self.youpaiplocalVideo.layer.masksToBounds = YES;
  176. [self.view addSubview:self.youpaiplocalVideo];
  177. UITapGestureRecognizer* localTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(youpaifloaclVideoHandel:)];
  178. [self.youpaiplocalVideo addGestureRecognizer:localTap];
  179. //摄像
  180. UIButton* cameraBtn = [[UIButton alloc]initWithFrame:CGRectMake(self.youpaiplocalVideo.center.x-16,StatusBarHeight+4+120+8.5,32,25)];
  181. [cameraBtn setImage:[UIImage imageNamed:@"vqu_images_video_off"] forState:(UIControlStateNormal)];
  182. [cameraBtn addTarget:self action:@selector(youpaifcameraBtnClick:) forControlEvents:(UIControlEventTouchUpInside)];
  183. [self.view addSubview:cameraBtn];
  184. cameraBtn.selected = YES;
  185. self.youpaipcameraBtn = cameraBtn;
  186. self.youpaipcameraBtn.hidden = YES;
  187. self.youpaipcameraBtn.centerX = self.youpaiplocalVideo.center.x;
  188. }
  189. - (UILabel*)youpaifcreateLabelWithFrame:(CGRect)frame text:(NSString*)contentText{
  190. UILabel* lab = [[UILabel alloc]initWithFrame:frame];
  191. lab.textColor = [UIColor whiteColor];
  192. lab.font = [UIFont systemFontOfSize:11];
  193. lab.textAlignment = NSTextAlignmentLeft;
  194. lab.text = contentText;
  195. return lab;
  196. }
  197. - (void)youpaifdemoBarSetBeautyDefultParams {
  198. _youpaipdemoBar.mDelegate = nil ;
  199. [_youpaipdemoBar reloadSkinView:[FUManager shareManager].skinParams];
  200. [_youpaipdemoBar reloadShapView:[FUManager shareManager].shapeParams];
  201. [_youpaipdemoBar reloadFilterView:[FUManager shareManager].filters];
  202. _youpaipdemoBar.mDelegate = self;
  203. }
  204. #pragma mark --- FUAPIDemoBarDelegate
  205. -(void)restDefaultValue:(int)type{
  206. if (type == 1) {//美肤
  207. [[FUManager shareManager] setBeautyDefaultParameters:FUBeautyModuleTypeSkin];
  208. }
  209. if (type == 2) {
  210. [[FUManager shareManager] setBeautyDefaultParameters:FUBeautyModuleTypeShape];
  211. }
  212. }
  213. -(void)filterValueChange:(FUBeautyParam *)param{
  214. int handle = [[FUManager shareManager] getHandleAboutType:FUNamaHandleTypeBeauty];
  215. [FURenderer itemSetParam:handle withName:@"filter_name" value:[param.mParam lowercaseString]];
  216. [FURenderer itemSetParam:handle withName:@"filter_level" value:@(param.mValue)]; //滤镜程度
  217. [FUManager shareManager].seletedFliter = param;
  218. }
  219. -(void)beautyParamValueChange:(FUBeautyParam *)param{
  220. if (_youpaipdemoBar.selBottomIndex == 3) {//风格栏
  221. if (param.beautyAllparams) {
  222. [[FUManager shareManager] setStyleBeautyParams:param.beautyAllparams];
  223. [FUManager shareManager].currentStyle = param;
  224. }else{// 点击无
  225. [FUManager shareManager].currentStyle = param;
  226. [[FUManager shareManager] loadFilter];
  227. }
  228. return;
  229. }
  230. if ([param.mParam isEqualToString:@"cheek_narrow"] || [param.mParam isEqualToString:@"cheek_small"]){//程度值 只去一半
  231. [[FUManager shareManager] setParamItemAboutType:FUNamaHandleTypeBeauty name:param.mParam value:param.mValue * 0.5];
  232. }else if([param.mParam isEqualToString:@"blur_level"]) {//磨皮 0~6
  233. [[FUManager shareManager] setParamItemAboutType:FUNamaHandleTypeBeauty name:param.mParam value:param.mValue * 6];
  234. }else{
  235. [[FUManager shareManager] setParamItemAboutType:FUNamaHandleTypeBeauty name:param.mParam value:param.mValue];
  236. }
  237. }
  238. #pragma mark - Agora
  239. - (void)youpaifinitAgora{
  240. self.agoraKit = [AgoraRtcEngineKit sharedEngineWithAppId:AgoraID delegate:self];
  241. NSLog(@"version is %@",[AgoraRtcEngineKit getSdkVersion]);
  242. AgoraVideoEncoderConfiguration *configuration = [[AgoraVideoEncoderConfiguration alloc] initWithSize:AgoraVideoDimension1280x720 frameRate:AgoraVideoFrameRateFps24 bitrate:AgoraVideoBitrateCompatible orientationMode:AgoraVideoOutputOrientationModeAdaptative mirrorMode:AgoraVideoMirrorModeAuto];
  243. [self.agoraKit setVideoEncoderConfiguration:configuration];
  244. [self.agoraKit enableVideo];
  245. [self.agoraKit setExternalVideoSource:YES useTexture:YES sourceType:AgoraExternalVideoSourceTypeVideoFrame]; //只允许外部源
  246. [self.agoraKit setChannelProfile:AgoraChannelProfileLiveBroadcasting];
  247. [self.agoraKit setClientRole:AgoraClientRoleBroadcaster];
  248. //add by leo 修复视频镜像问题
  249. [self.agoraKit setLocalVideoMirrorMode:AgoraVideoMirrorModeDisabled];
  250. [self.agoraKit enableWebSdkInteroperability:YES];
  251. AgoraRtcVideoCanvas *videoCanvas = [[AgoraRtcVideoCanvas alloc] init];
  252. videoCanvas.uid = 0;
  253. videoCanvas.view = self.youpaiplocalVideo;
  254. videoCanvas.renderMode = AgoraVideoRenderModeHidden;
  255. self.localCanvas = videoCanvas;
  256. [self.agoraKit setupLocalVideo:videoCanvas];
  257. }
  258. #pragma mark - AgoraRtcEngineDelegate
  259. //收到对方的视频
  260. - (void)rtcEngine:(AgoraRtcEngineKit *)engine firstRemoteVideoDecodedOfUid:(NSUInteger)uid size: (CGSize)size elapsed:(NSInteger)elapsed {
  261. self.youpaipremoteVideo.hidden = NO;
  262. self.youpaipcameraBtn.hidden = NO;
  263. self.youpaiptimeLabel.hidden = NO;
  264. self.closeBtn.hidden = NO;
  265. self.timeLogo.hidden = NO;
  266. AgoraRtcVideoCanvas *videoCanvas = [[AgoraRtcVideoCanvas alloc] init];
  267. videoCanvas.renderMode = AgoraVideoRenderModeHidden;
  268. self.remoteCanvas= videoCanvas;
  269. self.remoteCanvas.uid = uid;
  270. self.remoteCanvas.view = self.youpaipremoteVideo;
  271. int value =[self.agoraKit setupRemoteVideo:self.remoteCanvas];
  272. NSLog(@"%d",value);
  273. }
  274. - (void)rtcEngine:(AgoraRtcEngineKit *)engine
  275. didVideoMuted:(BOOL)muted byUid:(NSUInteger)uid{
  276. if (muted) {//对端关闭了视频
  277. self.localCanvas.view = self.youpaipremoteVideo;
  278. self.remoteCanvas.view = self.youpaiplocalVideo;
  279. [self.agoraKit setupLocalVideo:self.localCanvas];
  280. [self.agoraKit setupRemoteVideo:self.remoteCanvas];
  281. self.youpaiplocalVideo.hidden = YES;
  282. }else{
  283. self.localCanvas.view = self.youpaiplocalVideo;
  284. self.remoteCanvas.view = self.youpaipremoteVideo;
  285. [self.agoraKit setupLocalVideo:self.localCanvas];
  286. [self.agoraKit setupRemoteVideo:self.remoteCanvas];
  287. self.youpaiplocalVideo.hidden = NO;
  288. }
  289. }
  290. - (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine didOfflineOfUid:(NSUInteger)uid reason:(AgoraUserOfflineReason)reason{
  291. if (!self.youpaipisHangupCallVideo) {
  292. [self youpaifvideoEnd:BBCustomSystomNotificationTypeWithWasInterruptedCallVideo];
  293. [ZCHUDHelper showTitle:[YOUPAIBBCustomSystomNotification youpaifnotificationTitleWithType:BBCustomSystomNotificationTypeWithWasInterruptedCallVideo]];
  294. }
  295. }
  296. - (void)rtcEngine:(AgoraRtcEngineKit *)engine didAudioRouteChanged:(AgoraAudioOutputRouting)routing{
  297. // [ZCHUDHelper showTitle:[NSString stringWithFormat:@"音频路由已切换%d",routing]];
  298. }
  299. //踢人 v1.1.1
  300. //- (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine connectionChangedToState:(AgoraConnectionStateType)state reason:(AgoraConnectionChangedReason)reason
  301. //{
  302. // if(reason ==3)
  303. // {
  304. // NSLog(@"收到踢人消息");
  305. // // [self youpaifvideoEnd:5];
  306. // }
  307. //}
  308. #pragma mark - Agora Video Source Protocol
  309. - (BOOL)shouldInitialize {
  310. return YES;
  311. }
  312. - (void)shouldStart {
  313. [self.youpaipmCamera startCapture];
  314. }
  315. - (void)shouldStop {
  316. [self.youpaipmCamera stopCapture];
  317. }
  318. - (void)shouldDispose {
  319. }
  320. //
  321. //
  322. //- (AgoraVideoBufferType)bufferType {
  323. // return AgoraVideoBufferTypePixelBuffer;
  324. //}
  325. //- (AgoraVideoCaptureType)captureType{
  326. // return AgoraVideoCaptureTypeCamera;
  327. //}
  328. #pragma mark - FUCameraDelegate
  329. bool lzIsNeeded = YES;
  330. -(void)didOutputVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer {
  331. if (lzIsNeeded) {
  332. lzIsNeeded = !lzIsNeeded;
  333. return;
  334. }
  335. lzIsNeeded = !lzIsNeeded;
  336. // CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent();
  337. CVPixelBufferRef pixelBuffer = (CVPixelBufferRef)CMSampleBufferGetImageBuffer(sampleBuffer) ;
  338. CVPixelBufferLockBaseAddress(pixelBuffer, 0);
  339. // CFAbsoluteTime startRenderTime = CFAbsoluteTimeGetCurrent();
  340. //render the items to pixelbuffer
  341. [[FUManager shareManager] renderItemsToPixelBuffer:pixelBuffer];
  342. // CFAbsoluteTime renderTime = (CFAbsoluteTimeGetCurrent() - startRenderTime);
  343. //
  344. //
  345. // CFAbsoluteTime frameTime = (CFAbsoluteTimeGetCurrent() - startTime);
  346. //
  347. // int frameWidth = (int)CVPixelBufferGetWidth(pixelBuffer);
  348. // int frameHeight = (int)CVPixelBufferGetHeight(pixelBuffer);
  349. CGSize frameSize;
  350. if (CVPixelBufferGetPixelFormatType(pixelBuffer) == kCVPixelFormatType_32BGRA) {
  351. frameSize = CGSizeMake(CVPixelBufferGetBytesPerRow(pixelBuffer) / 4, CVPixelBufferGetHeight(pixelBuffer));
  352. }else{
  353. frameSize = CGSizeMake(CVPixelBufferGetWidth(pixelBuffer), CVPixelBufferGetHeight(pixelBuffer));
  354. }
  355. // push video frame to agora
  356. // [self.consumer consumePixelBuffer:pixelBuffer withTimestamp:CMSampleBufferGetPresentationTimeStamp(sampleBuffer) rotation:AgoraVideoRotationNone];
  357. CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);
  358. }
  359. #pragma mark - WebSocketDelegate
  360. - (void)youpaifrequestSuccess{
  361. }
  362. - (void)youpaifresponseConnent{
  363. }
  364. - (void)youpaifresponseChoosing:(NSString*)tip{
  365. }
  366. //add by leo 剩余可通话时间
  367. - (void)youpaifcanCallTime:(NSString*)tip
  368. {
  369. }
  370. //v1.1.1断连重连
  371. - (void)youpaifvideoStart{
  372. [self.youpaipplayer stop];
  373. // self.videoModel.duration = [dict[@"duration"] integerValue];
  374. //是否主叫
  375. BOOL callfrom = [[LCSaveModel getUserModel].youpaipuserinfo.youpaipuser_id isEqualToString:self.youpaipvideoModel.youpaipfrom_uid];
  376. if (self.youpaipvideoModel.youpaipporn_check_v2.youpaipis_open&&(self.youpaipvideoModel.youpaipporn_check_v2.youpaipcheck_from_user||callfrom)) {
  377. NSLog(@"鉴黄已打开");
  378. [YOUPAIXLVideoShotTool sharedPusher].shotCycle = self.youpaipvideoModel.youpaipporn_check_v2.youpaipinterval_time;
  379. [YOUPAIXLVideoShotTool sharedPusher].periodArray = self.youpaipvideoModel.youpaipporn_check_v2.youpaipperiod_array;
  380. // [YOUPAIAGVideoProcessing registerVideoPreprocessing:self.agoraKit];
  381. //老版本
  382. /*
  383. [YOUPAIXLVideoShotTool sharedPusher].shotCycle = self.videoModel.porn_check.interval_time;
  384. [YOUPAIXLVideoShotTool sharedPusher].period = self.videoModel.porn_check.period;
  385. */
  386. [YOUPAIXLVideoShotTool sharedPusher].room_id = self.youpaipvideoModel.youpaiproom_id;
  387. [YOUPAIXLVideoShotTool sharedPusher].localVideo = self.youpaiplocalVideo;
  388. [YOUPAIXLVideoShotTool sharedPusher].remoteVideo = self.youpaipremoteVideo;
  389. [YOUPAIXLVideoShotTool sharedPusher].isPornCheckOpen = YES;
  390. if ([[LCSaveModel getUserModel].youpaipuserinfo.youpaipuser_id isEqualToString:self.youpaipvideoModel.youpaipfrom_uid]) {//自己是被叫端
  391. [YOUPAIXLVideoShotTool sharedPusher].isFrom = YES;
  392. [YOUPAIXLVideoShotTool sharedPusher].uid = self.youpaipvideoModel.youpaipto_uid;
  393. }else{
  394. [YOUPAIXLVideoShotTool sharedPusher].isFrom = NO;
  395. [YOUPAIXLVideoShotTool sharedPusher].uid = self.youpaipvideoModel.youpaipfrom_uid;
  396. }
  397. [YOUPAIXLVideoShotTool start];
  398. }
  399. //加入声网频道
  400. //modify by leo fix bug object unrelease
  401. WeakSelf;
  402. [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) {
  403. if([weakSelf.agoraKit isSpeakerphoneEnabled]){
  404. [weakSelf.agoraKit setEnableSpeakerphone:YES];
  405. }
  406. // self.localVideo.hidden = YES;
  407. [UIApplication sharedApplication].idleTimerDisabled = YES;
  408. }];
  409. }
  410. //1主动取消 2。拒绝 3.超时 4.被叫者挂断 5.主叫者挂断 6.费用不足
  411. - (void)youpaifvideoEnd:(NSInteger)type{
  412. kAppDelegate.ksocketManager = nil;
  413. [LCSaveData saveIsVideo:NO];
  414. [[NSNotificationCenter defaultCenter] removeObserver:self];
  415. if (self.timer) {
  416. dispatch_source_cancel(self.timer);//删除GCD定时器
  417. self.timer = nil;
  418. }
  419. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  420. [self.youpaipmCamera stopCapture];
  421. dispatch_async(self.youpaipmCamera.videoCaptureQueue, ^{
  422. [[FUManager shareManager] destoryItems];
  423. });
  424. [self.agoraKit setExternalVideoSource:YES useTexture:YES sourceType:AgoraExternalVideoSourceTypeVideoFrame]; //只允许外部源
  425. [self.agoraKit leaveChannel:nil];
  426. [AgoraRtcEngineKit destroy];
  427. if (type==11) {
  428. if ([[LCSaveModel getUserModel].youpaipuserinfo.youpaipuser_id isEqualToString:self.youpaipvideoModel.youpaipto_uid]){//自己是被叫端
  429. [self.navigationController dismissViewControllerAnimated:YES completion:^{
  430. }];
  431. }else{//自己是主叫端
  432. [YOUPAIXLVideoShotTool stop];
  433. [self.navigationController dismissViewControllerAnimated:YES completion:^{
  434. NSLog(@"1111111");
  435. }];
  436. }
  437. }
  438. if (type==4|| type==5 || type==6 || type==10) {//去往评价结束界面
  439. //add by leo 关闭上传截图 定时器
  440. [YOUPAIXLVideoShotTool stop];
  441. [self.navigationController dismissViewControllerAnimated:YES completion:^{
  442. NSLog(@"12121212");
  443. }];
  444. }else{
  445. [self.navigationController dismissViewControllerAnimated:YES completion:^{
  446. NSLog(@"2222222");
  447. }];
  448. }
  449. });
  450. }
  451. - (void)youpaifcloseBtnClick{
  452. //确定退出视频咨询
  453. UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil message:@"确定挂断视频通话?" preferredStyle:UIAlertControllerStyleAlert];
  454. UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action){
  455. }];
  456. UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action){
  457. self.youpaipisHangupCallVideo = YES;
  458. [self youpaifvideoEnd:4];
  459. [YOUPAIBBCustomSystomNotification youpaifcustomSystomNotificationWithModel:self.youpaipvideoModel type:BBCustomSystomNotificationTypeWithHangupCallVideo block:^(NSError * _Nonnull error) {
  460. }];
  461. [ZCHUDHelper showTitle:@"已挂断"];
  462. }];
  463. [alertController addAction:cancelAction];
  464. [alertController addAction:okAction];
  465. [self presentViewController:alertController animated:YES completion:nil];
  466. }
  467. #pragma mark - interActive
  468. - (void)youpaiftimeStart{
  469. //v1.1.1断连重连
  470. __block int timeout = self.youpaipvideoModel.youpaipduration;
  471. WeakSelf;
  472. dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
  473. dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);
  474. self.timer = timer;
  475. dispatch_source_set_timer(timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); //每秒执行
  476. dispatch_source_set_event_handler(timer, ^{
  477. timeout++;
  478. dispatch_async(dispatch_get_main_queue(), ^{
  479. weakSelf.youpaiptimeLabel.text =[ZCUtils getMMSSFromSS:timeout];
  480. kAppDelegate.logCallTime = weakSelf.youpaiptimeLabel.text;
  481. });
  482. });
  483. dispatch_resume(timer);
  484. }
  485. - (void)youpaifinterHandel:(UITapGestureRecognizer*)interTap{
  486. if (interTap.state == UIGestureRecognizerStateEnded) {
  487. if (interTap.view == self.youpaipinterView) {
  488. dispatch_async(dispatch_get_main_queue(), ^{
  489. self.youpaipdemoBar.hidden = YES;
  490. [self.view endEditing:YES];
  491. });
  492. }else{}
  493. }
  494. }
  495. - (void)youpaifdoubleTapHandel:(UITapGestureRecognizer*)tap{
  496. if (tap.state == UIGestureRecognizerStateEnded) {
  497. if (self.youpaipinterView.frame.origin.x == KScreenWidth) {
  498. [self youpaifmsgViewAnimWithX:0];
  499. }else{
  500. [self youpaifmsgViewAnimWithX:KScreenWidth];
  501. }
  502. }
  503. }
  504. - (void)youpaifmsgViewPanHandel:(UIPanGestureRecognizer*)panGesture{
  505. //移动两点之间的绝对距离
  506. dispatch_async(dispatch_get_main_queue(), ^{
  507. [self.view endEditing:YES];
  508. });
  509. CGPoint translation = [panGesture translationInView:self.youpaipinterView];
  510. if (self.youpaipinterView.frame.origin.x==0 && translation.x<0) {
  511. }else if(self.youpaipinterView.frame.origin.x==KScreenWidth && translation.x>0){
  512. }else {
  513. CGPoint endPosition;
  514. if (panGesture.state == UIGestureRecognizerStateBegan){
  515. self.youpaipstartPoint = [panGesture locationInView:self.youpaipinterView];
  516. }else if (panGesture.state == UIGestureRecognizerStateChanged){
  517. CGPoint origin = self.youpaipinterView.frame.origin;
  518. origin.x+=translation.x;
  519. if (origin.x<=0) {
  520. origin.x = 0;
  521. self.youpaipinterView.frame= CGRectMake(origin.x, 0, KScreenWidth, KScreenHeight);
  522. }else if(origin.x>=KScreenWidth){
  523. origin.x = KScreenWidth;
  524. self.youpaipinterView.frame= CGRectMake(origin.x, 0, KScreenWidth, KScreenHeight);
  525. }
  526. }else if (panGesture.state == UIGestureRecognizerStateEnded) {
  527. endPosition = [panGesture locationInView:self.youpaipinterView];
  528. if (endPosition.x-self.youpaipstartPoint.x>80) {//右移 小动画
  529. [self youpaifmsgViewAnimWithX:KScreenWidth];
  530. }else if(endPosition.x-self.youpaipstartPoint.x<-80){ //移
  531. [self youpaifmsgViewAnimWithX:0];
  532. }
  533. }
  534. }
  535. }
  536. - (void)youpaifmsgViewAnimWithX:(CGFloat)x{
  537. NSTimeInterval durtionTime = fabs(self.youpaipinterView.x-x)*0.5/KScreenWidth;
  538. [UIView animateWithDuration:durtionTime animations:^{
  539. self.youpaipinterView.frame = CGRectMake(x, 0, KScreenWidth, KScreenHeight);
  540. } completion:^(BOOL finished) {
  541. self.youpaipinterView.frame = CGRectMake(x, 0, KScreenWidth, KScreenHeight);
  542. }];
  543. }
  544. - (void)youpaifloaclVideoHandel:(UITapGestureRecognizer*)localTap{
  545. if (localTap.state == UIGestureRecognizerStateEnded) {
  546. if([self.remoteCanvas.view isEqual:self.youpaipremoteVideo]){
  547. self.remoteCanvas.view = self.youpaiplocalVideo;
  548. self.localCanvas.view = self.youpaipremoteVideo;
  549. [self.agoraKit setupLocalVideo:self.localCanvas];
  550. [self.agoraKit setupRemoteVideo:self.remoteCanvas];
  551. }else{
  552. self.remoteCanvas.view = self.youpaipremoteVideo;
  553. self.localCanvas.view = self.youpaiplocalVideo;
  554. [self.agoraKit setupLocalVideo:self.localCanvas];
  555. [self.agoraKit setupRemoteVideo:self.remoteCanvas];
  556. }
  557. }
  558. }
  559. #pragma mark - ButtonClick
  560. - (void)youpaifbeautyBtnClick{
  561. self.youpaipdemoBar.hidden = NO;
  562. }
  563. - (void)youpaifswitchBtnClick:(UIButton*)btn{
  564. [_youpaipmCamera changeCameraInputDeviceisFront:!_youpaipmCamera.isFrontCamera];
  565. [self.agoraKit switchCamera];
  566. [[FUManager shareManager] onCameraChange];
  567. }
  568. - (void)youpaifvoiceBtnClick:(UIButton*)btn{
  569. if (btn.selected == YES) {
  570. btn.selected = NO;
  571. [btn setImage:[UIImage imageNamed:@"vqu_images_video_sound_off"] forState:(UIControlStateNormal)];
  572. [self.agoraKit disableAudio];
  573. }else{
  574. btn.selected = YES;
  575. [btn setImage:[UIImage imageNamed:@"vqu_images_video_sound_on"] forState:(UIControlStateNormal)];
  576. [self.agoraKit enableAudio];
  577. }
  578. }
  579. - (void)youpaifcameraBtnClick:(UIButton*)btn{
  580. if (btn.selected == YES) {
  581. btn.selected = NO;
  582. self.localCanvas.view = self.youpaiplocalVideo;
  583. self.remoteCanvas.view = self.youpaipremoteVideo;
  584. [self.agoraKit setupLocalVideo:self.localCanvas];
  585. [self.agoraKit setupRemoteVideo:self.remoteCanvas];
  586. [btn setImage:[UIImage imageNamed:@"vqu_images_video_on"] forState:(UIControlStateNormal)];
  587. [self.agoraKit muteLocalVideoStream:YES];
  588. self.youpaiplocalVideo.hidden = YES;
  589. }else{
  590. btn.selected = YES;
  591. [btn setImage:[UIImage imageNamed:@"vqu_images_video_off"] forState:(UIControlStateNormal)];
  592. [self.agoraKit muteLocalVideoStream:NO];
  593. self.youpaiplocalVideo.hidden = NO;
  594. }
  595. }
  596. #pragma mark - 键盘交互事件
  597. - (void)youpaifwillResignActive {
  598. [_youpaipmCamera stopCapture];
  599. }
  600. - (void)youpaifwillEnterForeground {
  601. [_youpaipmCamera startCapture];
  602. if (self.youpaipvoiceBtn.selected == NO) {
  603. [self.agoraKit enableAudio];
  604. [self.agoraKit disableAudio];
  605. }else{
  606. [self.agoraKit disableAudio];
  607. [self.agoraKit enableAudio];
  608. }
  609. }
  610. - (void)youpaifdidBecomeActive {
  611. [_youpaipmCamera startCapture];
  612. }
  613. @end