萤石云 iOSSDK,移植跨平台相关工程
Davin
2024-12-18 b4e1288a9b63eb820e9c9489c56aac4bf6b31067
EZSDK/EZSDK/EZ/UIViewControllers/EZLivePlayViewController.m
@@ -24,6 +24,8 @@
#import "MBProgressHUD.h"
#import <EZOpenSDKFramework/EZPMPlayPrivateTokenInfo.h>
#import "HDLEZAlertInputView.h"
#import "HDLEZOPButton.h"
#import "HDLEZVideoDoorToolView.h"
#define MinimumZoomScale 1.0
#define MaximumZoomScale 4.0
@@ -37,6 +39,7 @@
@property (nonatomic) BOOL isOpenSound;
@property (nonatomic) BOOL isPlaying;
@property (nonatomic) BOOL isAnswering;     // 正在接听中
@property (nonatomic, strong) NSTimer *recordTimer;
@property (nonatomic) NSTimeInterval seconds;
@property (nonatomic, strong) CALayer *orangeLayer;
@@ -48,6 +51,9 @@
@property (nonatomic, strong) HIKLoadView *loadingView;
@property (nonatomic, weak) IBOutlet UIButton *playerPlayButton;
@property (nonatomic, weak) IBOutlet UIView *playerView;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *playerViewWHRatio;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *playerViewBottomMargin;
@property (nonatomic, weak) IBOutlet UIView *toolBar;
@property (nonatomic, weak) IBOutlet UIView *bottomView;
@property (nonatomic, weak) IBOutlet UIButton *controlButton;
@@ -55,12 +61,16 @@
@property (nonatomic, weak) IBOutlet UIButton *captureButton;
@property (nonatomic, weak) IBOutlet UIButton *localRecordButton;
@property (nonatomic, weak) IBOutlet UIButton *playButton;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *playBtnLeftMargin;
@property (weak, nonatomic) IBOutlet UIButton *streamPlayBtn;
@property (nonatomic, weak) IBOutlet UIButton *voiceButton;
@property (nonatomic, weak) IBOutlet UIButton *qualityButton;
@property (nonatomic, weak) IBOutlet UIButton *emptyButton;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *emptyBtnLeftMargin;
@property (nonatomic, weak) IBOutlet UIButton *largeButton;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *largeBtnRightMargin;
@property (nonatomic, weak) IBOutlet UIButton *largeBackButton;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *largeBackBtnLeftMargin;
@property (nonatomic, weak) IBOutlet UIView *ptzView;
@property (nonatomic, weak) IBOutlet UIButton *ptzCloseButton;
@property (nonatomic, weak) IBOutlet UIButton *ptzControlButton;
@@ -89,6 +99,7 @@
@property (nonatomic, strong) EZCameraInfo *cameraInfo;
@property (weak, nonatomic) IBOutlet UILabel *streamTypeLabel;
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *scrollViewTopMargin;
@property (weak, nonatomic) IBOutlet UILabel *zoomSizeLabel;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *scrollViewWHRatio; // 滚动视图宽高比
@property (nonatomic, strong) HDLEZButton *unlockButton;//开锁按钮
@@ -96,6 +107,16 @@
@property (nonatomic, copy) NSString *streamToken;
@property (nonatomic, strong) UIView *doorPlayerView;//门锁播放view
@property (nonatomic, assign) CGFloat doorPlayerAspectRatio;   // 门锁播放视图宽高比
// 呼叫视图相关控件
@property (weak, nonatomic) IBOutlet UIView *videoCallOutView;      // 呼叫弹框
@property (weak, nonatomic) IBOutlet UILabel *callOutAlertLabel;    // 提示语言
@property (weak, nonatomic) IBOutlet HDLEZOPButton *hangUpButton;        // 挂断按钮
@property (weak, nonatomic) IBOutlet HDLEZOPButton *ignoreButton;        // 忽略按钮
@property (weak, nonatomic) IBOutlet HDLEZOPButton *answerButton;        // 接听按钮
@property (strong, nonatomic) HDLEZVideoDoorToolView *fullSceneToolView; // 全屏工具视图
@end
@@ -116,6 +137,10 @@
    self.isStartingTalk = NO;
    self.ptzView.hidden = YES;
    self.talkView.hidden = YES;
    self.isAnswering = NO;
    self.videoCallOutView.hidden = YES;
    self.doorPlayerAspectRatio = HDLEZ_APP_SCREEN_WIDTH / HDLEZ_APP_SCREEN_HEIGHT;
    _landscape = NO;
    
    if (!self.deviceInfo) {//如果没有传deviceInfo,需主动获取
        [self getDeviceInfo];
@@ -124,6 +149,7 @@
    
    //初始化相关数据
    [self initialData];
    [self.navigationController.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName:HDLEZHEXCOLOR(0x1B2D4D, 1.),NSFontAttributeName:[UIFont systemFontOfSize:18]}];
    
//    self.talkButton.enabled = self.deviceInfo.isSupportTalk;
//    self.controlButton.enabled = self.deviceInfo.isSupportPTZ;
@@ -258,6 +284,14 @@
    return _doorPlayerView;
}
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    if (self.navigationController) {
        self.navigationController.navigationBar.hidden = NO;
        [self.navigationController setNavigationBarHidden:NO];
    }
}
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    self.navigationController.navigationBar.hidden = NO;//2021-02-01
@@ -271,15 +305,16 @@
    //结束本地录像
    if(self.localRecordButton.selected)
    {
        __weak __typeof(self)weakSelf = self;
        [_player stopLocalRecordExt:^(BOOL ret) {
            
            NSLog(@"%d", ret);
            
            [_recordTimer invalidate];
            _recordTimer = nil;
            self.localRecordLabel.hidden = YES;
            [self saveRecordToPhotosAlbum:_filePath];
            _filePath = nil;
            [weakSelf.recordTimer invalidate];
            weakSelf.recordTimer = nil;
            weakSelf.localRecordLabel.hidden = YES;
            [weakSelf saveRecordToPhotosAlbum:weakSelf.filePath];
            weakSelf.filePath = nil;
        }];
    }
    
@@ -332,6 +367,7 @@
    self.captureButton.enabled = NO;
    self.localRecordButton.enabled = NO;
    self.streamPlayBtn.hidden = YES;
//    self.isShowAlert = YES;
    
    if (_url)
    {
@@ -364,6 +400,7 @@
    }
    if (_cameraInfo.cameraNo == 0 || [self.deviceInfo.deviceType containsString:@"CAS"]) { //不支持清晰度切换
        self.qualityButton.hidden = YES;
        [self.fullSceneToolView supportVideoLevelChange:NO];
    }
    if (self.deviceInfo.cameraInfo.count > 1) {
@@ -379,8 +416,9 @@
    if (!_url)
    {
        //抓图接口演示代码
        __weak __typeof(self)weakSelf = self;
        [EZOPENSDK captureCamera:_cameraInfo.deviceSerial cameraNo:_cameraInfo.cameraNo completion:^(NSString *url, NSError *error) {
            NSLog(@"[%@] capture cameraNo is [%d] url is %@, error is %@", _cameraInfo.deviceSerial, (int)_cameraInfo.cameraNo, url, error);
            NSLog(@"[%@] capture cameraNo is [%d] url is %@, error is %@", weakSelf.cameraInfo.deviceSerial, (int)weakSelf.cameraInfo.cameraNo, url, error);
        }];
    }
#endif
@@ -463,11 +501,41 @@
//        [self.controlButton setImage:[UIImage imageNamed:@"hdl_ez_ic_unlock"] forState:UIControlStateNormal];
//        [self.controlButton setTitle:NSLocalizedString(@"device_open", @"开门") forState:UIControlStateNormal];
    }
    self.callOutAlertLabel.text = HDLEZLocallizedString(@"device_callout_alert_message");
    [self.hangUpButton setTitle:HDLEZLocallizedString(@"device_callout_hang_up") forState:UIControlStateNormal];
    self.hangUpButton.imagePosition = HDLEZOPButtonImagePositionTop;
    self.hangUpButton.spacingBetweenImageAndTitle = 12.;
    [self.ignoreButton setTitle:HDLEZLocallizedString(@"device_callout_ignore") forState:UIControlStateNormal];
    self.ignoreButton.imagePosition = HDLEZOPButtonImagePositionTop;
    self.ignoreButton.spacingBetweenImageAndTitle = 12.;
    [self.answerButton setTitle:HDLEZLocallizedString(@"device_callout_answered") forState:UIControlStateNormal];
    self.answerButton.imagePosition = HDLEZOPButtonImagePositionTop;
    self.answerButton.spacingBetweenImageAndTitle = 12.;
    // 门锁全屏状态下工具栏
    [self.view addSubview:self.fullSceneToolView];
    __weak __typeof(self)weakSelf = self;
    [self.fullSceneToolView ringRingRing:YES];  // 默认显示挂断按钮
    [self.fullSceneToolView configPlayStatus:YES soundOn:YES videoLevel:_cameraInfo.videoLevel toolOperation:^(HDLEZVideoFullSceneOperation operationType) {
        [weakSelf doorLockFullSceneOperation:operationType];
    }];
    // 挂断弹框
    if (_isShowAlert) {
        [self showCallOutAlertView];
    } else {
        [self hiddenCallOutAlertView];
    }
}
/*开锁
 */
-(void)unlockDoor{
    if (![self isSupportOneKeyUnlockDoor]) {    // 不支持一键开锁
        [UIView dd_showMessage:@"该设备不支持一键开锁"];
        return;
    }
    [HDLEZAlertInputView showInputAlertWithtitle:HDLEZLocallizedString(@"device_please_input_door_password") cancleTitle:HDLEZLocallizedString(@"device_temp_cancle") sureTitle:HDLEZLocallizedString(@"device_temp_sure") keyboardType:UIKeyboardTypeASCIICapableNumberPad cancleBlock:^{
        
    } sureBlock:^(NSString * _Nonnull content) {
@@ -535,7 +603,7 @@
//}
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
    if (@available(iOS 16.0, *)) {
        if (_landscape) {
        if (_landscape && !self.isVideoDoorLock) {
            //横屏
            return UIInterfaceOrientationMaskLandscape;
        } else {
@@ -550,6 +618,7 @@
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
                                duration:(NSTimeInterval)duration
{
    if (self.isVideoDoorLock) return;
    self.navigationController.navigationBarHidden = NO;
    self.toolBar.hidden = NO;
    self.largeBackButton.hidden = YES;
@@ -559,12 +628,22 @@
    
    [self.scrollView setTranslatesAutoresizingMaskIntoConstraints:NO];
    [self.toolBar setTranslatesAutoresizingMaskIntoConstraints:NO];
    [NSLayoutConstraint deactivateConstraints:@[self.scrollViewWHRatio]];
    [self.playButton setTranslatesAutoresizingMaskIntoConstraints:NO];
    [self.emptyButton setTranslatesAutoresizingMaskIntoConstraints:NO];
    [self.largeButton setTranslatesAutoresizingMaskIntoConstraints:NO];
//    [self.largeBackButton setTranslatesAutoresizingMaskIntoConstraints:NO];
    [NSLayoutConstraint deactivateConstraints:@[self.scrollViewWHRatio, self.playBtnLeftMargin, self.emptyBtnLeftMargin, self.largeBtnRightMargin]];
    self.scrollViewWHRatio = [NSLayoutConstraint constraintWithItem:self.scrollView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.scrollView attribute:NSLayoutAttributeHeight multiplier:16/9. constant:0];
    [NSLayoutConstraint activateConstraints:@[self.scrollViewWHRatio]];
    self.playBtnLeftMargin = [NSLayoutConstraint constraintWithItem:self.playButton attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.toolBar attribute:NSLayoutAttributeLeading multiplier:1 constant:0];
    self.emptyBtnLeftMargin = [NSLayoutConstraint constraintWithItem:self.emptyButton attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.qualityButton attribute:NSLayoutAttributeTrailing multiplier:1 constant:0];
    self.largeBtnRightMargin = [NSLayoutConstraint constraintWithItem:self.toolBar attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self.largeButton attribute:NSLayoutAttributeTrailing multiplier:1 constant:0];
    [NSLayoutConstraint activateConstraints:@[self.scrollViewWHRatio, self.playBtnLeftMargin, self.emptyBtnLeftMargin, self.largeBtnRightMargin]];
    dispatch_async(dispatch_get_main_queue(), ^{
        [self.scrollView layoutIfNeeded];
        [self.toolBar layoutIfNeeded];
        [self.playButton layoutIfNeeded];
        [self.emptyButton layoutIfNeeded];
        [self.largeButton layoutIfNeeded];
    });
    
    if(toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft ||
@@ -572,23 +651,32 @@
    {
        self.navigationController.navigationBarHidden = YES;
        self.localRecrodContraint.constant = 50;
        self.toolBar.hidden = YES;
//        self.toolBar.hidden = YES;
        self.largeTitleLabel.hidden = NO;
        self.largeBackButton.hidden = NO;
        self.bottomView.hidden = YES;
        
        CGFloat tureScreenW = HDLEZ_APP_SCREEN_WIDTH > HDLEZ_APP_SCREEN_HEIGHT ? HDLEZ_APP_SCREEN_HEIGHT : HDLEZ_APP_SCREEN_WIDTH;
        CGFloat tureScreenH = HDLEZ_APP_SCREEN_WIDTH < HDLEZ_APP_SCREEN_HEIGHT ? HDLEZ_APP_SCREEN_HEIGHT : HDLEZ_APP_SCREEN_WIDTH;
        CGFloat marginSpace = 64;
        
        [self.scrollView setTranslatesAutoresizingMaskIntoConstraints:NO];
        [self.toolBar setTranslatesAutoresizingMaskIntoConstraints:NO];
        [NSLayoutConstraint deactivateConstraints:@[self.scrollViewWHRatio]];
        self.scrollViewWHRatio = [NSLayoutConstraint constraintWithItem:self.scrollView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.scrollView attribute:NSLayoutAttributeHeight multiplier:tureScreenH/tureScreenW constant:0];
        [NSLayoutConstraint activateConstraints:@[self.scrollViewWHRatio]];
        [self.playButton setTranslatesAutoresizingMaskIntoConstraints:NO];
        [self.emptyButton setTranslatesAutoresizingMaskIntoConstraints:NO];
        [self.largeButton setTranslatesAutoresizingMaskIntoConstraints:NO];
        [NSLayoutConstraint deactivateConstraints:@[self.scrollViewWHRatio, self.playBtnLeftMargin, self.emptyBtnLeftMargin, self.largeBtnRightMargin]];
        self.scrollViewWHRatio = [NSLayoutConstraint constraintWithItem:self.scrollView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.scrollView attribute:NSLayoutAttributeHeight multiplier:tureScreenH/(tureScreenW - 37) constant:0];
        self.playBtnLeftMargin = [NSLayoutConstraint constraintWithItem:self.playButton attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.toolBar attribute:NSLayoutAttributeLeading multiplier:1 constant:marginSpace];
        self.emptyBtnLeftMargin = [NSLayoutConstraint constraintWithItem:self.emptyButton attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.qualityButton attribute:NSLayoutAttributeTrailing multiplier:1 constant:(tureScreenH - tureScreenW - 2 * marginSpace)];
        self.largeBtnRightMargin = [NSLayoutConstraint constraintWithItem:self.toolBar attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self.largeButton attribute:NSLayoutAttributeTrailing multiplier:1 constant:marginSpace];
        [NSLayoutConstraint activateConstraints:@[self.scrollViewWHRatio, self.playBtnLeftMargin, self.emptyBtnLeftMargin, self.largeBtnRightMargin]];
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.scrollView layoutIfNeeded];
            [self.toolBar layoutIfNeeded];
            [self.playButton layoutIfNeeded];
            [self.emptyButton layoutIfNeeded];
            [self.largeButton layoutIfNeeded];
        });
    }
}
@@ -653,12 +741,13 @@
 *  @param width  宽度
 */
- (void)player:(EZPlayer *)player didReceivedDisplayHeight:(NSInteger)height displayWidth:(NSInteger)width{
//    HDLEZLog(@"画面长:%ld,宽:%ld",(long)height,(long)width);
    NSLog(@"画面长:%ld,宽:%ld",(long)height,(long)width);
    CGFloat playerVH=self.playerView.frame.size.height;
//    HDLEZLog(@"高:%ld",(long)playerVH);
    CGFloat ratio=((CGFloat)width)/((CGFloat)height);
//    HDLEZLog(@"比例:%f",ratio);
    CGFloat playerVW=playerVH*ratio;
    NSLog(@"比例:%f",ratio);
//    CGFloat playerVW=playerVH*ratio;
    self.doorPlayerAspectRatio = ratio;
//    HDLEZLog(@"宽:%ld",(long)playerVW);
    [self.doorPlayerView mas_updateConstraints:^(MASConstraintMaker *make) {
        make.width.mas_equalTo(_doorPlayerView.mas_height).multipliedBy(ratio);
@@ -794,7 +883,11 @@
    self.streamToken=tokenInfo.token;
    
    if (!_unlockButton.isEnabled) {
        [_unlockButton setImage:[UIImage imageNamed:@"hdl_ez_ic_unlock"] forState:UIControlStateNormal];
        if ([self isSupportOneKeyUnlockDoor]) {    // 支持一键开锁
            [_unlockButton setImage:[UIImage imageNamed:@"hdl_ez_ic_unlock"] forState:UIControlStateNormal];
        } else {
            [_unlockButton setImage:[UIImage imageNamed:@"hdl_ez_ic_unlock_disable"] forState:UIControlStateNormal];
        }
        _unlockButton.enabled=YES;
    }
}
@@ -858,9 +951,42 @@
- (IBAction)large:(id)sender
{
    NSLog(@"######进入横屏!");
    if (!self.isPlaying)return; // 未播放禁止全屏,
    self.videoCallOutView.hidden = YES;
    if (_landscape == YES) {
        [self largeBack:self.largeBackButton];
        return;
    }
    _landscape = YES;
    if (self.isVideoDoorLock) {
        self.navigationController.navigationBarHidden = YES;
        self.localRecrodContraint.constant = 50;
        self.toolBar.hidden = YES;
        self.largeTitleLabel.hidden = YES;
        self.largeBackButton.hidden = YES;
        self.bottomView.hidden = YES;
        self.scrollView.backgroundColor = [UIColor blackColor];
        [self.scrollView setTranslatesAutoresizingMaskIntoConstraints:NO];
        [self.playerView setTranslatesAutoresizingMaskIntoConstraints:NO];
        [NSLayoutConstraint deactivateConstraints:@[self.scrollViewTopMargin, self.scrollViewWHRatio, self.playerViewWHRatio, self.playerViewBottomMargin]];
        self.scrollViewTopMargin = [NSLayoutConstraint constraintWithItem:self.scrollView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.topLayoutGuide attribute:NSLayoutAttributeBottom multiplier:1.0 constant:-[self hdlEZStatusBarHeight]];
        self.scrollViewWHRatio = [NSLayoutConstraint constraintWithItem:self.scrollView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.scrollView attribute:NSLayoutAttributeHeight multiplier:HDLEZ_APP_SCREEN_WIDTH/HDLEZ_APP_SCREEN_HEIGHT constant:0];
        self.playerViewWHRatio = [NSLayoutConstraint constraintWithItem:self.playerView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.playerView attribute:NSLayoutAttributeHeight multiplier:self.doorPlayerAspectRatio constant:0];
        CGFloat playerBottomMargin = HDLEZ_APP_SCREEN_HEIGHT - (HDLEZ_APP_SCREEN_WIDTH / self.doorPlayerAspectRatio);
        NSLog(@"########播放间隙:%lf", playerBottomMargin);
        self.playerViewBottomMargin = [NSLayoutConstraint constraintWithItem:self.scrollView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.playerView attribute:NSLayoutAttributeBottom multiplier:1.0 constant:playerBottomMargin];
        [NSLayoutConstraint activateConstraints:@[self.scrollViewTopMargin, self.scrollViewWHRatio, self.playerViewWHRatio, self.playerViewBottomMargin]];
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.scrollView layoutIfNeeded];
            [self.playerView layoutIfNeeded];
        });
        self.fullSceneToolView.hidden = NO;
        [self.view bringSubviewToFront:self.fullSceneToolView];
        return;
    }
    if (@available(iOS 16.0, *)) {
        _landscape = YES;
        if (self.navigationController) {
            dispatch_async(dispatch_get_main_queue(), ^{
                [self.navigationController setNeedsUpdateOfSupportedInterfaceOrientations];
@@ -881,13 +1007,42 @@
        NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationLandscapeLeft];
        [[UIDevice currentDevice] setValue:value forKey:@"orientation"];
    }
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.25 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [self.largeButton setImage:[UIImage imageNamed:@"preview_enlarge_full"] forState:UIControlStateNormal];
        [self.largeButton setImage:[UIImage imageNamed:@"preview_enlarge_full_btn_sel"] forState:UIControlStateHighlighted];
    });
}
- (IBAction)largeBack:(id)sender
{
    NSLog(@"######收回横屏!");
    _landscape = NO;
    if (self.isVideoDoorLock) {
        self.navigationController.navigationBarHidden = NO;
        self.toolBar.hidden = NO;
        self.largeBackButton.hidden = YES;
        self.bottomView.hidden = NO;
        self.largeTitleLabel.hidden = YES;
        self.localRecrodContraint.constant = 10;
        self.videoCallOutView.hidden = !self.isShowAlert;
        self.scrollView.backgroundColor = [UIColor clearColor];
        [self.scrollView setTranslatesAutoresizingMaskIntoConstraints:NO];
        [self.playerView setTranslatesAutoresizingMaskIntoConstraints:NO];
        [NSLayoutConstraint deactivateConstraints:@[self.scrollViewTopMargin,self.scrollViewWHRatio, self.playerViewWHRatio, self.playerViewBottomMargin]];
        self.scrollViewTopMargin = [NSLayoutConstraint constraintWithItem:self.scrollView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.topLayoutGuide attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0];
        self.scrollViewWHRatio = [NSLayoutConstraint constraintWithItem:self.scrollView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.scrollView attribute:NSLayoutAttributeHeight multiplier:16/9. constant:0];
        self.playerViewWHRatio = [NSLayoutConstraint constraintWithItem:self.playerView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.playerView attribute:NSLayoutAttributeHeight multiplier:16/9. constant:0];
        self.playerViewBottomMargin = [NSLayoutConstraint constraintWithItem:self.scrollView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.playerView attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0];
        [NSLayoutConstraint activateConstraints:@[self.scrollViewTopMargin,self.scrollViewWHRatio, self.playerViewWHRatio, self.playerViewBottomMargin]];
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.scrollView layoutIfNeeded];
            [self.playerView layoutIfNeeded];
        });
        self.fullSceneToolView.hidden = YES;
        return;
    }
    if (@available(iOS 16.0, *)) {
        _landscape = NO;
        if (self.navigationController) {
            dispatch_async(dispatch_get_main_queue(), ^{
                [self.navigationController setNeedsUpdateOfSupportedInterfaceOrientations];
@@ -908,6 +1063,10 @@
        NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationPortrait];
        [[UIDevice currentDevice] setValue:value forKey:@"orientation"];
    }
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.25 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [self.largeButton setImage:[UIImage imageNamed:@"preview_enlarge"] forState:UIControlStateNormal];
        [self.largeButton setImage:[UIImage imageNamed:@"preview_enlarge_btn_sel"] forState:UIControlStateHighlighted];
    });
}
- (IBAction)capture:(id)sender
@@ -973,6 +1132,7 @@
        [self.voiceButton setImage:[UIImage imageNamed:@"preview_voice_btn"] forState:UIControlStateNormal];
    }
    _isOpenSound = !_isOpenSound;
    [self.fullSceneToolView soundOn:_isOpenSound];
}
- (IBAction)playButtonClicked:(id)sender
@@ -1001,6 +1161,11 @@
        [self.loadingView startSquareClcokwiseAnimation];
    }
    _isPlaying = !_isPlaying;
    [self.fullSceneToolView playStatus:_isPlaying];
}
- (SEL)extracted {
    return @selector(hideQualityView);
}
- (IBAction)qualityButtonClicked:(id)sender
@@ -1013,7 +1178,7 @@
    {
        self.qualityView.hidden = NO;
        //停留5s以后隐藏视频质量View.
        [self performSelector:@selector(hideQualityView) withObject:nil afterDelay:5.0f];
        [self performSelector:[self extracted] withObject:nil afterDelay:5.0f];
    }
    self.qualityButton.selected = !self.qualityButton.selected;
}
@@ -1066,14 +1231,17 @@
                      if (sender == weakSelf.highButton)
                      {
                          [weakSelf.qualityButton setTitle:NSLocalizedString(@"device_quality_high", @"高清") forState:UIControlStateNormal];
                          [self.fullSceneToolView videoLevel:2];
                      }
                      else if (sender == weakSelf.middleButton)
                      {
                          [weakSelf.qualityButton setTitle:NSLocalizedString(@"device_quality_median", @"均衡") forState:UIControlStateNormal];
                          [self.fullSceneToolView videoLevel:1];
                      }
                      else
                      {
                          [weakSelf.qualityButton setTitle:NSLocalizedString(@"device_quality_low", @"流畅") forState:UIControlStateNormal];
                          [self.fullSceneToolView videoLevel:0];
                      }
                      if (result)
                      {
@@ -1193,6 +1361,7 @@
                         self.speakImageView.alpha = 0;
                         self.talkView.hidden = YES;
                     }];
    self.isAnswering = NO;
}
- (IBAction)localButtonClicked:(id)sender
@@ -1200,15 +1369,16 @@
    //结束本地录像
    if(self.localRecordButton.selected)
    {
        __weak __typeof(self)weakSelf = self;
        [_player stopLocalRecordExt:^(BOOL ret) {
            
            NSLog(@"%d", ret);
            
            [_recordTimer invalidate];
            _recordTimer = nil;
            self.localRecordLabel.hidden = YES;
            [self saveRecordToPhotosAlbum:_filePath];
            _filePath = nil;
            [weakSelf.recordTimer invalidate];
            weakSelf.recordTimer = nil;
            weakSelf.localRecordLabel.hidden = YES;
            [weakSelf saveRecordToPhotosAlbum:weakSelf.filePath];
            weakSelf.filePath = nil;
        }];
    }
    else
@@ -1285,6 +1455,47 @@
        [self.talkPlayer audioTalkPressed:NO];
    }
    _isPressed = !_isPressed;
}
- (IBAction)clickCalloutHangupAction:(id)sender {
    self.isShowAlert = NO;
    [self closeTalkView:self.talkCloseButton];
    if (self.msgId && self.msgId.length > 0) {
        [[EZHttpUtil sharedManager] updateAnswerStatusWithMsgId:self.msgId answerStatus:@"no_answer" completion:^(ResponseData * _Nonnull responseData) {
            HDLEZLog(@"###########挂断####:%@", [responseData yy_modelToJSONString]);
        }];
    }
    [self.navigationController popViewControllerAnimated:YES];
}
- (IBAction)clickCalloutIgnoreAction:(id)sender {
//    [UIView dd_showMessage:@"忽略开发中..."];
    self.isShowAlert = NO;
    self.isAnswering = NO;
    [self.navigationController popViewControllerAnimated:YES];
}
- (IBAction)clickCalloutAnswerAction:(id)sender {
    self.isShowAlert = NO;
    self.isAnswering = YES;
    [self talkButtonClicked:self.talkButton];
    if (self.msgId && self.msgId.length > 0) {
        [[EZHttpUtil sharedManager] updateAnswerStatusWithMsgId:self.msgId answerStatus:@"answer" completion:^(ResponseData * _Nonnull responseData) {
            HDLEZLog(@"###########接听####:%@", [responseData yy_modelToJSONString]);
        }];
    }
}
#pragma mark - Publish Methods
/// 展示呼叫弹框
- (void)showCallOutAlertView {
    self.videoCallOutView.hidden = NO;
}
/// 隐藏呼叫弹框
- (void)hiddenCallOutAlertView {
    self.videoCallOutView.hidden = YES;
}
#pragma mark - Private Methods
@@ -1405,19 +1616,43 @@
            [view removeFromSuperview];
        }
    }
    CGFloat averageWidth = [UIScreen mainScreen].bounds.size.width/5.0;
    UIImageView *lineImageView1 = [UIView dd_instanceVerticalLine:20 color:[UIColor grayColor]];
    lineImageView1.frame = CGRectMake(averageWidth, 7, lineImageView1.frame.size.width, lineImageView1.frame.size.height);
//    CGFloat averageWidth = [UIScreen mainScreen].bounds.size.width/5.0;
    UIImageView *lineImageView1 = [UIView dd_instanceVerticalLine:20 color:HDLEZHEXCOLOR(0xFFFFFF, 0.16)];
//    lineImageView1.frame = CGRectMake(averageWidth, 7, lineImageView1.frame.size.width, lineImageView1.frame.size.height);
    [self.toolBar addSubview:lineImageView1];
    UIImageView *lineImageView2 = [UIView dd_instanceVerticalLine:20 color:[UIColor grayColor]];
    lineImageView2.frame = CGRectMake(averageWidth * 2, 7, lineImageView2.frame.size.width, lineImageView2.frame.size.height);
    [lineImageView1 mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.mas_equalTo(self.playButton.mas_right);
        make.centerY.mas_equalTo(self.playButton.mas_centerY);
        make.width.mas_equalTo(lineImageView1.frame.size.width);
        make.height.mas_equalTo(lineImageView1.frame.size.height);
    }];
    UIImageView *lineImageView2 = [UIView dd_instanceVerticalLine:20 color:HDLEZHEXCOLOR(0xFFFFFF, 0.16)];
//    lineImageView2.frame = CGRectMake(averageWidth * 2, 7, lineImageView2.frame.size.width, lineImageView2.frame.size.height);
    [self.toolBar addSubview:lineImageView2];
    UIImageView *lineImageView3 = [UIView dd_instanceVerticalLine:20 color:[UIColor grayColor]];
    lineImageView3.frame = CGRectMake(averageWidth * 3, 7, lineImageView3.frame.size.width, lineImageView3.frame.size.height);
    [lineImageView2 mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.mas_equalTo(self.voiceButton.mas_right);
        make.centerY.mas_equalTo(self.voiceButton.mas_centerY);
        make.width.mas_equalTo(lineImageView2.frame.size.width);
        make.height.mas_equalTo(lineImageView2.frame.size.height);
    }];
    UIImageView *lineImageView3 = [UIView dd_instanceVerticalLine:20 color:HDLEZHEXCOLOR(0xFFFFFF, 0.16)];
//    lineImageView3.frame = CGRectMake(averageWidth * 3, 7, lineImageView3.frame.size.width, lineImageView3.frame.size.height);
    [self.toolBar addSubview:lineImageView3];
    UIImageView *lineImageView4 = [UIView dd_instanceVerticalLine:20 color:[UIColor grayColor]];
    lineImageView4.frame = CGRectMake(averageWidth * 4, 7, lineImageView4.frame.size.width, lineImageView4.frame.size.height);
    [lineImageView3 mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.mas_equalTo(self.qualityButton.mas_right);
        make.centerY.mas_equalTo(self.qualityButton.mas_centerY);
        make.width.mas_equalTo(lineImageView3.frame.size.width);
        make.height.mas_equalTo(lineImageView3.frame.size.height);
    }];
    UIImageView *lineImageView4 = [UIView dd_instanceVerticalLine:20 color:HDLEZHEXCOLOR(0xFFFFFF, 0.16)];
//    lineImageView4.frame = CGRectMake(averageWidth * 4, 7, lineImageView4.frame.size.width, lineImageView4.frame.size.height);
    [self.toolBar addSubview:lineImageView4];
    [lineImageView4 mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.mas_equalTo(self.emptyButton.mas_right);
        make.centerY.mas_equalTo(self.emptyButton.mas_centerY);
        make.width.mas_equalTo(lineImageView4.frame.size.width);
        make.height.mas_equalTo(lineImageView4.frame.size.height);
    }];
}
@@ -1518,5 +1753,100 @@
    }
}
#pragma mark - PrivateMethod (门锁全屏时的一系列操作)
- (void)doorLockFullSceneOperation:(HDLEZVideoFullSceneOperation)operation {
    switch (operation) {
        case HDLEZVideoFullSceneOperationOfHangUp: {    // 挂断
            [self largeBack:self.largeButton];
            [self closeTalkView:self.talkCloseButton];
            [self hiddenCallOutAlertView];
            [self.navigationController popViewControllerAnimated:YES];
        }
            break;
        case HDLEZVideoFullSceneOperationOfPlay: {  // 播放
            [self playButtonClicked:self.playButton];
        }
            break;
        case HDLEZVideoFullSceneOperationOfPause: { // 暂停
            [self playButtonClicked:self.playButton];
        }
            break;
        case HDLEZVideoFullSceneOperationOfSound: { // 开启音量
            [self voiceButtonClicked:self.voiceButton];
        }
            break;
        case HDLEZVideoFullSceneOperationOfSoundOff: {  // 静音
            [self voiceButtonClicked:self.voiceButton];
        }
            break;
        case HDLEZVideoFullSceneOperationOfSmooth: {    // 流畅
            [self qualitySelectedClicked:self.lowButton];
        }
            break;
        case HDLEZVideoFullSceneOperationOfBalance: {   // 均衡
            [self qualitySelectedClicked:self.middleButton];
        }
            break;
        case HDLEZVideoFullSceneOperationOfHDFull: {    // 高清
            [self qualitySelectedClicked:self.highButton];
        }
            break;
        case HDLEZVideoFullSceneOperationOfExitFull: {  // 退出全屏
            [self largeBack:self.largeButton];
        }
            break;
        default:
            break;
    }
}
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    if (!self.fullSceneToolView.hidden) {
        [self.fullSceneToolView qualityStatusChanged:YES];
    }
}
#pragma Setter
- (void)setIsShowAlert:(BOOL)isShowAlert {
    _isShowAlert = isShowAlert;
    if (_isShowAlert) {
        [self showCallOutAlertView];
    } else {
        [self hiddenCallOutAlertView];
    }
}
#pragma mark - Getter
- (HDLEZVideoDoorToolView *)fullSceneToolView {
    if (!_fullSceneToolView) {
        _fullSceneToolView = [[HDLEZVideoDoorToolView alloc] initWithFrame:CGRectMake(0, HDLEZ_APP_SCREEN_HEIGHT - 280, HDLEZ_APP_SCREEN_WIDTH, 280)];
        _fullSceneToolView.hidden = YES;
    }
    return _fullSceneToolView;
}
- (BOOL)prefersHomeIndicatorAutoHidden {
    return YES;
}
- (CGFloat)hdlEZStatusBarHeight {
    if (@available(iOS 13.0, *)) {
        NSSet *set = [UIApplication sharedApplication].connectedScenes;
        UIWindowScene *windowScene = [set anyObject];
        UIStatusBarManager *statusBarManager = windowScene.statusBarManager;
        return statusBarManager.statusBarFrame.size.height;
    } else {
        return [UIApplication sharedApplication].statusBarFrame.size.height;
    }
}
/// 是否支持一键开锁
- (BOOL)isSupportOneKeyUnlockDoor {
    BOOL isSupport = YES;
    if (self.deviceInfo && self.deviceInfo.deviceType && ([self.deviceInfo.deviceType containsString:@"LT20VC"] || [self.deviceInfo.deviceType containsString:@"LT20VC"])) {
        isSupport = NO;
    }
    return isSupport;
}
@end