萤石云 iOSSDK,移植跨平台相关工程
Davin
2023-07-27 48c5a2c66c549d26fecadc6d2dad1924fdd1cc8b
EZSDK/EZSDK/EZ/UIViewControllers/EZPlaybackViewController.m
@@ -10,27 +10,28 @@
#import "UIViewController+EZBackPop.h"
#import "DDCollectionViewFlowLayout.h"
#import "MJRefresh.h"
#import "EZRecordDownloader.h"
#import "EZDeviceRecordDownloadTask.h"
#import "EZCloudRecordDownloadTask.h"
#import <EZOpenSDKFramework/EZRecordDownloader.h>
#import <EZOpenSDKFramework/EZDeviceRecordDownloadTask.h>
#import <EZOpenSDKFramework/EZCloudRecordDownloadTask.h>
#import "EZRecordCell.h"
#import "DDKit.h"
#import "EZCloudRecordFile.h"
#import "EZDeviceRecordFile.h"
#import "EZPlayer.h"
#import <EZOpenSDKFramework/EZCloudRecordFile.h>
#import <EZOpenSDKFramework/EZDeviceRecordFile.h>
#import <EZOpenSDKFramework/EZPlayer.h>
#import "HIKLoadView.h"
#import "Masonry.h"
#import "EZCameraInfo.h"
#import <EZOpenSDKFramework/EZCameraInfo.h>
#import "MBProgressHUD.h"
#import "Toast+UIView.h"
#import "EZCustomTableView.h"
#import "EZStreamPlayer.h"
#import <EZOpenSDKFramework/EZStreamPlayer.h>
@interface EZPlaybackViewController ()<DDCollectionViewDelegateFlowLayout, UICollectionViewDataSource,EZPlayerDelegate, UIAlertViewDelegate, EZRecordCellDelegate, EZCustomTableViewDelegate,EZStreamPlayerDelegate>
{
    BOOL _isOpenSound;
    BOOL _isPlaying;
    BOOL _landscape;    // 是否旋转
    
    NSTimeInterval _playSeconds; //播放秒数
    NSTimeInterval _duringSeconds; //录像时长
@@ -44,8 +45,8 @@
    NSArray *sdCardRate;
    NSArray *cloudRateStr;
    NSArray *sdCardRateStr;
//    BOOL _isDoBack;
    //    BOOL _isDoBack;
}
@property (nonatomic, strong) NSIndexPath *selectedIndexPath;
@@ -57,6 +58,7 @@
@property (nonatomic, strong) HIKLoadView *loadingView;
@property (nonatomic) BOOL isSelectedDevice;
@property (nonatomic, weak) IBOutlet UIView *playerView;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *playViewWHScale;
@property (nonatomic, weak) IBOutlet UILabel *largeTitleLabel;
@property (nonatomic, weak) IBOutlet UIDatePicker *datePicker;
@property (nonatomic, weak) IBOutlet UITextField *dateTextField;
@@ -102,12 +104,20 @@
    [EZOPENSDK releasePlayer:_player];
}
- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    self.navigationController.navigationBar.hidden = NO;//2021-02-01
}
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.isAutorotate = YES;
    self.largeTitleLabel.text = self.deviceInfo.deviceName;
    self.largeTitleLabel.hidden = YES;
    _landscape = NO;
    
    if(!_records)
        _records = [NSMutableArray new];
@@ -154,7 +164,7 @@
    
    [self.duringSlider setThumbImage:[UIImage imageNamed:@"slider"] forState:UIControlStateNormal];
    [self.duringSlider setThumbImage:[UIImage imageNamed:@"slider_sel"] forState:UIControlStateHighlighted];
    self.cloudButton.selected = YES;
    self.largeBackButton.hidden = YES;
    
@@ -166,7 +176,7 @@
    [self.dateButton setTitle:[dateFormatter stringFromDate:self.datePicker.date] forState:UIControlStateNormal];
    dateFormatter.dateFormat = @"MM-dd △";
    [self.dateButton setTitle:[dateFormatter stringFromDate:self.datePicker.date] forState:UIControlStateSelected];
    _isShowToolbox = YES;
    
    cloudRate = @[@(EZOPENSDK_PLAY_RATE_1),
@@ -183,6 +193,11 @@
    
    cloudRateStr = @[@"x1",@"x4",@"x8",@"x16",@"x32"];
    sdCardRateStr = @[@"x1",@"x4",@"x8",@"x16"];
    //2021-07-21 隐藏streamPlayBtn和rateBtn
    [self.streamPlayBtn setHidden:YES];
    [self.rateBtn setHidden:YES];
}
- (void)viewWillDisappear:(BOOL)animated {
@@ -204,18 +219,28 @@
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
*/
 #pragma mark - Navigation
 // In a storyboard-based application, you will often want to do a little preparation before navigation
 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
 // Get the new view controller using [segue destinationViewController].
 // Pass the selected object to the new view controller.
 }
 */
- (UIInterfaceOrientationMask)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskAllButUpsideDown;
    if (@available(iOS 16.0, *)) {
        if (_landscape) {
            //横屏
            return UIInterfaceOrientationMaskLandscape;
        } else {
            //竖屏
            return UIInterfaceOrientationMaskPortrait;
        }
    } else {
        return UIInterfaceOrientationMaskAllButUpsideDown;
    }
}
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
@@ -230,6 +255,13 @@
    self.largeButton.hidden = NO;
    self.voiceButton.hidden = NO;
    self.playButton.hidden = NO;
    [self.playerView setTranslatesAutoresizingMaskIntoConstraints:NO];
    [NSLayoutConstraint deactivateConstraints:@[self.playViewWHScale]];
    self.playViewWHScale = [NSLayoutConstraint constraintWithItem:self.playerView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.playerView attribute:NSLayoutAttributeHeight multiplier:16/9. constant:0];
    [NSLayoutConstraint activateConstraints:@[self.playViewWHScale]];
    dispatch_async(dispatch_get_main_queue(), ^{
        [self.playerView layoutIfNeeded];
    });
    if(toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft ||
       toInterfaceOrientation == UIInterfaceOrientationLandscapeRight)
    {
@@ -242,6 +274,18 @@
        self.playbackList.hidden = YES;
        self.largeBackButton.hidden = NO;
        self.navigationController.navigationBarHidden = 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;
        [self.playerView setTranslatesAutoresizingMaskIntoConstraints:NO];
        [NSLayoutConstraint deactivateConstraints:@[self.playViewWHScale]];
        self.playViewWHScale = [NSLayoutConstraint constraintWithItem:self.playerView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.playerView attribute:NSLayoutAttributeHeight multiplier:tureScreenH/(tureScreenW) constant:0];
        [NSLayoutConstraint activateConstraints:@[self.playViewWHScale]];
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.playerView layoutIfNeeded];
        });
    }
}
@@ -288,6 +332,8 @@
    cell.deviceSerial = _cameraInfo.deviceSerial;
    cell.isSelectedDevice = _isSelectedDevice;
    cell.delegate = self;
    //2021-07-21 隐藏下载按钮
    [cell.downloadBtn setHidden:YES];
    
    if(_isSelectedDevice)
    {
@@ -316,7 +362,7 @@
        
        [self invalidateTimer];
        
//        [_player stopPlayback];
        //        [_player stopPlayback];
        
        if(_isSelectedDevice)
        {
@@ -341,7 +387,7 @@
#pragma mark - ValidateCode Methods
- (void)repeatDelay{
    self.selectedCell = NO;
}
@@ -399,7 +445,7 @@
                                           verifyCode:self.verifyCode
                                             savePath:path
                                           completion:^(EZDeviceRecordDownloadTask * _Nonnull task) {
        //设置回调函数
        __weak typeof(task) weakTask = task;
        [task setDownloadCallBackWithFinshed:^(EZRecordDownloaderStatus statusCode) {
@@ -559,7 +605,7 @@
        
        NSLog(@"GetStreamFetchType:%d", [self.player getStreamFetchType]);
        
//        [self showStreamFetchType];
        //        [self showStreamFetchType];
    }
    else if (messageCode == PLAYER_PLAYBACK_STOP)
    {
@@ -578,7 +624,7 @@
}
- (void) invalidateTimer {
    if(self.playbackTimer)
    {
        [self.playbackTimer invalidate];
@@ -604,13 +650,13 @@
- (IBAction)hiddenPlayerToolbox:(id)sender
{
//    [UIView animateWithDuration:0.3
//                     animations:^{
//                         self.playerToolbox.alpha = 0.0f;
//                     }
//                     completion:^(BOOL finished) {
//                         _isShowToolbox = NO;
//                     }];
    //    [UIView animateWithDuration:0.3
    //                     animations:^{
    //                         self.playerToolbox.alpha = 0.0f;
    //                     }
    //                     completion:^(BOOL finished) {
    //                         _isShowToolbox = NO;
    //                     }];
}
#pragma mark - MJRefresh Methods
@@ -620,7 +666,7 @@
    [self.operation cancel];
    [self.playbackList.header endRefreshing];
    __weak __typeof(self) weakSelf = self;
    self.playbackList.header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
        weakSelf.noVideoImageView.hidden = YES;
        weakSelf.noVideoLabel.hidden = YES;
@@ -630,34 +676,35 @@
                                                             beginTime:weakSelf.beginTime
                                                               endTime:weakSelf.endTime
                                                            completion:^(NSArray *deviceRecords, NSError *error) {
                                                                NSLog(@"deviceRecords is %@, error is %@", deviceRecords, error);
                                                                if (!error)
                                                                {
                                                                    [weakSelf.records removeAllObjects];
                                                                    if(deviceRecords.count == 0)
                                                                    {
                                                                        weakSelf.noVideoLabel.hidden = NO;
                                                                        weakSelf.noVideoImageView.hidden = NO;
                                                                        [weakSelf.playbackList reloadData];
                                                                        [weakSelf.playbackList.header endRefreshing];
                                                                        return;
                                                                    }
                                                                    if (deviceRecords.count > 0)
                                                                    {
                                                                        [weakSelf.records addObjectsFromArray:deviceRecords];
                                                                        [weakSelf.playbackList reloadData];
                                                                        [weakSelf.playbackList.header endRefreshing];
                                                                        [weakSelf doPlayback];
                                                                    }
                                                                }
                                                                else
                                                                {
                                                                    [UIView dd_showMessage:[NSString stringWithFormat:@"error code is %d",(int) error.code] onParentView:self.view];
                                                                    [weakSelf.playbackList.header endRefreshing];
                                                                    [weakSelf.records removeAllObjects];
                                                                    [weakSelf.playbackList reloadData];
                                                                }
                                                            }];
                NSLog(@"deviceRecords is %@, error is %@", deviceRecords, error);
                if (!error)
                {
                    [weakSelf.records removeAllObjects];
                    if(deviceRecords.count == 0)
                    {
                        weakSelf.noVideoLabel.hidden = NO;
                        weakSelf.noVideoImageView.hidden = NO;
                        [weakSelf.playbackList reloadData];
                        [weakSelf.playbackList.header endRefreshing];
                        return;
                    }
                    if (deviceRecords.count > 0)
                    {
                        [weakSelf.records addObjectsFromArray:deviceRecords];
                        [weakSelf.playbackList reloadData];
                        [weakSelf.playbackList.header endRefreshing];
                        [weakSelf doPlayback];
                    }
                }
                else
                {
                    NSString *mes = [NSString stringWithFormat:@"%@(%ld)",NSLocalizedString(@"setting_opration_fail", @"操作失败"), (long)error.code];
                    [UIView dd_showMessage:mes onParentView:self.view];
                    [weakSelf.playbackList.header endRefreshing];
                    [weakSelf.records removeAllObjects];
                    [weakSelf.playbackList reloadData];
                }
            }];
        }
        else
        {
@@ -666,36 +713,38 @@
                                                             beginTime:weakSelf.beginTime
                                                               endTime:weakSelf.endTime
                                                            completion:^(NSArray *cloudRecords, NSError *error) {
                                                                NSLog(@"cloudRecords is %@, error is %@", cloudRecords, error);
                                                                if (error)
                                                                {
                                                                    if (error.code > 0) {
                                                                        [UIView dd_showMessage:[NSString stringWithFormat:@"error code is %d",(int) error.code] onParentView:self.view];
                                                                    }
                                                                    [weakSelf.playbackList.header endRefreshing];
                                                                    [weakSelf.records removeAllObjects];
                                                                    [weakSelf.playbackList reloadData];
                                                                    return ;
                                                                }
                                                                [weakSelf.records removeAllObjects];
                                                                if(cloudRecords.count == 0)
                                                                {
                                                                    weakSelf.noVideoLabel.hidden = NO;
                                                                    weakSelf.noVideoImageView.hidden = NO;
                                                                    [weakSelf.playbackList reloadData];
                                                                    [weakSelf.playbackList.header endRefreshing];
                                                                    return;
                                                                }
                                                                if (cloudRecords.count > 0)
                                                                {
                                                                    [weakSelf.records addObjectsFromArray:cloudRecords];
                                                                    [weakSelf.playbackList reloadData];
                                                                    [weakSelf.playbackList.header endRefreshing];
                                                                    [weakSelf doPlayback];
                                                                }
                                                            }];
                NSLog(@"cloudRecords is %@, error is %@", cloudRecords, error);
                if (error)
                {
                    if (error.code > 0) {
                        NSString *mes = [NSString stringWithFormat:@"%@(%ld)",NSLocalizedString(@"setting_opration_fail", @"操作失败"), (long)error.code];
                        [UIView dd_showMessage:mes onParentView:self.view];
                    }
                    [weakSelf.playbackList.header endRefreshing];
                    [weakSelf.records removeAllObjects];
                    [weakSelf.playbackList reloadData];
                    return ;
                }
                [weakSelf.records removeAllObjects];
                if(cloudRecords.count == 0)
                {
                    weakSelf.noVideoLabel.hidden = NO;
                    weakSelf.noVideoImageView.hidden = NO;
                    [weakSelf.playbackList reloadData];
                    [weakSelf.playbackList.header endRefreshing];
                    return;
                }
                if (cloudRecords.count > 0)
                {
                    [weakSelf.records addObjectsFromArray:cloudRecords];
                    [weakSelf.playbackList reloadData];
                    [weakSelf.playbackList.header endRefreshing];
                    [weakSelf doPlayback];
                }
            }];
        }
    }];
    self.playbackList.header.automaticallyChangeAlpha = YES;
@@ -740,14 +789,60 @@
- (IBAction)large:(id)sender
{
    NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationLandscapeLeft];
    [[UIDevice currentDevice] setValue:value forKey:@"orientation"];
//    NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationLandscapeLeft];
//    [[UIDevice currentDevice] setValue:value forKey:@"orientation"];
    if (_landscape == YES) {
        [self largeBack:self.largeBackButton];
        return;
    }
    _landscape = YES;
    if (@available(iOS 16.0, *)) {
        if (self.navigationController) {
            dispatch_async(dispatch_get_main_queue(), ^{
                [self.navigationController setNeedsUpdateOfSupportedInterfaceOrientations];
            });
        } else {
            dispatch_async(dispatch_get_main_queue(), ^{
                [self setNeedsUpdateOfSupportedInterfaceOrientations];
            });
        }
        NSArray *array = [[[UIApplication sharedApplication] connectedScenes] allObjects];
        UIWindowScene *ws = (UIWindowScene *)array.firstObject;
        UIWindowSceneGeometryPreferencesIOS *geometryPreferences = [[UIWindowSceneGeometryPreferencesIOS alloc] init];
        geometryPreferences.interfaceOrientations = UIInterfaceOrientationMaskLandscape;
        [ws requestGeometryUpdateWithPreferences:geometryPreferences errorHandler:^(NSError * _Nonnull error) {
            NSLog(@"iOS 16 Error: %@",error);
        }];
    } else {
        NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationLandscapeLeft];
        [[UIDevice currentDevice] setValue:value forKey:@"orientation"];
    }
}
- (IBAction)largeBack:(id)sender
{
    NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationPortrait];
    [[UIDevice currentDevice] setValue:value forKey:@"orientation"];
    _landscape = NO;
    if (@available(iOS 16.0, *)) {
        if (self.navigationController) {
            dispatch_async(dispatch_get_main_queue(), ^{
                [self.navigationController setNeedsUpdateOfSupportedInterfaceOrientations];
            });
        } else {
            dispatch_async(dispatch_get_main_queue(), ^{
                [self setNeedsUpdateOfSupportedInterfaceOrientations];
            });
        }
        NSArray *array = [[[UIApplication sharedApplication] connectedScenes] allObjects];
        UIWindowScene *ws = (UIWindowScene *)array.firstObject;
        UIWindowSceneGeometryPreferencesIOS *geometryPreferences = [[UIWindowSceneGeometryPreferencesIOS alloc] init];
        geometryPreferences.interfaceOrientations = UIInterfaceOrientationMaskPortrait;
        [ws requestGeometryUpdateWithPreferences:geometryPreferences errorHandler:^(NSError * _Nonnull error) {
            NSLog(@"iOS 16 Error: %@",error);
        }];
    } else {
        NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationPortrait];
        [[UIDevice currentDevice] setValue:value forKey:@"orientation"];
    }
}
- (IBAction)voiceButtonClicked:(id)sender
@@ -777,7 +872,7 @@
        [_player setPlaybackRate:rate mode:0];
    }
    else {
        EZPlaybackRate rate = [cloudRate[indexPath.row] intValue];
        [_player setPlaybackRate:rate mode:0];
    }
@@ -816,7 +911,7 @@
}
- (IBAction)clickRateBtn:(UIButton *)sender {
    self.rateBtnTimer = [NSTimer scheduledTimerWithTimeInterval:2.5f target:self selector:@selector(hideRateView) userInfo:nil repeats:NO];
    
    if(_isSelectedDevice) {
@@ -888,14 +983,14 @@
    self.selectedIndexPath = nil;
    [UIView animateWithDuration:0.3
                     animations:^{
                         self.selectedImageViewConstraint.constant = 0;
                         [self.toolView setNeedsUpdateConstraints];
                         [self.toolView layoutIfNeeded];
                     }
        self.selectedImageViewConstraint.constant = 0;
        [self.toolView setNeedsUpdateConstraints];
        [self.toolView layoutIfNeeded];
    }
                     completion:^(BOOL finished) {
                         self.cloudButton.selected = YES;
                         self.deviceButton.selected = NO;
                     }];
        self.cloudButton.selected = YES;
        self.deviceButton.selected = NO;
    }];
    _isSelectedDevice = NO;
    [self.records removeAllObjects];
    [self.playbackList reloadData];
@@ -912,14 +1007,14 @@
    self.selectedIndexPath = nil;
    [UIView animateWithDuration:0.3
                     animations:^{
                         self.selectedImageViewConstraint.constant = self.view.bounds.size.width / 2.0f;
                         [self.toolView setNeedsUpdateConstraints];
                         [self.toolView layoutIfNeeded];
                     }
        self.selectedImageViewConstraint.constant = self.view.bounds.size.width / 2.0f;
        [self.toolView setNeedsUpdateConstraints];
        [self.toolView layoutIfNeeded];
    }
                     completion:^(BOOL finished) {
                         self.cloudButton.selected = NO;
                         self.deviceButton.selected = YES;
                     }];
        self.cloudButton.selected = NO;
        self.deviceButton.selected = YES;
    }];
    _isSelectedDevice = YES;
    [self.records removeAllObjects];
    [self.playbackList reloadData];
@@ -983,7 +1078,7 @@
- (void)playBoxToolRefresh:(NSTimer *)timer
{
    NSDate *currentTime = [_player getOSDTime];
NSLog(@"getOSDTime === %@", currentTime);
    NSLog(@"getOSDTime === %@", currentTime);
    if(_isSelectedDevice)
    {
        _playSeconds = [currentTime timeIntervalSinceDate:_deviceRecord.startTime];
@@ -992,7 +1087,7 @@
    {
        _playSeconds = [currentTime timeIntervalSinceDate:_cloudRecord.startTime];
    }
    if(_playSeconds >= 3600)
    {
        int hour = (int)_playSeconds / 3600;
@@ -1100,19 +1195,19 @@
- (void)streamPlayer:(EZStreamPlayer *)player didReceivedMessage:(EZStreamPlayerMsgType)msgType
{
    dispatch_async(dispatch_get_main_queue(), ^{
        NSString *msg;
        switch (msgType) {
            case EZStreamPlayerMsgTypeRealPlayStart:
                msg = @"开启预览成功";
                break;
             case EZStreamPlayerMsgTypeRealPlayClose:
            case EZStreamPlayerMsgTypeRealPlayClose:
                msg = @"关闭预览成功";
                break;
             case EZStreamPlayerMsgTypePlayBackStart:
            case EZStreamPlayerMsgTypePlayBackStart:
                msg = @"开启设备回放成功";
                break;
             case EZStreamPlayerMsgTypePlayBackClose:
            case EZStreamPlayerMsgTypePlayBackClose:
                msg = @"关闭设备回放成功";
                break;
            default:
@@ -1126,14 +1221,14 @@
{
    if (dataType == EZStreamDataTypeHeader) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.navigationController.view makeToast:@"开始写入文件"];
        });
    }
    else if (dataType == EZStreamDataTypeStreamEnd)
    {
        dispatch_async(dispatch_get_main_queue(), ^{
            self.streamPlayBtn.selected = NO;
        });
        
@@ -1143,4 +1238,8 @@
    }
}
- (BOOL)prefersHomeIndicatorAutoHidden {
    return YES;
}
@end