PlayBackViewController.mm 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385
  1. //
  2. // PlayBackViewController.m
  3. // FunSDKDemo
  4. //
  5. // Created by XM on 2018/10/19.
  6. // Copyright © 2018年 XM. All rights reserved.
  7. //
  8. #import "PlayBackViewController.h"
  9. #import "PlayView.h"
  10. #import "PlayFunctionView.h"
  11. #import "PlayMenuView.h"
  12. #import "DateSelectView.h"
  13. #import "VideoFileConfig.h"
  14. #import "MediaPlaybackControl.h"
  15. #import "NSDate+TimeCategory.h"
  16. #import "ProgressBackView.h"
  17. #import "FishPlayControl.h"
  18. @interface PlayBackViewController ()<DateSelectViewDelegate,VideoFileConfigDelegate,MediaplayerControlDelegate,basePlayFunctionViewDelegate,MediaPlayBackControlDelegate>
  19. {
  20. PlayView *pVIew; //播放画面
  21. PlayFunctionView *toolView; //工具栏
  22. PlayMenuView *playMenuView; //下方功能栏
  23. ChannelObject *channel; //选择播放的通道信息
  24. MediaPlaybackControl *mediaPlayer; //播放媒体工具
  25. DateSelectView *dateView; //时间选择器界面
  26. VideoFileConfig *videoConfig; //录像文件管理器
  27. ProgressBackView *pBackView; //时间轴所在的view
  28. FishPlayControl *feyeControl; //鱼眼控制器
  29. }
  30. //导航栏右边的时间按钮
  31. @property (nonatomic, strong) UIBarButtonItem *rightBarBtn;
  32. //导航栏左边的返回按钮
  33. @property (nonatomic, strong) UIBarButtonItem *leftBarBtn;
  34. @end
  35. @implementation PlayBackViewController
  36. - (void)viewDidLoad {
  37. [super viewDidLoad];
  38. //创建导航栏
  39. [self setNaviStyle];
  40. //创建预览界面
  41. [self createPlayView];
  42. //创建时间轴背景view
  43. [self createProgressBackView];
  44. //创建工具栏界面
  45. [self createToolView];
  46. //创建一个隐藏的时间选择器界面
  47. [self createDateView];
  48. //获取要播放的设备信息
  49. [self initDataSource];
  50. //开始搜索录像文件
  51. [self startSearchFile];
  52. }
  53. #pragma mark - 开始播放视频
  54. - (void)startSearchFile {
  55. pBackView.date = dateView.date;
  56. [videoConfig getDeviceVideoByTime:dateView.date];
  57. }
  58. #pragma mark - 预览对象初始化
  59. - (void)initDataSource {
  60. channel = [[[DeviceControl getInstance] getSelectChannelArray] firstObject];
  61. mediaPlayer = [[MediaPlaybackControl alloc] init];
  62. mediaPlayer.devID = channel.deviceMac;//设备序列号
  63. mediaPlayer.channel = channel.channelNumber;//当前通道号
  64. mediaPlayer.stream = 1;//辅码流
  65. mediaPlayer.renderWnd = pVIew;
  66. mediaPlayer.delegate = self;
  67. mediaPlayer.playbackDelegate = self;
  68. videoConfig = [[VideoFileConfig alloc] init];
  69. videoConfig.delegate = self;
  70. }
  71. -(FishPlayControl*)feyeControl{
  72. if (feyeControl == nil) {
  73. feyeControl = [[FishPlayControl alloc] init];
  74. }
  75. return feyeControl;
  76. }
  77. #pragma mark - 界面初始化
  78. - (void)createPlayView {
  79. pVIew = [[PlayView alloc] initWithFrame:CGRectMake(0, NavAndStatusHight, ScreenWidth, realPlayViewHeight)];
  80. [self.view addSubview:pVIew];
  81. [pVIew refreshView];
  82. }
  83. - (void)setNaviStyle {
  84. self.view.backgroundColor = [UIColor whiteColor];
  85. self.navigationItem.title = TS("Remote_View");
  86. self.rightBarBtn = [[UIBarButtonItem alloc] initWithImage:nil style:UIBarButtonItemStylePlain target:self action:@selector(pushToNextViewController)];
  87. self.navigationItem.rightBarButtonItem = self.rightBarBtn;
  88. self.rightBarBtn.width = 15;
  89. [self setBtnRightTitle:[NSDate date]];
  90. self.leftBarBtn = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"new_back.png"] style:UIBarButtonItemStylePlain target:self action:@selector(popViewController)];
  91. self.navigationItem.leftBarButtonItem = self.leftBarBtn;
  92. }
  93. //设置当前选择的时间
  94. -(void)setBtnRightTitle:(NSDate*)selectDate
  95. {
  96. NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
  97. [dateFormat setDateFormat:@"MM-dd"];
  98. self.rightBarBtn.title = [dateFormat stringFromDate:selectDate];
  99. }
  100. #pragma mark - 创建工具栏
  101. -(void)createToolView{
  102. if (!toolView) {
  103. toolView = [[PlayFunctionView alloc] initWithFrame:CGRectMake(0, 0, ScreenWidth, ToolViewHeight)];
  104. toolView.Devicedelegate = self;
  105. }
  106. toolView.hidden = NO;
  107. toolView.playMode = REALPLAY_MODE;
  108. toolView.screenVertical = YES;
  109. [toolView showPlayFunctionView];
  110. toolView.frame = CGRectMake(0, NavAndStatusHight+ realPlayViewHeight, ScreenWidth, ToolViewHeight);
  111. [self.view addSubview:toolView];
  112. [toolView setPlayMode:PLAYBACK_MODE];
  113. }
  114. #pragma mark - 创建一个隐藏的时间选择器界面
  115. -(void)createDateView
  116. {
  117. dateView = [[DateSelectView alloc] initWithFrame:CGRectMake(0, NavHeight , ScreenWidth, ScreenHeight - NavHeight)];
  118. dateView.delegate = self;
  119. [self.view addSubview:dateView];
  120. }
  121. #pragma mark - 创建时间轴背景view
  122. -(void)createProgressBackView
  123. {
  124. pBackView = [[ProgressBackView alloc] initWithFrame:CGRectMake(0, NavHeight + realPlayViewHeight + 60, ScreenWidth, ScreenHeight - NavHeight - realPlayViewHeight - NavHeight)];
  125. [self.view addSubview:pBackView];
  126. //滑动时间轴之后的回调
  127. __weak typeof(self) weakSelf = self;
  128. pBackView.TouchSeektoTime = ^ (NSInteger _add){
  129. [weakSelf touchAndSeekToTime:_add];
  130. };
  131. }
  132. #pragma mark - buttonEvent
  133. #pragma mark 工具栏点击 - 暂停、音频、速度、抓图、录像
  134. - (void)basePlayFunctionViewBtnClickWithBtn:(int)tag {
  135. if ((CONTROL_TYPE)tag == CONTROL_REALPLAY_CloseChannle) {
  136. //点击暂停按钮,暂停预览
  137. if (mediaPlayer.status == MediaPlayerStatusPlaying) {
  138. [mediaPlayer pause];
  139. }else if (mediaPlayer.status == MediaPlayerStatusPause) {
  140. [mediaPlayer resumue];
  141. }
  142. }if ((CONTROL_TYPE)tag == CONTROL_REALPLAY_VOICE) {
  143. //点击音频按钮,打开音频
  144. if (mediaPlayer.voice == MediaVoiceTypeNone) {
  145. //音频没有回调,所以直接在这里刷新界面
  146. [self openSound];
  147. }else if (mediaPlayer.voice == MediaVoiceTypeVoice){
  148. [self closeSound];
  149. }
  150. }if ((CONTROL_TYPE)tag == CONTROL_TYPE_SPEED) {
  151. //点击速度切换按钮,1倍速度和2倍速度之间切换
  152. if(mediaPlayer.speed == MediaSpeedStateNormal){
  153. [mediaPlayer setPlaySpeed:1];
  154. }else{
  155. [mediaPlayer setPlaySpeed:0];
  156. }
  157. }if ((CONTROL_TYPE)tag == CONTROL_REALPLAY_SNAP) {
  158. //开始抓图
  159. [mediaPlayer snapImage];
  160. }if ((CONTROL_TYPE)tag == CONTROL_REALPLAY_VIDEO) {
  161. //开始和停止录像
  162. if (mediaPlayer.record == MediaRecordTypeNone) {
  163. [mediaPlayer startRecord];
  164. }else if (mediaPlayer.record == MediaRecordTypeRecording){
  165. [mediaPlayer stopRecord];
  166. }
  167. }
  168. }
  169. #pragma mark 停止播放音频
  170. - (void)closeSound {
  171. if (mediaPlayer.voice == MediaVoiceTypeVoice){
  172. [mediaPlayer closeSound];
  173. mediaPlayer.voice = MediaVoiceTypeNone;
  174. [toolView refreshFunctionView:CONTROL_REALPLAY_VOICE result:NO];
  175. }
  176. }
  177. #pragma mark 开始播放音频
  178. - (void)openSound {
  179. if (mediaPlayer.voice == MediaVoiceTypeNone){
  180. [mediaPlayer openSound:100];
  181. mediaPlayer.voice = MediaVoiceTypeVoice;
  182. [toolView refreshFunctionView:CONTROL_REALPLAY_VOICE result:YES];
  183. }
  184. }
  185. #pragma mark - 拖动时间轴切换播放时间,并且刷新播放状态
  186. -(void)touchAndSeekToTime:(NSInteger)addTime
  187. {
  188. pBackView.ifSliding = NO;
  189. [pVIew playViewBufferIng];
  190. [mediaPlayer seekToTime:addTime];
  191. }
  192. #pragma mark - 跳转到设备下一级界面
  193. - (void)pushToNextViewController {
  194. if (dateView && dateView.hidden == YES) {
  195. [dateView dateSelectVIewShow];
  196. [self.view bringSubviewToFront:dateView];
  197. }
  198. }
  199. #pragma mark - 选择日期之后的接口方法
  200. -(void)dateSelectedAction:(BOOL)Result
  201. {
  202. if (Result == NO) {
  203. return;
  204. }
  205. //重新选择日期之后,开始搜索和播放的流程
  206. if ([NSDate checkDate:pBackView.date WithDate:dateView.date]) {
  207. //判断是否为同一天
  208. return;
  209. }
  210. [self setBtnRightTitle:dateView.date];
  211. //停止当前回放
  212. [mediaPlayer stopRecord];
  213. [self closeSound];
  214. [mediaPlayer refresh];
  215. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  216. [mediaPlayer stop];
  217. });
  218. [self startSearchFile];
  219. }
  220. #pragma mark - 返回设备列表界面
  221. - (void)popViewController {
  222. [mediaPlayer stopRecord];
  223. [self closeSound];
  224. [mediaPlayer stop];
  225. [self.navigationController popViewControllerAnimated:YES];
  226. }
  227. #pragma mark - funsdk回调
  228. #pragma mark 录像按文件查询查询回调
  229. - (void)getVideoResult:(NSInteger)result{
  230. if (result >= 0) {
  231. [pBackView refreshProgressWithSearchResult:[videoConfig getVideoTimeArray]];
  232. [pVIew playViewBufferIng];
  233. [mediaPlayer startPlayBack:dateView.date];
  234. }
  235. else{
  236. [SVProgressHUD showErrorWithStatus:TS("Video_Not_Found")];
  237. }
  238. }
  239. #pragma mark 通过搜索录像返回的时间来刷新时间轴
  240. - (void)addTimeDelegate:(NSInteger)add{
  241. if (pBackView != nil) {
  242. [pBackView refreshWithAddTime:add];
  243. }
  244. }
  245. #pragma mark 录像回放时间帧回调,用来刷新label时间显示和时间轴
  246. -(void)mediaPlayer:(MediaplayerControl *)mediaPlayer timeInfo:(int)timeinfo{
  247. if (pBackView != nil && pBackView.ifSliding == NO) {
  248. [pBackView refreshTimeAndProgress:timeinfo];
  249. }
  250. }
  251. #pragma mark - 开始预览结果回调
  252. -(void)mediaPlayer:(MediaplayerControl*)mediaPlayer startResult:(int)result DSSResult:(int)dssResult {
  253. if (result < 0) {
  254. [MessageUI ShowErrorInt:result];
  255. }else {
  256. if (dssResult == 3) { //DSS 打开视频成功
  257. }else if (dssResult == 5){//RPS打开预览成功
  258. }
  259. [pVIew playViewBufferIng];
  260. }
  261. }
  262. #pragma mark - 视频缓冲中
  263. -(void)mediaPlayer:(MediaplayerControl*)mediaPlayer buffering:(BOOL)isBuffering {
  264. if (isBuffering == YES) {//开始缓冲
  265. [pVIew playViewBufferIng];
  266. }else{//缓冲完成
  267. [pVIew playViewBufferEnd];
  268. }
  269. }
  270. #pragma mark - 录像开始结果
  271. -(void)mediaPlayer:(MediaplayerControl*)mediaPlayer startRecordResult:(int)result path:(NSString*)path {
  272. if (result == EE_OK) { //开始录像成功
  273. mediaPlayer.record = MediaRecordTypeRecording;
  274. [toolView refreshFunctionView:CONTROL_REALPLAY_VIDEO result:YES];
  275. }else{
  276. [MessageUI ShowErrorInt:result];
  277. [toolView refreshFunctionView:CONTROL_REALPLAY_VIDEO result:NO];
  278. }
  279. }
  280. #pragma mark - 录像结束结果
  281. -(void)mediaPlayer:(MediaplayerControl*)mediaPlayer stopRecordResult:(int)result path:(NSString*)path {
  282. if (result == EE_OK) { //结束录像成功
  283. [SVProgressHUD showSuccessWithStatus:TS("Success") duration:2.0];
  284. }else{
  285. [MessageUI ShowErrorInt:result];
  286. }
  287. [toolView refreshFunctionView:CONTROL_REALPLAY_VIDEO result:NO];
  288. mediaPlayer.record = MediaRecordTypeNone;
  289. }
  290. #pragma mark 抓图结果
  291. -(void)mediaPlayer:(MediaplayerControl*)mediaPlayer snapImagePath:(NSString *)path result:(int)result {
  292. if (result == EE_OK) { //抓图成功
  293. [SVProgressHUD showSuccessWithStatus:TS("Success") duration:2.0];
  294. }else{
  295. [MessageUI ShowErrorInt:result];
  296. }
  297. }
  298. #pragma mark 设置速度结果
  299. -(void)setPlaySpeedResult:(int)result{
  300. if (result >= 0) {
  301. if(result == 0){
  302. mediaPlayer.speed = MediaSpeedStateNormal;
  303. [toolView refreshFunctionView:CONTROL_TYPE_SPEED result:NO];
  304. }else{
  305. mediaPlayer.speed = MediaSpeedStateAdd;
  306. [toolView refreshFunctionView:CONTROL_TYPE_SPEED result:YES];
  307. }
  308. }else{
  309. [MessageUI ShowErrorInt:result];
  310. }
  311. }
  312. #pragma mark 用户自定义信息帧回调,通过这个判断是什么模式在预览
  313. -(void)mediaPlayer:(MediaplayerControl*)mediaPlayer Hardandsoft:(int)Hardandsoft Hardmodel:(int)Hardmodel {
  314. if (Hardandsoft == 3 || Hardandsoft == 4 || Hardandsoft == 5) {
  315. //创建鱼眼预览界面
  316. [self createFeye:Hardandsoft Hardmodel:Hardmodel];
  317. }
  318. }
  319. #pragma mark YUV数据回调
  320. -(void)mediaPlayer:(MediaplayerControl*)mediaPlayer width:(int)width height:(int)height pYUV:(unsigned char *)pYUV {
  321. [self.feyeControl PushData:width height:height YUVData:pYUV];
  322. }
  323. #pragma mark - 设备时间(鱼眼)
  324. -(void)mediaPlayer:(MediaplayerControl*)mediaPlayer DevTime:(NSString *)time {
  325. [self.feyeControl setTimeLabelText:time];
  326. }
  327. #pragma mark 鱼眼软解坐标参数
  328. -(void)centerOffSetX:(MediaplayerControl*)mediaPlayer offSetx:(short)OffSetx offY:(short)OffSetY radius:(short)radius width:(short)width height:(short)height {
  329. [self.feyeControl centerOffSetX:OffSetx offY:OffSetY radius:radius width:width height:height];
  330. }
  331. #pragma mark 鱼眼画面智能分析报警自动旋转画面
  332. -(void)mediaPlayer:(MediaplayerControl*)mediaPlayer AnalyzelLength:(int)length site:(int)type Analyzel:(char*)area {
  333. }
  334. #pragma mark 初始化鱼眼播放界面
  335. -(void)createFeye:(int)Hardandsoft Hardmodel:(int)Hardmodel{
  336. [self.feyeControl createFeye:Hardandsoft frameSize:pVIew.frame];
  337. GLKViewController *glkVC= [self.feyeControl getFeyeViewController];
  338. [self addChildViewController:glkVC];
  339. [pVIew addSubview:glkVC.view];
  340. [self.feyeControl refreshSoftModel:(int)Hardandsoft model:Hardmodel];
  341. }
  342. @end