// // RecordPlayViewController.m // lechangeDemo // // Created by mac318340418 on 16/7/12. // Copyright © 2016年 dh-Test. All rights reserved. // #import "RecordPlayViewController.h" #import "LCOpenSDK_Prefix.h" #import "UIDevice+Lechange.h" #import #define RECORD_BAR_HEIGHT 40.0 #define TIME_LAB_WIDTH 60.0 typedef NS_ENUM(NSInteger, PlayState) { Play = 0, Pause = 1, Stop = 2 }; @interface RecordPlayViewController () { LCOpenSDK_Utils* m_Utils; CGRect m_screenFrame; LCOpenSDK_PlayWindow* m_play; PlayState m_playState; BOOL m_isSeeking; NSTimeInterval m_deltaTime; NSString* m_streamPath; } @end @implementation RecordPlayViewController - (void)viewDidLoad { [super viewDidLoad]; [self initWindowView]; [self.view bringSubviewToFront:m_playBarView]; dispatch_queue_t playRecord = dispatch_queue_create("playRecord", nil); dispatch_async(playRecord, ^{ [self onPlay]; }); [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onResignActive:) name:UIApplicationDidEnterBackgroundNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onActive:) name:UIApplicationDidBecomeActiveNotification object:nil]; signal(SIGPIPE, SIG_IGN); } - (void)initWindowView { m_screenFrame = [UIScreen mainScreen].bounds; UINavigationItem* item = [[UINavigationItem alloc] initWithTitle:NSLocalizedString(RECORD_PLAY_TITLE_TXT, nil)]; UIButton* left = [UIButton buttonWithType:UIButtonTypeCustom]; [left setFrame:CGRectMake(0, 0, 50, 30)]; UIImage* img = [UIImage leChangeImageNamed:Back_Btn_Png]; [left setBackgroundImage:img forState:UIControlStateNormal]; [left addTarget:self action:@selector(onBack) forControlEvents:UIControlEventTouchUpInside]; UIBarButtonItem* leftBtn = [[UIBarButtonItem alloc] initWithCustomView:left]; [item setLeftBarButtonItem:leftBtn animated:NO]; [super.m_navigationBar pushNavigationItem:item animated:NO]; [self.view addSubview:super.m_navigationBar]; m_playImg = [[UIImageView alloc] initWithFrame:CGRectMake(0, super.m_yOffset, m_screenFrame.size.width, m_screenFrame.size.width * 9 / 16)]; [m_playImg setImage:m_imgPicSelected]; [self.view addSubview:m_playImg]; [self layOutBar]; m_tipLab = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, m_screenFrame.size.width - 20, 20)]; m_tipLab.center = CGPointMake(m_playImg.center.x, m_playImg.center.y + CGRectGetHeight(m_playImg.frame) / 2 + 50); [m_tipLab setBackgroundColor:[UIColor clearColor]]; m_tipLab.textAlignment = NSTextAlignmentCenter; [m_tipLab setFont:[UIFont systemFontOfSize:15.0]]; [self.view addSubview:m_tipLab]; m_play = [[LCOpenSDK_PlayWindow alloc] initPlayWindow:CGRectMake(0, super.m_yOffset, m_screenFrame.size.width, m_screenFrame.size.width * 9 / 16) Index:1]; [m_play setSurfaceBGColor:[UIColor blackColor]]; [self.view addSubview:[m_play getWindowView]]; m_progressInd = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; m_progressInd.center = CGPointMake(self.view.center.x, m_playImg.center.y); [self.view addSubview:m_progressInd]; [self.view bringSubviewToFront:m_playImg]; [self.view bringSubviewToFront:m_playBarView]; [self.view bringSubviewToFront:m_progressInd]; [m_play setWindowListener:(id)self]; m_Utils = [[LCOpenSDK_Utils alloc] init]; m_playState = Stop; m_isSeeking = NO; [self enableOtherBtn:NO]; m_deltaTime = [self transformToDeltaTime:m_beginTimeSelected EndTime:m_endTimeSelected]; signal(SIGPIPE, SIG_IGN); } - (void)layOutBar { m_playBarView = [[UIView alloc] initWithFrame:CGRectMake(0, super.m_yOffset - RECORD_BAR_HEIGHT + m_playImg.frame.size.height, m_playImg.frame.size.width, RECORD_BAR_HEIGHT)]; [m_playBarView setBackgroundColor:[UIColor grayColor]]; m_playBarView.alpha = 0.5; [self.view addSubview:m_playBarView]; m_playBtn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, RECORD_BAR_HEIGHT, RECORD_BAR_HEIGHT)]; [m_playBtn setBackgroundImage:[UIImage leChangeImageNamed:VideoPlay_Play_Png] forState:UIControlStateNormal]; [m_playBtn addTarget:self action:@selector(onPlay) forControlEvents:UIControlEventTouchUpInside]; [m_playBarView addSubview:m_playBtn]; m_scalBtn = [[UIButton alloc] initWithFrame:CGRectMake(m_playBarView.frame.size.width - RECORD_BAR_HEIGHT, 0, RECORD_BAR_HEIGHT, RECORD_BAR_HEIGHT)]; [m_scalBtn setBackgroundImage:[UIImage leChangeImageNamed:VideoPlay_FullScreen_Png] forState:UIControlStateNormal]; [m_scalBtn addTarget:self action:@selector(onFullScreen) forControlEvents:UIControlEventTouchUpInside]; [m_playBarView addSubview:m_scalBtn]; m_startTimeLab = [[UILabel alloc] initWithFrame:CGRectMake(RECORD_BAR_HEIGHT, 0, TIME_LAB_WIDTH, RECORD_BAR_HEIGHT)]; m_startTimeLab.text = [self transformToShortTime:m_beginTimeSelected]; [m_startTimeLab setBackgroundColor:[UIColor clearColor]]; [m_startTimeLab setFont:[UIFont systemFontOfSize:12.0]]; m_startTimeLab.textAlignment = NSTextAlignmentCenter; [m_playBarView addSubview:m_startTimeLab]; m_endTimeLab = [[UILabel alloc] initWithFrame:CGRectMake(m_playBarView.frame.size.width - TIME_LAB_WIDTH - RECORD_BAR_HEIGHT, 0, TIME_LAB_WIDTH, RECORD_BAR_HEIGHT)]; m_endTimeLab.text = [self transformToShortTime:m_endTimeSelected]; [m_endTimeLab setBackgroundColor:[UIColor clearColor]]; [m_endTimeLab setFont:[UIFont systemFontOfSize:12.0]]; m_endTimeLab.textAlignment = NSTextAlignmentCenter; [m_playBarView addSubview:m_endTimeLab]; m_playSlider = [[UISlider alloc] initWithFrame:CGRectMake(RECORD_BAR_HEIGHT + TIME_LAB_WIDTH, 0, m_playBarView.frame.size.width - 2 * (RECORD_BAR_HEIGHT + TIME_LAB_WIDTH), RECORD_BAR_HEIGHT)]; m_playSlider.value = m_playSlider.minimumValue; [m_playSlider addTarget:self action:@selector(onSeek) forControlEvents:UIControlEventTouchUpInside]; [m_playBarView addSubview:m_playSlider]; } - (void)refreshSubView { [m_playBtn setFrame:CGRectMake(0, 0, RECORD_BAR_HEIGHT, RECORD_BAR_HEIGHT)]; [m_scalBtn setFrame:CGRectMake(m_playBarView.frame.size.width - RECORD_BAR_HEIGHT, 0, RECORD_BAR_HEIGHT, RECORD_BAR_HEIGHT)]; [m_startTimeLab setFrame:CGRectMake(RECORD_BAR_HEIGHT, 0, TIME_LAB_WIDTH, RECORD_BAR_HEIGHT)]; [m_endTimeLab setFrame:CGRectMake(m_playBarView.frame.size.width - TIME_LAB_WIDTH - RECORD_BAR_HEIGHT, 0, TIME_LAB_WIDTH, RECORD_BAR_HEIGHT)]; [m_playSlider setFrame:CGRectMake(RECORD_BAR_HEIGHT + TIME_LAB_WIDTH, 0, m_playBarView.frame.size.width - 2 * (RECORD_BAR_HEIGHT + TIME_LAB_WIDTH), RECORD_BAR_HEIGHT)]; } - (void)enableOtherBtn:(BOOL)bFalg { m_playSlider.enabled = bFalg; m_scalBtn.enabled = bFalg; } - (void)setInfo:(NSString*)token PlayToken:(NSString*)playToken Dev:(NSString*)deviceId Key:(NSString*)key Chn:(NSInteger)chn Type:(RecordType)type accessType:(NSString*)accessType; { m_accessToken = [token mutableCopy]; m_strDevSelected = [deviceId mutableCopy]; m_encryptKey = [key mutableCopy]; m_devChnSelected = chn; m_recordType = type; m_playToken = [playToken copy]; m_accessType = [accessType copy]; } - (void)setRecInfo:(NSString*)rec RecReg:(NSString*)recReg Begin:(NSString*)begin End:(NSString*)end Img:(UIImage*)img { m_strRecSelected = [rec mutableCopy]; m_strRecRegSelected = [recReg mutableCopy]; m_beginTimeSelected = [begin mutableCopy]; m_endTimeSelected = [end mutableCopy]; m_imgPicSelected = img; } - (void)onPlay { switch (m_recordType) { case DeviceRecord: [self playDeviceRecord]; break; case CloudRecord: [self playCloudRecord]; break; default: break; } } #pragma mark - 播放设备本地录像文件(En:Play device local video files) - (void)playDeviceRecord { if (!m_play) { NSLog(@"play failed\n"); return; } if (m_playState == Stop) { [m_play stopDeviceRecord:NO]; m_isSeeking = NO; [self showLoading]; if ([m_accessType isEqual:@"PaaS"] || [m_accessType isEqual:@"lechange"]) { LCOpenSDK_ParamDeviceRecordFileName * paramDeviceRecord = [[LCOpenSDK_ParamDeviceRecordFileName alloc] init]; paramDeviceRecord.accessToken = m_accessToken; paramDeviceRecord.deviceID = m_strDevSelected; paramDeviceRecord.psk = m_encryptKey; paramDeviceRecord.channel = m_devChnSelected; paramDeviceRecord.playToken = m_playToken; paramDeviceRecord.fileName = m_strRecSelected; paramDeviceRecord.offsetTime = 0 ; paramDeviceRecord.isOpt = YES; [m_play playDeviceRecordByFileName:paramDeviceRecord]; } else { LCOpenSDK_ParamDeviceRecordUTCTime *paramDeviceRecordUTCTime = [[LCOpenSDK_ParamDeviceRecordUTCTime alloc] init]; paramDeviceRecordUTCTime.accessToken = m_accessToken; paramDeviceRecordUTCTime.deviceID = m_strDevSelected; paramDeviceRecordUTCTime.psk = m_encryptKey; paramDeviceRecordUTCTime.channel = m_devChnSelected; paramDeviceRecordUTCTime.playToken = m_playToken; paramDeviceRecordUTCTime.beginTime = [self timeIntervalOfString:m_beginTimeSelected]; paramDeviceRecordUTCTime.endTime = [self timeIntervalOfString:m_endTimeSelected] ; paramDeviceRecordUTCTime.defiMode = DEFINITION_MODE_HG; paramDeviceRecordUTCTime.isOpt = YES; [m_play playDeviceRecordByUtcTime:paramDeviceRecordUTCTime]; } m_playState = Play; dispatch_async(dispatch_get_main_queue(), ^{ m_playBtn.enabled = NO; m_tipLab.text = @"ready play"; }); } else if (m_playState == Pause){ [m_play resume]; [m_playBtn setBackgroundImage:[UIImage leChangeImageNamed:VideoPlay_Pause_Png] forState:UIControlStateNormal]; m_playState = Play; dispatch_async(dispatch_get_main_queue(), ^{ m_tipLab.text = @"play"; }); } else if (m_playState == Play) { [m_play pause]; [m_playBtn setBackgroundImage:[UIImage leChangeImageNamed:VideoPlay_Play_Png] forState:UIControlStateNormal]; m_playState = Pause; dispatch_async(dispatch_get_main_queue(), ^{ m_tipLab.text = @"pause"; }); } } #pragma mark - 播放云录像(En:Play cloud video) - (void)playCloudRecord { if (!m_play) { NSLog(@"play failed\n"); return; } if (m_playState == Stop) { [m_play stopCloud:NO]; m_isSeeking = NO; [self showLoading]; LCOpenSDK_ParamCloudRecord *paramCloudRecord = [[LCOpenSDK_ParamCloudRecord alloc] init]; paramCloudRecord.accessToken = m_accessToken; paramCloudRecord.deviceID = m_strDevSelected; paramCloudRecord.channel = m_devChnSelected; paramCloudRecord.psk = m_encryptKey; paramCloudRecord.recordRegionID = m_strRecRegSelected; paramCloudRecord.offsetTime = 0; paramCloudRecord.recordType = RECORD_TYPE_ALL; paramCloudRecord.timeOut = 60; [m_play playCloudRecord:paramCloudRecord]; m_playState = Play; dispatch_async(dispatch_get_main_queue(), ^{ m_tipLab.text = @"ready play"; m_playBtn.enabled = NO; }); } else if (m_playState == Pause) { [m_play resume]; [m_playBtn setBackgroundImage:[UIImage leChangeImageNamed:VideoPlay_Pause_Png] forState:UIControlStateNormal]; m_playState = Play; dispatch_async(dispatch_get_main_queue(), ^{ m_tipLab.text = @"play"; }); } else if (m_playState == Play) { [m_play pause]; [m_playBtn setBackgroundImage:[UIImage leChangeImageNamed:VideoPlay_Play_Png] forState:UIControlStateNormal]; m_playState = Pause; dispatch_async(dispatch_get_main_queue(), ^{ m_tipLab.text = @"pause"; }); [m_play stopRecord]; } } #pragma mark - 拖动(En:Seek) - (void)onSeek { m_isSeeking = YES; [self showLoading]; if (Pause == m_playState) { [m_play resume]; [m_playBtn setBackgroundImage:[UIImage leChangeImageNamed:VideoPlay_Pause_Png] forState:UIControlStateNormal]; if (DeviceRecord == m_recordType) { return; } } m_playState = Play; /** Ch:seek到录像最后2秒内,录像可能无法播放,强制使seek在录像最后2秒以外 En:Seek to the last 2 seconds of the video, the video may not be played, forcing seek to be outside the last 2 seconds of the video. */ Float64 delta = m_playSlider.maximumValue - m_playSlider.value; if (delta < (2.0 / m_deltaTime)) { m_playSlider.value = (m_playSlider.maximumValue - 2.0 / m_deltaTime) < m_playSlider.minimumValue ? m_playSlider.minimumValue : (m_playSlider.maximumValue - 2.0 / m_deltaTime); } Float64 rate = m_playSlider.value / (m_playSlider.maximumValue - m_playSlider.minimumValue); [m_play seek:rate * m_deltaTime]; } #pragma mark - 全屏(En:Full screen) - (void)onFullScreen { [UIDevice lc_setRotateToSatusBarOrientation]; } - (void)onControlClick:(CGFloat)dx dy:(CGFloat)dy Index:(NSInteger)index { } #pragma mark - 双击播放屏幕(En:Double tap the play screen) - (void)onWindowDBClick:(CGFloat)dx dy:(CGFloat)dy Index:(NSInteger)index { m_playBarView.hidden = !m_playBarView.hidden; } - (void)onPlayerResult:(NSString*)code Type:(NSInteger)type Index:(NSInteger)index { switch (m_recordType) { case DeviceRecord: [self onPlayDeviceRecordResult:code Type:type]; break; case CloudRecord: [self onPlayCloudRecordResult:code Type:type]; default: break; } } #pragma mark - 设备录像播放回调(En:Device video playback callback) - (void)onPlayDeviceRecordResult:(NSString*)code Type:(NSInteger)type { NSString* displayLab; if (99 == type) { displayLab = [code isEqualToString:@"-1000"] ? NSLocalizedString(NETWORK_TIMEOUT_TXT, nil) : [NSLocalizedString(REST_LINK_FAILED_TXT, nil) stringByAppendingFormat:@",[%@]", code]; dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"RecordPlayViewController, OpenApi connect error!"); [m_tipLab setText:displayLab]; [self hideLoading]; m_playState = Stop; m_playImg.hidden = NO; m_playBtn.enabled = YES; [self enableOtherBtn:NO]; }); return; } if(5 == type) { /** Ch:优化拉流 En:Http pull flow */ if([@"0" isEqualToString:code]){ displayLab = @"start private protocol"; return; } if([@"1000" isEqualToString:code] || [@"4000" isEqualToString:code]) { displayLab = @"play private protocol Succeed!"; return; } } if ([RTSP_Result_String(STATE_RTSP_TEARDOWN_ERROR) isEqualToString:code]) { dispatch_async(dispatch_get_main_queue(), ^{ m_tipLab.text = @"rtsp teardown"; }); return; } if ([RTSP_Result_String(STATE_RTSP_PLAY_READY) isEqualToString:code]) { dispatch_async(dispatch_get_main_queue(), ^{ if (YES == m_isSeeking) { if (Pause == m_playState) { m_playState = Play; Float64 m_Rate = m_playSlider.value / (m_playSlider.maximumValue - m_playSlider.minimumValue); [m_play seek:m_Rate * m_deltaTime]; } else { m_isSeeking = NO; } } }); return; } if ([RTSP_Result_String(STATE_RTSP_FILE_PLAY_OVER) isEqualToString:code]) { dispatch_async(dispatch_get_main_queue(), ^{ }); return; } if ([RTSP_Result_String(STATE_RTSP_PAUSE_READY) isEqualToString:code]) { dispatch_async(dispatch_get_main_queue(), ^{ }); return; } if ([RTSP_Result_String(STATE_RTSP_KEY_MISMATCH) isEqualToString:code]) { displayLab = @"Key Error"; } else { displayLab = [NSString stringWithFormat:@"Rest Failed,[%@]", code]; } dispatch_async(dispatch_get_main_queue(), ^{ [m_tipLab setText:displayLab]; [self hideLoading]; m_playImg.hidden = NO; m_playState = Stop; [m_playBtn setBackgroundImage:[UIImage leChangeImageNamed:VideoPlay_Play_Png] forState:UIControlStateNormal]; m_playBtn.enabled = YES; [self enableOtherBtn:NO]; [m_play stopDeviceRecord:NO]; m_startTimeLab.text = [self transformToShortTime:m_beginTimeSelected]; [m_playSlider setValue:0]; }); return; } #pragma mark - 云录像播放回调(En:Cloud video playback callback) - (void)onPlayCloudRecordResult:(NSString*)code Type:(NSInteger)type { NSLog(@"code[%@] type[%ld]", code, (long)type); if (99 == type) { NSString* hint = [code isEqualToString:@"-1000"] ? NSLocalizedString(NETWORK_TIMEOUT_TXT, nil) : [NSLocalizedString(REST_LINK_FAILED_TXT, nil) stringByAppendingFormat:@",[%@]", code]; dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"RecordPlayViewController, OpenApi connect error!"); m_tipLab.text = hint; [self hideLoading]; m_playState = Stop; m_playImg.hidden = NO; m_playBtn.enabled = YES; [self enableOtherBtn:NO]; }); return; } if ([HLS_Result_String(HLS_DOWNLOAD_FAILD) isEqualToString:code]) { dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"HLS DOWNLOAD FAILED!"); m_tipLab.text = @"HLS download failed"; [self hideLoading]; m_playState = Stop; m_playImg.hidden = NO; m_playBtn.enabled = YES; [self enableOtherBtn:NO]; [m_playBtn setBackgroundImage:[UIImage leChangeImageNamed:VideoPlay_Play_Png] forState:UIControlStateNormal]; m_startTimeLab.text = [self transformToShortTime:m_beginTimeSelected]; [m_playSlider setValue:0]; }); return; } if ([HLS_Result_String(HLS_DOWNLOAD_BEGIN) isEqualToString:code]) { dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"HLS DOWNLOAD BEGIN!"); }); return; } if ([HLS_Result_String(HLS_DOWNLOAD_END) isEqualToString:code]) { dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"HLS DOWNLOAD END!"); }); return; } if ([HLS_Result_String(HLS_SEEK_SUCCESS) isEqualToString:code]) { dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"HLS SEEK SUCCESS!"); m_isSeeking = NO; [self hideLoading]; }); return; } if ([HLS_Result_String(HLS_SEEK_FAILD) isEqualToString:code]) { dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"HLS SEEK FAILD!"); [m_play stopCloud:NO]; m_playState = Stop; [self hideLoading]; [m_playBtn setBackgroundImage:[UIImage leChangeImageNamed:VideoPlay_Play_Png] forState:UIControlStateNormal]; m_startTimeLab.text = [self transformToShortTime:m_beginTimeSelected]; [m_playSlider setValue:0]; }); return; } if ([HLS_Result_String(HLS_ABORT_DONE) isEqualToString:code]) { dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"HLS ABORT DONE!"); m_startTimeLab.text = [self transformToShortTime:m_beginTimeSelected]; [m_playSlider setValue:0]; }); return; } if ([HLS_Result_String(HLS_RESUME_DONE) isEqualToString:code]) { dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"HLS RESUME DONE!"); }); return; } if ([HLS_Result_String(HLS_KEY_ERROR) isEqualToString:code]) { dispatch_async(dispatch_get_main_queue(), ^{ [m_play stopCloud:NO]; [self hideLoading]; m_tipLab.text = @"Key Error"; m_playState = Stop; m_playImg.hidden = NO; m_playBtn.enabled = YES; [self enableOtherBtn:NO]; [m_playBtn setBackgroundImage:[UIImage leChangeImageNamed:VideoPlay_Play_Png] forState:UIControlStateNormal]; }); return; } } #pragma mark - 录像开始播放回调(En:Video start playback callback) - (void)onPlayBegan:(NSInteger)index { dispatch_async(dispatch_get_main_queue(), ^{ [m_playBtn setBackgroundImage:[UIImage leChangeImageNamed:VideoPlay_Pause_Png] forState:UIControlStateNormal]; m_tipLab.text = @"start to play"; m_playState = Play; m_isSeeking = NO; [self hideLoading]; m_playImg.hidden = YES; m_playBtn.enabled = YES; [self enableOtherBtn:YES]; }); } #pragma mark - 录像播放结束回调(En:Video playback end callback) - (void)onPlayFinished:(NSInteger)index { dispatch_async(dispatch_get_main_queue(), ^{ if (DeviceRecord == m_recordType) { [m_play stopDeviceRecord:YES]; } else if (CloudRecord == m_recordType) { [m_play stopCloud:YES]; } m_tipLab.text = @"play over"; [self hideLoading]; [self enableOtherBtn:NO]; [m_startTimeLab setText:[self transformToShortTime:m_beginTimeSelected]]; [m_playSlider setValue:m_playSlider.minimumValue animated:YES]; m_playState = Stop; [m_playBtn setBackgroundImage:[UIImage leChangeImageNamed:VideoPlay_Play_Png] forState:UIControlStateNormal]; }); } #pragma mark - 录像时间状态回调(En:Recording time status callback) - (void)onPlayerTime:(long)time Index:(NSInteger)index { if (YES == m_isSeeking) { return; } dispatch_async(dispatch_get_main_queue(), ^{ NSString* currentTime = [self transformTimeFromLong:time]; [m_startTimeLab setText:[self transformToShortTime:currentTime]]; NSLog(@"_m_startTimeLab.text = %@", m_startTimeLab.text); Float64 rate = [self transformToDeltaTime:m_beginTimeSelected EndTime:currentTime] / m_deltaTime; Float64 slider_value = rate * (m_playSlider.maximumValue - m_playSlider.minimumValue); [m_playSlider setValue:slider_value animated:YES]; }); } #pragma mark - TS/PS标准流数据回调(En:TS/PS standard stream data callback) - (void)onStreamCallback:(NSData*)data Index:(NSInteger)index { if (m_streamPath) { NSFileHandle* fileHandle = [NSFileHandle fileHandleForUpdatingAtPath:m_streamPath]; /** Ch:将节点跳到文件的末尾 En:Jump node to the end of the file */ [fileHandle seekToEndOfFile]; /** Ch:追加写入数据 En:Append write data */ [fileHandle writeData:data]; [fileHandle closeFile]; return; } NSDateFormatter* dataFormat = [[NSDateFormatter alloc] init]; [dataFormat setDateFormat:@"yyyyMMddHHmmss"]; NSString* strDate = [dataFormat stringFromDate:[NSDate date]]; NSArray* paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES); NSString* libraryDirectory = [paths objectAtIndex:0]; NSString* myDirectory = [libraryDirectory stringByAppendingPathComponent:@"lechange"]; NSString* davDirectory = [myDirectory stringByAppendingPathComponent:@"HLSexportStream"]; m_streamPath = [davDirectory stringByAppendingFormat:@"/%@.ps", strDate]; NSFileManager* fileManage = [NSFileManager defaultManager]; NSError* pErr; BOOL isDir; if (NO == [fileManage fileExistsAtPath:myDirectory isDirectory:&isDir]) { [fileManage createDirectoryAtPath:myDirectory withIntermediateDirectories:YES attributes:nil error:&pErr]; } if (NO == [fileManage fileExistsAtPath:davDirectory isDirectory:&isDir]) { [fileManage createDirectoryAtPath:davDirectory withIntermediateDirectories:YES attributes:nil error:&pErr]; } if (NO == [fileManage fileExistsAtPath:m_streamPath]) //如果不存在 { [data writeToFile:m_streamPath atomically:YES]; } } #pragma mark - 返回上级界面(En:Return to the superior interface) - (void)onBack { if (m_play) { switch (m_recordType) { case DeviceRecord: [m_play stopDeviceRecord:NO]; break; case CloudRecord: [m_play stopCloud:NO]; default: break; } m_playState = Stop; } [self dismissViewControllerAnimated:YES completion:nil]; [self.navigationController popViewControllerAnimated:YES]; } - (NSTimeInterval)timeIntervalOfString:(NSString*)strTime { NSString* regex = @"[1-9]\\d{3}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}"; NSPredicate* pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex]; if (![pred evaluateWithObject:strTime]) { NSLog(@"Time format error:%@", strTime); return 0; } NSDateFormatter* formatter = [[NSDateFormatter alloc] init]; [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; NSDate* date = [formatter dateFromString:strTime]; return [date timeIntervalSince1970]; } - (NSTimeInterval)transformToDeltaTime:(NSString*)beginTime EndTime:(NSString*)endTime { NSTimeInterval t_beginTime; NSTimeInterval t_endTime; NSTimeInterval t_deltaTime; t_beginTime = [self timeIntervalOfString:beginTime]; t_endTime = [self timeIntervalOfString:endTime]; if (t_endTime >= t_beginTime && t_beginTime != 0 && t_endTime != 0) { t_deltaTime = t_endTime - t_beginTime; } else { return 0; } return t_deltaTime; } - (NSString*)transformToShortTime:(NSString*)time { NSString* regex = @"[1-9]\\d{3}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}"; NSPredicate* pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex]; if (![pred evaluateWithObject:time]) { NSLog(@"Time format error:%@", time); return 0; } NSString* shortTime; NSArray* array = [time componentsSeparatedByString:@" "]; NSLog(@"array:%@", array); shortTime = array[1]; return shortTime; } - (NSString*)transformTimeFromLong:(long)time { NSDate* resDate = [NSDate dateWithTimeIntervalSince1970:time]; NSDateFormatter* formatter = [[NSDateFormatter alloc] init]; formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss"; NSString* strTime = [formatter stringFromDate:resDate]; NSLog(@"时间戳转日期%@", strTime); return strTime; } - (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { [self layoutViews:toInterfaceOrientation force:NO]; } - (void)viewWillLayoutSubviews { NSLog(@"do nothing, but rewrite method! "); } - (void)layoutViews:(UIInterfaceOrientation)InterfaceOrientation force:(BOOL)beForce { CGFloat width = [[[UIDevice currentDevice] systemVersion] floatValue] < 7 ? m_screenFrame.size.width - 20 : m_screenFrame.size.width; if (UIInterfaceOrientationIsPortrait(InterfaceOrientation)) { [m_scalBtn setBackgroundImage:[UIImage leChangeImageNamed:VideoPlay_FullScreen_Png] forState:UIControlStateNormal]; [m_play setWindowFrame:CGRectMake(0, super.m_yOffset, m_screenFrame.size.width, m_screenFrame.size.width * 9 / 16)]; m_playImg.frame = CGRectMake(0, super.m_yOffset, m_screenFrame.size.width, m_screenFrame.size.width * 9 / 16); m_progressInd.center = m_playImg.center; m_playBarView.frame = CGRectMake(0, super.m_yOffset + m_playImg.frame.size.height - RECORD_BAR_HEIGHT, m_playImg.frame.size.width, RECORD_BAR_HEIGHT); [self refreshSubView]; super.m_navigationBar.hidden = NO; } else { [m_scalBtn setBackgroundImage:[UIImage leChangeImageNamed:VideoPlay_SmallScreen_Png] forState:UIControlStateNormal]; [m_play setWindowFrame:CGRectMake(0, 0, m_screenFrame.size.height, width)]; m_playImg.frame = CGRectMake(0, 0, m_screenFrame.size.height, width); m_progressInd.center = m_playImg.center; m_playBarView.frame = CGRectMake(0, width - RECORD_BAR_HEIGHT, m_screenFrame.size.height, RECORD_BAR_HEIGHT); [self refreshSubView]; [self.view bringSubviewToFront:m_playBarView]; super.m_navigationBar.hidden = YES; } } - (BOOL)shouldAutorotate { return YES; } - (void)showLoading { dispatch_async(dispatch_get_main_queue(), ^{ [m_progressInd startAnimating]; }); } - (void)hideLoading { dispatch_async(dispatch_get_main_queue(), ^{ if ([m_progressInd isAnimating]) { [m_progressInd stopAnimating]; } }); } - (void)onActive:(id)sender { } - (void)onResignActive:(id)sender { if (m_play) { [m_play stopCloud:NO]; [m_play stopDeviceRecord:NO]; [m_play stopAudio]; m_playState = Stop; } dispatch_async(dispatch_get_main_queue(), ^{ [self hideLoading]; m_playImg.hidden = NO; [m_playBtn setBackgroundImage:[UIImage leChangeImageNamed:VideoPlay_Play_Png] forState:UIControlStateNormal]; [self enableOtherBtn:NO]; m_startTimeLab.text = [self transformToShortTime:m_beginTimeSelected]; [m_playSlider setValue:0]; }); } @end