VideoFileConfig.mm 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. //
  2. // VideoFileConfig.m
  3. // FunSDKDemo
  4. //
  5. // Created by XM on 2018/11/13.
  6. // Copyright © 2018年 XM. All rights reserved.
  7. //
  8. #define MAX_FINDFILE_SIZE 10000 //每次搜索的最大文件数量,可以根据需要自行设置
  9. #import "FunSDK/FunSDK.h"
  10. #import "VideoFileConfig.h"
  11. #import "OPSCalendar.h"
  12. @interface VideoFileConfig ()
  13. {
  14. OPSCalendar canendar; //查询一个月内哪些天有录像
  15. NSMutableArray *fileArray; //按文件搜索某一天的录像数组结果
  16. NSMutableArray *timeArray; //按时间搜索某一天的录像数组结果
  17. NSMutableArray *dateArray; //搜索某一个月哪些天有录像的结果数组
  18. }
  19. @end
  20. @implementation VideoFileConfig
  21. #pragma mark - 按文件搜索设备传入这一天的录像
  22. - (void)getDeviceVideoByFile:(NSDate*)date{
  23. fileArray = [[NSMutableArray alloc] initWithCapacity:0];
  24. //获取通道
  25. ChannelObject *channel = [[DeviceControl getInstance] getSelectChannel];
  26. NSDateComponents* components = [[NSCalendar currentCalendar] components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:date];
  27. //开内存
  28. H264_DVR_FINDINFO info;
  29. memset(&info, 0, sizeof(info));
  30. info.nChannelN0 = channel.channelNumber;
  31. info.nFileType = SDK_RECORD_ALL; //查询全部类型的录像
  32. //开始时间
  33. info.startTime.dwYear = (int)[components year];
  34. info.startTime.dwMonth = (int)[components month];
  35. info.startTime.dwDay = (int)[components day];
  36. info.startTime.dwHour = 0;
  37. info.startTime.dwMinute = 0;
  38. info.startTime.dwSecond = 0;
  39. //结束时间
  40. info.endTime.dwYear = (int)[components year];
  41. info.endTime.dwMonth = (int)[components month];
  42. info.endTime.dwDay = (int)[components day];
  43. info.endTime.dwHour = 23;
  44. info.endTime.dwMinute = 59;
  45. info.endTime.dwSecond = 59;
  46. //开始搜索设备录像
  47. FUN_DevFindFile(self.MsgHandle, SZSTR(channel.deviceMac), &info, MAX_FINDFILE_SIZE);
  48. }
  49. #pragma mark - 按时间搜索传入这一天的设备录像
  50. - (void)getDeviceVideoByTime:(NSDate*)date {
  51. timeArray = [[NSMutableArray alloc] initWithCapacity:0];
  52. //获取通道
  53. ChannelObject *channel = [[DeviceControl getInstance] getSelectChannel];
  54. //开内存
  55. SDK_SearchByTime info;
  56. memset(&info, 0, sizeof(info));
  57. info.nHighChannel = 0;
  58. info.nLowChannel = 0;
  59. info.nFileType = 0;
  60. info.iSync = 0;
  61. NSDateComponents* components = [[NSCalendar currentCalendar] components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:date];
  62. //搜索录像的开始时间
  63. SDK_SYSTEM_TIME stBeginTime;
  64. memset(&stBeginTime, 0, sizeof(stBeginTime));
  65. stBeginTime.year = (int)[components year];
  66. stBeginTime.month = (int)[components month];
  67. stBeginTime.day = (int)[components day];
  68. //具体开始时间可以根据需要自己设置
  69. stBeginTime.hour = 0;
  70. stBeginTime.minute = 0;
  71. stBeginTime.second = 0;
  72. info.stBeginTime = stBeginTime;
  73. //搜索录像的结束时间
  74. SDK_SYSTEM_TIME stEndTime = {0};
  75. stEndTime.year = (int)[components year];
  76. stEndTime.month = (int)[components month];
  77. stEndTime.day = (int)[components day];
  78. //具体结束时间可以根据需要自己设置,结束时间必须要比开始时间晚
  79. stEndTime.hour = 23;
  80. stEndTime.minute = 59;
  81. stEndTime.second = 59;
  82. info.stEndTime = stEndTime;
  83. int chn = channel.channelNumber;
  84. if (chn > 31){
  85. info.nHighChannel = (1 << (chn - 32));
  86. }else{
  87. info.nLowChannel = (1 << chn);
  88. }
  89. //开始按时间搜索录像
  90. FUN_DevFindFileByTime(self.MsgHandle, SZSTR(channel.deviceMac), &info);
  91. }
  92. #pragma mark - 获取一个月内有录像的日期
  93. - (void)getMonthVideoDate:(NSDate *)date {
  94. dateArray = [[NSMutableArray alloc] initWithCapacity:0];
  95. //获取通道
  96. ChannelObject *channel = [[DeviceControl getInstance] getSelectChannel];
  97. NSDateComponents * components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:date];
  98. NSString * cmd = [NSString stringWithFormat:@"{\"Name\":\"OPSCalendar\",\"OPSCalendar\": {\"Event\": \"*\",\"FileType\": \"h264\",\"Month\": %ld ,\"Rev\": \"\",\"Year\": %ld},\"SessionID\": \"0x00000001\"}",(long)[components month],(long)[components year]];
  99. FUN_DevCmdGeneral(self.MsgHandle,SZSTR(channel.deviceMac),1446, "OPSCalendar",0, 5000,strdup(SZSTR(cmd)));
  100. //解析配置用到的对象初始化
  101. CfgParam* calendarCfg = [[CfgParam alloc] initWithName:NSSTR(canendar.Name()) andDevId:channel.deviceMac andChannel:channel.channelNumber andConfig:&canendar andOnce:YES andSaveLocal:YES];
  102. [self AddCmdfig:calendarCfg];
  103. }
  104. #pragma mark - 读取各种请求录像信息的结果
  105. - (NSMutableArray *)getVideoFileArray { //获取按文件请求到的录像数组
  106. return [fileArray mutableCopy];
  107. }
  108. - (NSMutableArray *)getVideoTimeArray { //获取按时间请求到的录像数组
  109. return [timeArray mutableCopy];
  110. }
  111. - (NSMutableArray *)getMonthVideoArray { //获取设备一个月内哪些天有录像的数组
  112. int mask = canendar.Mask.Value();
  113. for( int i=0; i < 32; i++ ){
  114. //判断一个月31天内,哪一天有录像,31位二进制,等于一的日期有录像
  115. if ((mask & (1<<i)) && mask>0) {
  116. NSDateComponents * components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]];
  117. NSString* strDate = [NSString stringWithFormat:@"%04ld-%02ld-%02d",components.year, components.month, i+1];
  118. [dateArray addObject:strDate];
  119. }
  120. }
  121. return dateArray;
  122. }
  123. #pragma mark - 获取摄像机录像回调
  124. -(void)OnGetConfig:(CfgParam *)param{
  125. if ([param.name isEqualToString:NSSTR(canendar.Name())]) {
  126. NSLog(@"Mask = %d",canendar.Mask.Value());
  127. if ([self.delegate respondsToSelector:@selector(getVideoResult:)]) {
  128. [self.delegate getVideoResult:param.errorCode];
  129. }
  130. }
  131. };
  132. #pragma mark - 请求录像结果回调信息
  133. -(void)OnFunSDKResult:(NSNumber *) pParam{
  134. [super OnFunSDKResult:pParam];
  135. NSInteger nAddr = [pParam integerValue];
  136. MsgContent *msg = (MsgContent *)nAddr;
  137. switch (msg->id) {
  138. #pragma mark 录像按文件查询查询回调
  139. case EMSG_DEV_FIND_FILE: { // 录像按文件查询查询回调
  140. if (msg->param1 < 0) {
  141. [MessageUI ShowErrorInt:msg->param1];
  142. }else{
  143. [SVProgressHUD dismiss];
  144. int num = msg->param1;
  145. H264_DVR_FILE_DATA *pFile = (H264_DVR_FILE_DATA *)msg->pObject;
  146. for (int i=0; i<num; i++) {
  147. RecordInfo *recordInfo = [RecordInfo new];
  148. recordInfo.channelNo = pFile[i].ch;
  149. recordInfo.fileType = 0; //文件类型是文件名中 中括号中的大写字母表示,例如:[M] 移动侦测,[H]手动录像,[*]普通录像等等。可以参考 SDK_RECORD_ALL 的子类型
  150. recordInfo.fileName = [NSString stringWithUTF8String:pFile[i].sFileName];
  151. recordInfo.fileSize = pFile[i].size;
  152. XM_SYSTEM_TIME timeBegin;
  153. memcpy(&timeBegin, (char*)&(pFile[i].stBeginTime), sizeof(SDK_SYSTEM_TIME));
  154. recordInfo.timeBegin = timeBegin;
  155. XM_SYSTEM_TIME timeEnd;
  156. memcpy(&timeEnd, (char*)&(pFile[i].stEndTime), sizeof(SDK_SYSTEM_TIME));
  157. recordInfo.timeEnd = timeEnd;
  158. [fileArray addObject:recordInfo];
  159. }
  160. }
  161. if ([self.delegate respondsToSelector:@selector(getVideoResult:)]) {
  162. [self.delegate getVideoResult:msg->param1];
  163. }
  164. }
  165. break;
  166. #pragma mark 按时间搜索录像文件
  167. case EMSG_DEV_FIND_FILE_BY_TIME: { //按时间搜索录像文件
  168. //成功查询
  169. [SVProgressHUD dismiss];
  170. NSInteger addCount = 0;
  171. NSInteger _add = 0;
  172. if (msg->param1 < 0) {
  173. [MessageUI ShowErrorInt:msg->param1]; //没有查询到文件
  174. }else {
  175. //获取通道
  176. SDK_SearchByTimeResult *pResult = (SDK_SearchByTimeResult *)msg->pObject;
  177. SDK_SearchByTimeInfo *backData = &pResult->ByTimeInfo[0];
  178. //按时间搜索,返回的信息是720份,每份包含两分钟时长,其中包含是否有录像,录像类型,录像开始结束时间等等信息
  179. for (int i = 0; i < 720; i ++) {
  180. //每两分钟分割成两份,每份一分钟,这样一共1440份,每份TimeInfo代表一分钟
  181. ByteRecordType *pType = (ByteRecordType *)(&backData->cRecordBitMap[i]);
  182. if (pType->t0 != 0 && pType->t1 != 0) {
  183. _add = i * 60 / 2;
  184. addCount = addCount + 1;
  185. }
  186. [self createVideoDataWithType:[self getType:pType->t0] andStartTime:(i*120) andEndTime:((i*120) + 60) toArray:timeArray];
  187. [self createVideoDataWithType:[self getType:pType->t1] andStartTime:((i*120) + 60) andEndTime:(i + 1)*120 toArray:timeArray];
  188. }
  189. }
  190. if (addCount == 0) {
  191. [SVProgressHUD showErrorWithStatus:TS("无录像")];
  192. return;
  193. }
  194. if ([self.delegate respondsToSelector:@selector(addTimeDelegate:)]) {
  195. [self.delegate addTimeDelegate:_add];
  196. }
  197. if ([self.delegate respondsToSelector:@selector(getVideoResult:)]) {
  198. [self.delegate getVideoResult:msg->param1];
  199. }
  200. }
  201. break;
  202. default:
  203. break;
  204. }
  205. }
  206. //存储到 _array_Video数组中
  207. -(void)createVideoDataWithType:(enum Video_Type)type andStartTime:(int)ss andEndTime:(int)es toArray:(NSMutableArray *)array {
  208. //开辟内存
  209. TimeInfo *info = [[TimeInfo alloc] init];
  210. info.type = type;
  211. info.start_Time = ss;
  212. info.end_Time = es;
  213. [array addObject:info];
  214. }
  215. //读取录像类型
  216. -(Video_Type)getType:(int)sdkType{
  217. switch(sdkType) {
  218. case 0:
  219. return TYPE_NONE;
  220. case 1:
  221. return TYPE_NORMAL;
  222. case 2:
  223. return TYPE_ALARM;
  224. case 3:
  225. return TYPE_DETECTION;
  226. case 4:
  227. return TYPE_NORMAL;
  228. case 5:
  229. return TYPE_HAND;
  230. default:
  231. return TYPE_NORMAL;
  232. break;
  233. }
  234. return TYPE_NORMAL;
  235. }
  236. @end