You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
419 lines
15 KiB
419 lines
15 KiB
// |
|
// RootViewController.m |
|
// AnyChatCallCenter |
|
// |
|
// Created by alex on 14-1-27. |
|
// Copyright (c) 2014年 GuangZhou BaiRui NetWork Technology Co.,Ltd. All rights reserved. |
|
// |
|
|
|
#import "VideoViewController.h" |
|
#import "BRUIImageView.h" |
|
#import <JLAuthorizationManager.h> |
|
#import "BRManager.h" |
|
#import "UIView+XHRemoteImage.h" |
|
|
|
|
|
#define kDegreesToRadian(degrees) (M_PI * (degrees) / 180.0) |
|
#define kLayer_Z_Axis_3DRotation(degrees) CATransform3DMakeRotation(kDegreesToRadian(degrees), 0.0, 0.0, 1.0) |
|
|
|
@interface VideoViewController () |
|
|
|
@property (strong, nonatomic) AVCaptureVideoPreviewLayer *localVideoSurface; |
|
@property (strong, nonatomic) NSMutableArray *theOnlineUserList; |
|
@property (strong, nonatomic) IBOutlet BRUIImageView *theUIImageView; |
|
@property (strong, nonatomic) IBOutlet UIView *theLocalView; |
|
@property (weak, nonatomic) IBOutlet UIButton *voiceBtn; |
|
@property (weak, nonatomic) IBOutlet UIButton *cameraBtn; |
|
@property (strong, nonatomic) MZTimerLabel *theVideoMZTimer; |
|
@property (nonatomic, assign) int iRemoteUserId; |
|
|
|
@property (weak, nonatomic) IBOutlet UIImageView *headImage; |
|
@property (weak, nonatomic) IBOutlet UILabel *voiceLabel; |
|
@property (weak, nonatomic) IBOutlet UILabel *videoLabel; |
|
|
|
/// 是否未打开麦克风 |
|
@property (nonatomic) BOOL isUNAuthorizationTypeAudio; |
|
|
|
/// 是否未打开相机 |
|
@property (nonatomic) BOOL isUNAuthorizationTypeCamera; |
|
|
|
@end |
|
|
|
@implementation VideoViewController |
|
|
|
#pragma mark - Life Cycle |
|
- (void)viewDidLoad { |
|
[super viewDidLoad]; |
|
|
|
WEAKSELF |
|
|
|
self.view.backgroundColor = [UIColor blackColor]; |
|
self.theLocalView.backgroundColor = [UIColor blackColor]; |
|
|
|
JLAuthorizationManager *jlManager = [JLAuthorizationManager defaultManager]; |
|
[jlManager JL_requestAuthorizationWithAuthorizationType:JLAuthorizationTypeAudio |
|
authorizedHandler:nil |
|
unAuthorizedHandler:^{ |
|
weakSelf.isUNAuthorizationTypeAudio = YES; |
|
|
|
}]; |
|
[jlManager JL_requestAuthorizationWithAuthorizationType:JLAuthorizationTypeVideo |
|
authorizedHandler:nil |
|
unAuthorizedHandler:^{ |
|
weakSelf.isUNAuthorizationTypeCamera = YES; |
|
}]; |
|
|
|
self.theUserEntity = [UserEntity new]; |
|
self.theUserEntity.theEntityRemoteID = [_brModel.device_username intValue]; |
|
self.theUserEntity.theEntityRemoteName = _device.name;//_brModel.deviceName; |
|
|
|
[self addDeviceRotateObserver]; |
|
[self StartVideoChat:self.theUserEntity.theEntityRemoteID]; |
|
[self setTheTimer]; |
|
[self p_configNavItem]; |
|
self.title = [NSString stringWithFormat:@"与%@的对话", self.theUserEntity.theEntityRemoteName]; |
|
|
|
|
|
[self.view adaptScreenWidthWithType:AdaptScreenWidthTypeAll exceptViews:nil]; |
|
|
|
// 视频 |
|
if (_callType == 0) { |
|
self.headImage.hidden = YES; |
|
|
|
// 语音 |
|
} else { |
|
[self.headImage setImageWithURL:[NSURL URLWithString:_device.avator] placeholer:[UIImage imageNamed:@"icon_girl_head_portrait_1"]]; |
|
self.view.backgroundColor = mainColor; |
|
self.videoLabel.hidden = YES; |
|
self.voiceLabel.hidden = YES; |
|
self.voiceBtn.hidden = YES; |
|
self.cameraBtn.hidden = YES; |
|
self.theLocalView.hidden = YES; |
|
self.theUIImageView.hidden = YES; |
|
} |
|
|
|
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(OnAnyChatUserEnterRoom:) name:@"ANY_CHAT_USER_ENTER_ROOM" object:nil]; |
|
} |
|
|
|
- (void)judgeAuthorization{ |
|
if(self.isUNAuthorizationTypeCamera == YES){ |
|
[self showAlertAuthorizationTypeCamera]; |
|
if(self.isReceiveCall){ |
|
//[self activeHangUpBtnAction:nil]; |
|
}else{ |
|
//[self hangUpButton:nil]; |
|
} |
|
}else if(self.isUNAuthorizationTypeAudio == YES){ |
|
[self showAlertAuthorizationTypeVideo]; |
|
if(self.isReceiveCall){ |
|
//[self activeHangUpBtnAction:nil]; |
|
}else{ |
|
//[self hangUpButton:nil]; |
|
} |
|
} |
|
} |
|
|
|
-(void)OnAnyChatUserEnterRoom:(NSNotification *)notification { |
|
NSNumber *dwUserId = notification.userInfo[@"dwUserId"]; |
|
if (dwUserId) { |
|
NSLog(@"======VC OnAnyChatUserEnterRoom========%d", dwUserId.intValue); |
|
NSMutableArray *arr = [AnyChatPlatform GetOnlineUser]; |
|
NSLog(@"Get Online User = %@", arr); |
|
#pragma mark 当用户不在房间里时打开用户音视频 |
|
if(!arr || arr.count==0) { |
|
[self openRemoteView]; |
|
} |
|
} |
|
} |
|
|
|
-(void)showAlertAuthorizationTypeVideo{ |
|
|
|
LGAlertView *alertView = [[LGAlertView alloc] initWithTitle:[NSString stringWithFormat:@"请在iPhone的\"设置-隐私-麦克风\"选项中,允许%@访问你的麦克风",APPName] message:nil style:LGAlertViewStyleAlert buttonTitles:@[@"确定"] cancelButtonTitle:@"" destructiveButtonTitle:nil actionHandler:^(LGAlertView *alertView, NSString *title, NSUInteger index) { |
|
|
|
|
|
} cancelHandler:^(LGAlertView *alertView) { |
|
|
|
} destructiveHandler:nil]; |
|
[alertView showAnimated:YES completionHandler:nil]; |
|
} |
|
|
|
-(void)showAlertAuthorizationTypeCamera{ |
|
LGAlertView *alertView = [[LGAlertView alloc] initWithTitle:[NSString stringWithFormat:@"请在iPhone的\"设置-隐私-相机\"选项中,允许%@访问你的相机",APPName] message:nil style:LGAlertViewStyleAlert buttonTitles:@[@"确定"] cancelButtonTitle:@"" destructiveButtonTitle:nil actionHandler:^(LGAlertView *alertView, NSString *title, NSUInteger index) { |
|
|
|
|
|
} cancelHandler:^(LGAlertView *alertView) { |
|
|
|
} destructiveHandler:nil]; |
|
[alertView showAnimated:YES completionHandler:nil]; |
|
} |
|
|
|
- (void)viewWillAppear:(BOOL)animated { |
|
[super viewWillAppear:YES]; |
|
//强制亮屏 |
|
[[UIApplication sharedApplication] setIdleTimerDisabled:YES]; |
|
if ([UIApplication sharedApplication].applicationState == UIApplicationStateActive){ |
|
[self judgeAuthorization]; |
|
} |
|
|
|
[self setUIControls]; |
|
} |
|
|
|
|
|
- (void)viewDidDisappear:(BOOL)animated { |
|
[super viewDidDisappear:YES]; |
|
//The Timer Pause |
|
[self.theVideoMZTimer pause]; |
|
} |
|
|
|
-(void)navLeftClick { |
|
[self FinishVideoChatBtnClicked:nil]; |
|
} |
|
|
|
-(BOOL)navBarTranslucent { |
|
return YES; |
|
} |
|
|
|
- (void)p_configNavItem { |
|
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; |
|
[button addTarget:self action:@selector(OnSwitchCameraBtnClicked:) forControlEvents:UIControlEventTouchUpInside]; |
|
[button setImage:[UIImage imageNamed:@"video_switch"] forState:UIControlStateNormal]; |
|
[button sizeToFit]; |
|
|
|
UIBarButtonItem *rightItem = [[UIBarButtonItem alloc] initWithCustomView:button]; |
|
self.navigationItem.rightBarButtonItem = rightItem; |
|
} |
|
|
|
#pragma mark - Action Method |
|
- (void) StartVideoChat:(int) userid { |
|
[AnyChatPlatform SetSDKOptionInt:BRAC_SO_LOCALVIDEO_AUTOROTATION :0]; |
|
[AnyChatPlatform SetSDKOptionInt:BRAC_SO_LOCALVIDEO_CLIPMODE :0]; |
|
[AnyChatPlatform SetSDKOptionInt:BRAC_SO_LOCALVIDEO_APPLYPARAM :1]; |
|
|
|
//Get a camera, Must be in the real machine. |
|
NSMutableArray* cameraDeviceArray = [AnyChatPlatform EnumVideoCapture]; |
|
if (cameraDeviceArray.count > 0) { |
|
if(cameraDeviceArray.count >= 2) |
|
[AnyChatPlatform SelectVideoCapture:[cameraDeviceArray objectAtIndex:1]]; |
|
else |
|
[AnyChatPlatform SelectVideoCapture:[cameraDeviceArray objectAtIndex:0]]; |
|
} |
|
|
|
// open local video |
|
[AnyChatPlatform SetSDKOptionInt:BRAC_SO_LOCALVIDEO_OVERLAY :1]; |
|
[AnyChatPlatform UserSpeakControl:-1:YES]; |
|
if (_callType == 0) { |
|
[AnyChatPlatform SetVideoPos:-1 :self :0 :0 :0 :0]; |
|
[AnyChatPlatform UserCameraControl:-1 :YES]; |
|
} |
|
|
|
// request other user video |
|
// 拉伸全屏 |
|
//[self.theUIImageView setContentMode:UIViewContentModeScaleToFill]; |
|
// 裁剪全屏 |
|
//[self.theUIImageView setContentMode:UIViewContentModeScaleAspectFill]; |
|
|
|
[AnyChatPlatform UserSpeakControl:userid :YES]; |
|
|
|
if (_callType == 0) { |
|
[AnyChatPlatform SetVideoPos:userid :self.theUIImageView :0 :0 :0 :0]; |
|
[AnyChatPlatform UserCameraControl:userid :YES]; |
|
} |
|
|
|
self.iRemoteUserId = userid; |
|
|
|
[AnyChatPlatform SetSDKOptionInt:BRAC_SO_LOCALVIDEO_ORIENTATION : (int)[UIApplication sharedApplication].statusBarOrientation]; |
|
|
|
NSLog(@"================userid = %d", userid); |
|
} |
|
|
|
//打开对方的视频 |
|
-(void)openRemoteView { |
|
if (_callType == 0) { |
|
[AnyChatPlatform UserSpeakControl:self.theUserEntity.theEntityRemoteID :YES]; |
|
[AnyChatPlatform UserCameraControl:self.theUserEntity.theEntityRemoteID :YES]; |
|
[AnyChatPlatform SetVideoPos:self.theUserEntity.theEntityRemoteID :self.theUIImageView :0:0:0:0]; |
|
} |
|
} |
|
|
|
- (void) FinishVideoChat { |
|
[AnyChatPlatform UserSpeakControl: -1 :NO]; |
|
if (_callType == 0) { |
|
[AnyChatPlatform UserCameraControl: -1 :NO]; |
|
} |
|
|
|
[AnyChatPlatform UserSpeakControl: self.iRemoteUserId :NO]; |
|
if (_callType == 0) { |
|
[AnyChatPlatform UserCameraControl: self.iRemoteUserId :NO]; |
|
} |
|
|
|
self.iRemoteUserId = -1; |
|
|
|
if (g_isEnterRoom) { |
|
g_isEnterRoom = NO; |
|
[AnyChatPlatform LeaveRoom:-1]; |
|
NSLog(@"=====VideoVC LeaveRoom"); |
|
} |
|
} |
|
|
|
- (IBAction)FinishVideoChatBtnClicked:(id)sender { |
|
//[ACVideoAlertView showAlertViewByTitle:@"是否想要结束当前通话?" clickBlock:^(NSInteger index) { |
|
// if(index == 0) { |
|
[AnyChatPlatform VideoCallControl:BRAC_VIDEOCALL_EVENT_FINISH :self.iRemoteUserId :0 :0 :0 :nil]; |
|
[self FinishVideoChat]; |
|
//[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES]; |
|
[self.navigationController popViewControllerAnimated:YES]; |
|
// } |
|
//}]; |
|
} |
|
|
|
- (IBAction)OnCloseVoiceBtnClicked:(id)sender { |
|
if (self.voiceBtn.selected == NO) { |
|
[AnyChatPlatform UserSpeakControl:-1 :NO]; |
|
self.voiceBtn.selected = YES; |
|
} else { |
|
[AnyChatPlatform UserSpeakControl: -1:YES]; |
|
self.voiceBtn.selected = NO; |
|
} |
|
} |
|
|
|
- (IBAction)OnCloseCameraBtnClicked:(id)sender { |
|
if ([AnyChatPlatform GetCameraState:-1] == 1) { |
|
//open local Camera |
|
[AnyChatPlatform SetVideoPos:-1 :self :0 :0 :0 :0]; |
|
[AnyChatPlatform UserCameraControl:-1 : YES]; |
|
self.theLocalView.hidden = NO; |
|
self.cameraBtn.selected = NO; |
|
} |
|
|
|
if ([AnyChatPlatform GetCameraState:-1] == 2) { |
|
//close local Camera |
|
[AnyChatPlatform UserCameraControl:-1 :NO]; |
|
self.theLocalView.hidden = YES; |
|
self.cameraBtn.selected = YES; |
|
} |
|
} |
|
|
|
- (void) btnSelectedOnClicked:(UIButton*)button { |
|
if (button.selected) { |
|
button.selected = NO; |
|
} else { |
|
button.selected = YES; |
|
} |
|
} |
|
|
|
#pragma mark - Local Video |
|
- (void) OnSwitchCameraBtnClicked:(id)sender { |
|
static int CurrentCameraDevice = 1; |
|
NSMutableArray* cameraDeviceArray = [AnyChatPlatform EnumVideoCapture]; |
|
if(cameraDeviceArray.count == 2) { |
|
CurrentCameraDevice = (CurrentCameraDevice+1) % 2; |
|
[AnyChatPlatform SelectVideoCapture:[cameraDeviceArray objectAtIndex:CurrentCameraDevice]]; |
|
} |
|
|
|
[self btnSelectedOnClicked:sender]; |
|
} |
|
|
|
- (void) OnLocalVideoRelease:(id)sender { |
|
if(self.localVideoSurface) { |
|
self.localVideoSurface = nil; |
|
} |
|
} |
|
|
|
- (void) OnLocalVideoInit:(id)session { |
|
self.localVideoSurface = [AVCaptureVideoPreviewLayer layerWithSession: (AVCaptureSession*)session]; |
|
self.localVideoSurface.frame = CGRectMake(0, 0, kLocalVideo_Width, kLocalVideo_Height); |
|
self.localVideoSurface.videoGravity = AVLayerVideoGravityResizeAspectFill; |
|
[self.theLocalView.layer addSublayer:self.localVideoSurface]; |
|
} |
|
|
|
#pragma mark - 自动旋转 |
|
- (BOOL)shouldAutorotate { |
|
return YES; |
|
} |
|
|
|
//返回直接支持的方向 |
|
- (UIInterfaceOrientationMask)supportedInterfaceOrientations { |
|
return UIInterfaceOrientationMaskAllButUpsideDown; |
|
} |
|
|
|
//返回最优先显示的屏幕方向 |
|
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { |
|
return UIInterfaceOrientationPortrait; |
|
} |
|
|
|
- (void)addDeviceRotateObserver { |
|
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; |
|
[[NSNotificationCenter defaultCenter] addObserver:self |
|
selector:@selector(rotateViews:) |
|
name:UIDeviceOrientationDidChangeNotification |
|
object:nil]; |
|
} |
|
|
|
- (void) removeDeviceRotateObserver { |
|
[[NSNotificationCenter defaultCenter] removeObserver:self |
|
name:UIDeviceOrientationDidChangeNotification |
|
object:nil]; |
|
[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications]; |
|
|
|
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"ANY_CHAT_USER_ENTER_ROOM" object:nil]; |
|
} |
|
|
|
- (void)rotateViews:(NSObject *)sender { |
|
UIDevice* device = [sender valueForKey:@"object"]; |
|
switch (device.orientation) { |
|
case UIDeviceOrientationUnknown: { |
|
break; |
|
} |
|
case UIDeviceOrientationPortrait: { |
|
self.localVideoSurface.transform = kLayer_Z_Axis_3DRotation(0); |
|
self.theUIImageView.layer.transform = kLayer_Z_Axis_3DRotation(0); |
|
break; |
|
} |
|
case UIDeviceOrientationPortraitUpsideDown: { |
|
break; |
|
} |
|
case UIDeviceOrientationLandscapeLeft: { |
|
self.localVideoSurface.transform = kLayer_Z_Axis_3DRotation(-90.0); |
|
self.theUIImageView.layer.transform = kLayer_Z_Axis_3DRotation(-90.0); |
|
break; |
|
} |
|
case UIDeviceOrientationLandscapeRight: { |
|
self.localVideoSurface.transform = kLayer_Z_Axis_3DRotation(90.0); |
|
self.theUIImageView.layer.transform = kLayer_Z_Axis_3DRotation(90.0); |
|
break; |
|
} |
|
case UIDeviceOrientationFaceUp: { |
|
break; |
|
} |
|
case UIDeviceOrientationFaceDown: { |
|
break; |
|
} |
|
} |
|
} |
|
|
|
#pragma mark - UI |
|
- (void)setUIControls { |
|
//Local View line |
|
self.theLocalView.layer.borderColor = [[UIColor whiteColor] CGColor]; |
|
self.theLocalView.layer.borderWidth = 1.0f; |
|
//Rounded corners |
|
self.theLocalView.layer.cornerRadius = 4; |
|
self.theLocalView.layer.masksToBounds = YES; |
|
|
|
[self.theVideoMZTimer start]; |
|
} |
|
|
|
- (void)setTheTimer { |
|
//The Timer Init |
|
self.theVideoMZTimer = [[MZTimerLabel alloc]initWithLabel:self.theVideoTimeLab]; |
|
self.theVideoMZTimer.timeFormat = @"HH:mm:ss"; |
|
[self.theVideoMZTimer start]; |
|
} |
|
|
|
-(void)dealloc { |
|
NSLog(@"销毁了"); |
|
[self FinishVideoChat]; |
|
[self removeDeviceRotateObserver]; |
|
} |
|
|
|
@end
|
|
|