//
|
// Copyright © 2020 dahua. All rights reserved.
|
//
|
|
#import "LCVideotapePlayerPersenter.h"
|
#import "LCVideotapePlayerPersenter+SDKListener.h"
|
#import "LCVideotapePlayerPersenter+Control.h"
|
|
|
@interface LCVideotapePlayerPersenter ()
|
|
/// 中间控制能力数组
|
@property (strong, nonatomic) NSMutableArray *middleControlList;
|
|
/// 底部控制能力数组
|
@property (strong, nonatomic) NSMutableArray *bottomControlList;
|
|
@end
|
|
@implementation LCVideotapePlayerPersenter
|
|
- (void)stopDownload {
|
[self.videoManager cancleDownload:self.videoManager.currentDownloadInfo.recordId];
|
}
|
|
/**
|
固定能力列表初始化
|
|
@return 固定能力
|
*/
|
- (NSMutableArray *)getMiddleControlItems {
|
NSMutableArray *middleControlList = [NSMutableArray array];
|
[middleControlList addObject:[self getItemWithType:LCVideotapePlayerControlPlay] ];
|
[middleControlList addObject:[self getItemWithType:LCVideotapePlayerControlTimes] ];
|
[middleControlList addObject:[self getItemWithType:LCVideotapePlayerControlVoice] ];
|
[middleControlList addObject:[self getItemWithType:LCVideotapePlayerControlFullScreen]];
|
self.middleControlList = middleControlList;
|
return middleControlList;
|
}
|
|
// TODO:后期需要根据能力集检查然后进行填充
|
- (NSMutableArray *)getBottomControlItems {
|
NSMutableArray *bottomControlList = [NSMutableArray array];
|
[bottomControlList addObject:[self getItemWithType:LCVideotapePlayerControlSnap] ];
|
[bottomControlList addObject:[self getItemWithType:LCVideotapePlayerControlPVR]];
|
self.bottomControlList = bottomControlList;
|
return bottomControlList;
|
}
|
|
/**
|
根据能力创建控制模型
|
|
@param type 能力类型
|
@return 创建出来的控制模型
|
*/
|
- (LCButton *)getItemWithType:(LCVideotapePlayerControlType)type {
|
weakSelf(self);
|
LCButton *item = [LCButton lcButtonWithType:LCButtonTypeCustom];
|
item.tag = type;
|
switch (type) {
|
case LCVideotapePlayerControlPlay: {
|
//播放或暂停
|
[item setImage:LC_IMAGENAMED(@"live_video_icon_play") forState:UIControlStateNormal];
|
//监听管理者状态
|
item.touchUpInsideblock = ^(LCButton *_Nonnull btn) {
|
[weakself onPlay:btn];
|
};
|
[item.KVOController observe:self.videoManager keyPath:@"isPlay" options:NSKeyValueObservingOptionNew block:^(id _Nullable observer, id _Nonnull object, NSDictionary<NSString *, id> *_Nonnull change) {
|
if ([change[@"new"] boolValue]) {
|
//暂停
|
[item setImage:LC_IMAGENAMED(@"live_video_icon_pause") forState:UIControlStateNormal];
|
} else {
|
[item setImage:LC_IMAGENAMED(@"live_video_icon_play") forState:UIControlStateNormal];
|
}
|
}];
|
};
|
break;
|
case LCVideotapePlayerControlTimes: {
|
//播放或暂停
|
[item setImage:LC_IMAGENAMED(@"video_1x") forState:UIControlStateNormal];
|
//监听管理者状态
|
item.touchUpInsideblock = ^(LCButton *_Nonnull btn) {
|
[weakself onSpeed:btn];
|
};
|
[item.KVOController observe:self.videoManager keyPath:@"playSpeed" options:NSKeyValueObservingOptionNew block:^(id _Nullable observer, id _Nonnull object, NSDictionary<NSString *, id> *_Nonnull change) {
|
NSInteger speed = [change[@"new"] integerValue];
|
CGFloat speedTime = 1.0;
|
if (speed == 1) {
|
speedTime = 1.0;
|
[item setImage:LC_IMAGENAMED(@"video_1x") forState:UIControlStateNormal];
|
} else if (speed == 2) {
|
speedTime = 4.0;
|
[item setImage:LC_IMAGENAMED(@"video_4x") forState:UIControlStateNormal];
|
} else if (speed == 3) {
|
speedTime = 8.0;
|
[item setImage:LC_IMAGENAMED(@"video_8x") forState:UIControlStateNormal];
|
} else if (speed == 4) {
|
speedTime = 16.0;
|
[item setImage:LC_IMAGENAMED(@"video_16x") forState:UIControlStateNormal];
|
} else if (speed == 5) {
|
speedTime = 32.0;
|
[item setImage:LC_IMAGENAMED(@"video_32x") forState:UIControlStateNormal];
|
}
|
|
[self.playWindow setPlaySpeed:speedTime];
|
}];
|
|
[item.KVOController observe:self.videoManager keyPath:@"isPlay" options:NSKeyValueObservingOptionNew block:^(id _Nullable observer, id _Nonnull object, NSDictionary<NSString *, id> *_Nonnull change) {
|
item.enabled = NO;
|
}];
|
[item.KVOController observe:self.videoManager keyPath:@"playStatus" options:NSKeyValueObservingOptionNew block:^(id _Nullable observer, id _Nonnull object, NSDictionary<NSString *, id> *_Nonnull change) {
|
if ([change[@"new"] integerValue] == 1001) {
|
item.enabled = YES;
|
}
|
}];
|
};
|
break;
|
case LCVideotapePlayerControlVoice: {
|
//音频
|
[item setImage:LC_IMAGENAMED(@"live_video_icon_sound_on") forState:UIControlStateNormal];
|
//监听管理者状态
|
[item.KVOController observe:self.videoManager keyPath:@"isSoundOn" options:NSKeyValueObservingOptionNew block:^(id _Nullable observer, id _Nonnull object, NSDictionary<NSString *, id> *_Nonnull change) {
|
if ([change[@"new"] boolValue]) {
|
//是否打开声音
|
[item setImage:LC_IMAGENAMED(@"live_video_icon_sound_on") forState:UIControlStateNormal];
|
} else {
|
[item setImage:LC_IMAGENAMED(@"live_video_icon_sound_off") forState:UIControlStateNormal];
|
}
|
}];
|
[item.KVOController observe:self.videoManager keyPath:@"isPlay" options:NSKeyValueObservingOptionNew block:^(id _Nullable observer, id _Nonnull object, NSDictionary<NSString *, id> *_Nonnull change) {
|
item.enabled = NO;
|
}];
|
[item.KVOController observe:self.videoManager keyPath:@"playStatus" options:NSKeyValueObservingOptionNew block:^(id _Nullable observer, id _Nonnull object, NSDictionary<NSString *, id> *_Nonnull change) {
|
if ([change[@"new"] integerValue] == 1001) {
|
item.enabled = YES;
|
}
|
}];
|
item.touchUpInsideblock = ^(LCButton *_Nonnull btn) {
|
[weakself onAudio:btn];
|
};
|
}
|
break;
|
case LCVideotapePlayerControlFullScreen: {
|
//全屏
|
[item setImage:LC_IMAGENAMED(@"live_video_icon_fullscreen") forState:UIControlStateNormal];
|
item.touchUpInsideblock = ^(LCButton *_Nonnull btn) {
|
[weakself onFullScreen:btn];
|
};
|
}
|
break;
|
case LCVideotapePlayerControlSnap: {
|
//抓图
|
[item setImage:LC_IMAGENAMED(@"play_module_livepreview_icon_screenshot") forState:UIControlStateNormal];
|
item.enabled = NO;
|
//监听管理者状态
|
[item.KVOController observe:self.videoManager keyPath:@"isPlay" options:NSKeyValueObservingOptionNew block:^(id _Nullable observer, id _Nonnull object, NSDictionary<NSString *, id> *_Nonnull change) {
|
item.enabled = NO;
|
}];
|
[item.KVOController observe:self.videoManager keyPath:@"playStatus" options:NSKeyValueObservingOptionNew block:^(id _Nullable observer, id _Nonnull object, NSDictionary<NSString *, id> *_Nonnull change) {
|
if ([change[@"new"] integerValue] == 1001) {
|
item.enabled = YES;
|
}
|
}];
|
item.touchUpInsideblock = ^(LCButton *_Nonnull btn) {
|
[weakself onSnap:btn];
|
};
|
}
|
break;
|
case LCVideotapePlayerControlPVR: {
|
//录制
|
[item setImage:LC_IMAGENAMED(@"play_module_livepreview_icon_video") forState:UIControlStateNormal];
|
item.enabled = NO;
|
//监听管理者状态
|
[item.KVOController observe:self.videoManager keyPath:@"isOpenRecoding" options:NSKeyValueObservingOptionNew block:^(id _Nullable observer, id _Nonnull object, NSDictionary<NSString *, id> *_Nonnull change) {
|
if ([change[@"new"] boolValue]) {
|
//是否打开声音
|
[item setImage:LC_IMAGENAMED(@"play_module_livepreview_icon_video_ing") forState:UIControlStateNormal];
|
} else {
|
[item setImage:LC_IMAGENAMED(@"play_module_livepreview_icon_video") forState:UIControlStateNormal];
|
}
|
}];
|
[item.KVOController observe:self.videoManager keyPath:@"isPlay" options:NSKeyValueObservingOptionNew block:^(id _Nullable observer, id _Nonnull object, NSDictionary<NSString *, id> *_Nonnull change) {
|
item.enabled = NO;
|
}];
|
[item.KVOController observe:self.videoManager keyPath:@"playStatus" options:NSKeyValueObservingOptionNew block:^(id _Nullable observer, id _Nonnull object, NSDictionary<NSString *, id> *_Nonnull change) {
|
if ([change[@"new"] integerValue] == 1001) {
|
item.enabled = YES;
|
}
|
}];
|
item.touchUpInsideblock = ^(LCButton *_Nonnull btn) {
|
[weakself onRecording:btn];
|
};
|
}
|
break;
|
case LCVideotapePlayerControlDownload: {
|
//下载
|
// LCVideotapeDownloadInfo *downloadInfo = [self.videoManager currentDownloadInfo];
|
// if (downloadInfo) {
|
// [self checkDownloadStatus:item DonwloadStatus:downloadInfo.donwloadStatus];
|
// } else {
|
// [self checkDownloadStatus:item DonwloadStatus:-1];
|
// }
|
[item setImage:LC_IMAGENAMED(@"video_icon_download") forState:UIControlStateNormal];
|
[item setTitle:@"mobile_common_data_download".lc_T forState:UIControlStateNormal];
|
[item setTitleColor:[UIColor dhcolor_c51] forState:UIControlStateNormal];
|
if (self.videoManager.localVideotapeInfo) {
|
//本地录像没有下载
|
item.enabled = NO;
|
}
|
//监听管理者状态
|
[self.KVOController observe:self.videoManager keyPath:@"isFullScreen" options:NSKeyValueObservingOptionNew block:^(id _Nullable observer, id _Nonnull object, NSDictionary<NSString *, id> *_Nonnull change) {
|
if ([change[@"new"] boolValue]) {
|
item.hidden = YES;
|
} else {
|
item.hidden = self.videoManager.cloudVideotapeInfo == nil ? YES : NO;
|
}
|
}];
|
[item.KVOController observe:self.videoManager keyPath:@"downloadQueue" options:NSKeyValueObservingOptionNew block:^(id _Nullable observer, id _Nonnull object, NSDictionary<NSString *, id> *_Nonnull change) {
|
LCVideotapeDownloadInfo *info = [self.videoManager currentDownloadInfo];
|
if (self.videoManager.localVideotapeInfo || ![info.recordId isEqualToString:self.videoManager.currentVideotapeId]) {
|
return;
|
}
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
if (info.donwloadStatus == LCVideotapeDownloadStatusEnd) {
|
item.selected = NO;
|
[item setTitle:@"mobile_common_data_download_success".lc_T forState:UIControlStateNormal];
|
[item setImage:[UIImage new] forState:UIControlStateNormal];
|
} else if (info.donwloadStatus != LCVideotapeDownloadStatusBegin && info.donwloadStatus != LCVideotapeDownloadStatusPartDownload) {
|
item.selected = YES;
|
[item setTitleColor:[UIColor redColor] forState:UIControlStateSelected];
|
[item setTitle:@"mobile_common_data_download_fail".lc_T forState:UIControlStateNormal];
|
[item setImage:[UIImage new] forState:UIControlStateNormal];
|
}
|
});
|
|
}];
|
item.touchUpInsideblock = ^(LCButton *_Nonnull btn) {
|
[weakself.videoManager startDeviceDownload];
|
btn.enabled = NO;
|
};
|
}
|
break;
|
|
default:
|
break;
|
}
|
return item;
|
}
|
|
//MARK: - Private Methods
|
|
///播放窗口懒加载
|
- (LCOpenSDK_PlayWindow *)playWindow {
|
if (!_playWindow) {
|
_playWindow = [[LCOpenSDK_PlayWindow alloc] initPlayWindow:CGRectMake(50, 50, 30, 30) Index:0];
|
//设置背景色为黑色
|
[_playWindow setSurfaceBGColor:[UIColor blackColor]];
|
// [self loadStatusView];
|
[_playWindow setWindowListener:self];
|
}
|
return _playWindow;
|
}
|
|
- (LCDeviceVideotapePlayManager *)videoManager {
|
if (!_videoManager) {
|
_videoManager = [LCDeviceVideotapePlayManager manager];
|
}
|
return _videoManager;
|
}
|
|
- (void)loadStatusView {
|
UIView *tempView = [self.playWindow getWindowView];
|
UIImageView *defaultImageView = [UIImageView new];
|
[defaultImageView sd_setImageWithURL:[NSURL URLWithString:self.videoManager.currentDevice.channels[self.videoManager.currentChannelIndex].picUrl] placeholderImage:LC_IMAGENAMED(@"common_defaultcover_big")];
|
[tempView addSubview:defaultImageView];
|
[defaultImageView mas_makeConstraints:^(MASConstraintMaker *make) {
|
make.top.left.bottom.right.mas_equalTo(tempView);
|
}];
|
|
[defaultImageView.KVOController observe:self.videoManager keyPath:@"isPlay" options:NSKeyValueObservingOptionNew block:^(id _Nullable observer, id _Nonnull object, NSDictionary<NSString *, id> *_Nonnull change) {
|
defaultImageView.hidden = NO;
|
}];
|
|
[defaultImageView.KVOController observe:self.videoManager keyPath:@"pausePlay" options:NSKeyValueObservingOptionNew block:^(id _Nullable observer, id _Nonnull object, NSDictionary<NSString *, id> *_Nonnull change) {
|
if ([change[@"new"] boolValue]) {
|
defaultImageView.hidden = YES;
|
}
|
}];
|
|
[defaultImageView.KVOController observe:self.videoManager keyPath:@"playStatus" options:NSKeyValueObservingOptionNew block:^(id _Nullable observer, id _Nonnull object, NSDictionary<NSString *, id> *_Nonnull change) {
|
dispatch_async(dispatch_get_main_queue(), ^{
|
if ([change[@"new"] integerValue] == 1001) defaultImageView.hidden = YES;
|
});
|
}];
|
|
self.loadImageview = [UIImageView new];
|
self.loadImageview.contentMode = UIViewContentModeCenter;
|
[tempView addSubview:self.loadImageview];
|
[self.loadImageview mas_makeConstraints:^(MASConstraintMaker *make) {
|
make.top.left.bottom.right.mas_equalTo(tempView);
|
}];
|
}
|
|
- (void)onActive:(id)sender {
|
// if (!self.videoManager.isPlay) {
|
// [self onPlay:nil];
|
// }
|
}
|
|
- (void)onResignActive:(id)sender {
|
if (self.playWindow) {
|
[self.playWindow stopRtspReal:YES];
|
self.videoManager.isPlay = NO;
|
[self.playWindow stopAudio];
|
}
|
}
|
|
- (void)checkDownloadStatus:(LCButton *)btn DonwloadStatus:(LCVideotapeDownloadState)status {
|
if (status == -1) {
|
//默认状态
|
[btn setImage:LC_IMAGENAMED(@"video_icon_download") forState:UIControlStateNormal];
|
[btn setBackgroundColor:[UIColor dhcolor_c54]];
|
[btn setBorderWithStyle:LC_BORDER_DRAW_TOP borderColor:[UIColor dhcolor_c53] borderWidth:1];
|
}
|
}
|
|
- (void)showVideoLoadImage {
|
self.loadImageview.hidden = NO;
|
[self.loadImageview loadGifImageWith:@[@"video_waiting_gif_1", @"video_waiting_gif_2", @"video_waiting_gif_3", @"video_waiting_gif_4"] TimeInterval:0.3 Style:LCIMGCirclePlayStyleCircle];
|
}
|
|
- (void)hideVideoLoadImage {
|
dispatch_async(dispatch_get_main_queue(), ^{
|
self.loadImageview.hidden = YES;
|
[self.loadImageview releaseImgs];
|
});
|
}
|
|
- (void)configBigPlay {
|
UIView *tempView = [self.playWindow getWindowView];
|
self.errorBtn = [LCButton lcButtonWithType:LCButtonTypeVertical];
|
[self.errorBtn setImage:LC_IMAGENAMED(@"videotape_icon_replay") forState:UIControlStateNormal];
|
// [replayBtn setTitle:@"play_module_video_replay_description".lc_T forState:UIControlStateSelected];
|
[self.container.view addSubview:self.errorBtn];
|
[self.errorBtn mas_makeConstraints:^(MASConstraintMaker *make) {
|
make.centerX.mas_equalTo(tempView.mas_centerX);
|
make.centerY.mas_equalTo(tempView.mas_centerY);
|
make.width.mas_equalTo(100);
|
make.height.mas_equalTo(60);
|
}];
|
self.errorBtn.hidden = YES;
|
|
self.errorMsgLab = [UILabel new];
|
[self.container.view addSubview:self.errorMsgLab];
|
self.errorMsgLab.textColor = [UIColor whiteColor];
|
self.errorMsgLab.font = [UIFont lcFont_t3];
|
self.errorMsgLab.textAlignment = NSTextAlignmentCenter;
|
[self.errorMsgLab mas_makeConstraints:^(MASConstraintMaker *make) {
|
make.top.mas_equalTo(self.errorBtn.mas_bottom).offset(10);
|
make.width.mas_equalTo(SCREEN_WIDTH);
|
make.height.mas_equalTo(30);
|
}];
|
self.errorMsgLab.hidden = YES;
|
self.errorMsgLab.text = @"play_module_video_replay_description".lc_T;
|
|
self.bigPlayBtn = [LCButton lcButtonWithType:LCButtonTypeVertical];
|
[self.bigPlayBtn setImage:LC_IMAGENAMED(@"videotape_icon_play_big") forState:UIControlStateNormal];
|
// [replayBtn setTitle:@"" forState:UIControlStateNormal];
|
[self.container.view addSubview:self.bigPlayBtn];
|
[self.bigPlayBtn mas_makeConstraints:^(MASConstraintMaker *make) {
|
make.centerX.mas_equalTo(tempView.mas_centerX);
|
make.centerY.mas_equalTo(tempView.mas_centerY);
|
make.width.mas_equalTo(100);
|
make.height.mas_equalTo(60);
|
}];
|
self.bigPlayBtn.hidden = YES;
|
[self.bigPlayBtn addTarget:self action:@selector(onPlay:) forControlEvents:UIControlEventTouchUpInside];
|
[self.errorBtn addTarget:self action:@selector(onPlay:) forControlEvents:UIControlEventTouchUpInside];
|
}
|
|
- (void)showPlayBtn {
|
self.bigPlayBtn.hidden = NO;
|
self.errorBtn.hidden = YES;
|
self.errorMsgLab.hidden = YES;
|
}
|
|
- (void)hidePlayBtn {
|
self.bigPlayBtn.hidden = YES;
|
self.errorBtn.hidden = YES;
|
self.errorMsgLab.hidden = YES;
|
}
|
|
- (void)showErrorBtn {
|
self.bigPlayBtn.hidden = YES;
|
self.errorBtn.hidden = NO;
|
self.errorMsgLab.hidden = NO;
|
[self hideVideoLoadImage];
|
self.videoManager.isPlay = NO;
|
}
|
|
- (void)hideErrorBtn {
|
self.bigPlayBtn.hidden = YES;
|
self.errorBtn.hidden = YES;
|
self.errorMsgLab.hidden = YES;
|
}
|
|
- (void)showPSKAlert {
|
weakSelf(self);
|
[LCOCAlertView lc_showTextFieldAlertTextFieldWithTitle:@"Alert_Title_Notice".lc_T Detail:@"mobile_common_input_video_password_tip".lc_T Placeholder:@"" ConfirmTitle:@"Alert_Title_Button_Confirm".lc_T CancleTitle:@"Alert_Title_Button_Cancle".lc_T Handle:^(BOOL isConfirmSelected, NSString *_Nonnull inputContent) {
|
if (isConfirmSelected) {
|
weakself.videoManager.currentPsk = inputContent;
|
[weakself onPlay:nil];
|
}
|
}];
|
}
|
|
@end
|