MediaplayerControl.mm 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. //
  2. // MediaplayerControl.m
  3. // FunSDKDemo
  4. //
  5. // Created by XM on 2018/10/17.
  6. // Copyright © 2018年 XM. All rights reserved.
  7. //
  8. #import "MediaplayerControl.h"
  9. @implementation MediaplayerControl
  10. #pragma mark - 开启视频
  11. -(int)start{
  12. if ( self.status != MediaPlayerStatusStop) {
  13. [self stop];
  14. }
  15. if(self.status == MediaPlayerStatusStop){
  16. self.player = FUN_MediaRealPlay(self.msgHandle, [self.devID UTF8String], self.channel, self.stream, (__bridge LP_WND_OBJ)self.renderWnd, 0);
  17. }
  18. return self.player;
  19. }
  20. #pragma mark - 停止
  21. -(int)stop{
  22. self.status = MediaPlayerStatusStop;
  23. return FUN_MediaStop(self.player, 0);
  24. }
  25. #pragma mark - 暂停
  26. -(int)pause{
  27. int nRet = -1;
  28. if ( self.status == MediaPlayerStatusPlaying ) {
  29. nRet = FUN_MediaPause(self.player, 1, 0);
  30. self.status = MediaPlayerStatusPause;
  31. }
  32. return nRet;
  33. }
  34. #pragma mark - 恢复
  35. -(int)resumue{
  36. if ( self.status != MediaPlayerStatusPause ) {
  37. return -1;
  38. }
  39. self.status = MediaPlayerStatusPlaying;
  40. return FUN_MediaPause(self.player, 0);
  41. }
  42. #pragma mark - 打开音频,传递音频大小,0-100
  43. -(int)openSound:(int)soundValue{
  44. return FUN_MediaSetSound(self.player, soundValue, 0);
  45. }
  46. #pragma mark - 关闭音频
  47. -(int)closeSound{
  48. return FUN_MediaSetSound(self.player, 0, 0);
  49. }
  50. #pragma mark - 抓图
  51. -(int)snapImage{
  52. NSString *dateString = [NSString GetSystemTimeString];
  53. NSString *file = [NSString getPhotoPath];
  54. NSString *pictureFilePath = [file stringByAppendingFormat:@"/%@.jpg",dateString];
  55. return FUN_MediaSnapImage(self.player, [pictureFilePath UTF8String]);
  56. }
  57. #pragma mark - 开始录像
  58. -(int)startRecord{
  59. NSString *dateString = [NSString GetSystemTimeString];
  60. NSString *file = [NSString getVideoPath];
  61. if (self.IsYuv == YES) {
  62. //鱼眼设备录像
  63. NSString *movieFilePath = [file stringByAppendingFormat:@"/%@.fvideo",dateString];
  64. return FUN_MediaStartRecord(self.player, [movieFilePath UTF8String]);
  65. }else{
  66. //普通设备录像
  67. NSString *movieFilePath = [file stringByAppendingFormat:@"/%@.mp4",dateString];
  68. return FUN_MediaStartRecord(self.player, [movieFilePath UTF8String]);
  69. }
  70. }
  71. #pragma mark - 停止录像
  72. -(int)stopRecord{
  73. return FUN_MediaStopRecord(self.player);
  74. }
  75. #pragma mark - 切换清晰度
  76. -(void)changeStream:(int)stream{
  77. if (stream == -1) {
  78. self.stream = !self.stream;
  79. }else{
  80. self.stream = stream;
  81. }
  82. //切换码流先停止再播放
  83. [self stop];
  84. [self start];
  85. }
  86. #pragma mark - 点击云台控制的按钮,开始控制 这个接口没有回调信息
  87. -(void)controZStartlPTAction:(PTZ_ControlType)sender {
  88. FUN_DevPTZControl(self.msgHandle, SZSTR(self.devID), self.channel, sender, false, 4);
  89. }
  90. #pragma mark - 抬起云台控制的按钮,结束控制 这个接口没有回调信息
  91. -(void)controZStopIPTAction:(PTZ_ControlType)sender {
  92. FUN_DevPTZControl(self.msgHandle, SZSTR(self.devID), self.channel, sender, true, 4);
  93. }
  94. #pragma mark - 设置播放速度
  95. -(void)setPlaySpeed:(int)speed
  96. {
  97. FUN_MediaSetPlaySpeed(self.player, speed, 0);
  98. }
  99. #pragma mark FunSDK 结果
  100. -(void)OnFunSDKResult:(NSNumber *)pParam{
  101. NSInteger nAddr = [pParam integerValue];
  102. MsgContent *msg = (MsgContent *)nAddr;
  103. switch ( msg->id ) {
  104. #pragma mark 收到开始直播结果消息
  105. case EMSG_START_PLAY:{
  106. if (msg->param1==0) {
  107. self.status = MediaPlayerStatusBuffering;
  108. NSLog(@"播放成功~~");
  109. }else{
  110. self.status = MediaPlayerStatusStop;
  111. NSLog(@"播放失败~~");
  112. }
  113. if ( self.delegate && [self.delegate respondsToSelector:@selector(mediaPlayer:startResult:DSSResult:)] ) {
  114. [self.delegate mediaPlayer:self startResult:msg->param1 DSSResult:msg->param3];
  115. }
  116. }
  117. break;
  118. #pragma mark 收到暂停播放结果消息
  119. case EMSG_PAUSE_PLAY:{
  120. if (msg->param1==2) {
  121. //2为暂停
  122. self.status = MediaPlayerStatusPause;
  123. }else if (msg->param1 == 1){
  124. //1为恢复
  125. self.status = MediaPlayerStatusPlaying;
  126. }
  127. if ( self.delegate && [self.delegate respondsToSelector:@selector(mediaPlayer:pauseOrResumeResult:)] ) {
  128. [self.delegate mediaPlayer:self pauseOrResumeResult:msg->param1];
  129. }
  130. }
  131. break;
  132. #pragma mark 收到开始缓存数据结果消息
  133. case EMSG_ON_PLAY_BUFFER_BEGIN:{
  134. if ( self.delegate && [self.delegate respondsToSelector:@selector(mediaPlayer:buffering:)] ) {
  135. [self.delegate mediaPlayer:self buffering:YES];
  136. }
  137. }
  138. break;
  139. #pragma mark 收到缓冲结束开始有画面结果消息
  140. case EMSG_ON_PLAY_BUFFER_END:{
  141. if (msg->param1==0) {
  142. self.status = MediaPlayerStatusPlaying;
  143. }
  144. if ( self.delegate && [self.delegate respondsToSelector:@selector(mediaPlayer:buffering:)] ) {
  145. [self.delegate mediaPlayer:self buffering:NO];
  146. }
  147. }
  148. break;
  149. #pragma mark 媒体通道网络异常断开
  150. case EMSG_ON_MEDIA_NET_DISCONNECT:{
  151. if ( self.delegate && [self.delegate respondsToSelector:@selector(mediaPlayer:startResult:DSSResult:)] ) {
  152. [self.delegate mediaPlayer:self startResult:EE_DVR_SUB_CONNECT_ERROR DSSResult:msg->param3];
  153. }
  154. }
  155. break;
  156. #pragma mark 收到抓图回调结果消息
  157. case EMSG_SAVE_IMAGE_FILE:{
  158. if ( self.delegate && [self.delegate respondsToSelector:@selector(mediaPlayer:snapImagePath:result:)] ) {
  159. [self.delegate mediaPlayer:self snapImagePath:NSSTR(msg->szStr) result:msg->param1];
  160. }
  161. }
  162. break;
  163. #pragma mark 收到查询直播信息结果消息
  164. case EMSG_ON_PLAY_INFO:{
  165. if (msg->param1 <0) {
  166. //缓冲结束之后播放失败
  167. if ( self.delegate && [self.delegate respondsToSelector:@selector(mediaPlayer:startResult:DSSResult:)] ) {
  168. [self.delegate mediaPlayer:self startResult:msg->param1 DSSResult:msg->param3];
  169. }
  170. break;
  171. }
  172. const char *time=msg->szStr;
  173. NSString *str = [NSString stringWithUTF8String:time];
  174. NSString *devtime;
  175. if (str.length >18) {
  176. devtime = [str substringToIndex:19];
  177. }
  178. if ( self.delegate && [self.delegate respondsToSelector:@selector(mediaPlayer:info1:info2:)] ) {
  179. //播放信息
  180. [self.delegate mediaPlayer:self info1:msg->param1 info2:NSSTR(msg->szStr)];
  181. }
  182. if ( self.delegate && [self.delegate respondsToSelector:@selector(mediaPlayer:DevTime:)] ) {
  183. //设备时间
  184. [self.delegate mediaPlayer:self DevTime:devtime];
  185. }
  186. if ([self.delegate respondsToSelector:@selector(mediaPlayer:timeInfo:)]) {
  187. //回放时间
  188. [self.delegate mediaPlayer:self timeInfo:msg->param2];
  189. }
  190. }
  191. break;
  192. #pragma mark 收到开始录像结果消息
  193. case EMSG_START_SAVE_MEDIA_FILE:{
  194. if ( self.delegate && [self.delegate respondsToSelector:@selector(mediaPlayer:startRecordResult:path:)] ) {
  195. [self.delegate mediaPlayer:self startRecordResult:msg->param1 path:[NSString stringWithUTF8String:msg->szStr]];
  196. }
  197. }
  198. break;
  199. #pragma mark 收到停止录像结果消息
  200. case EMSG_STOP_SAVE_MEDIA_FILE:{
  201. if ( self.delegate && [self.delegate respondsToSelector:@selector(mediaPlayer:stopRecordResult:path:)] ) {
  202. [self.delegate mediaPlayer:self stopRecordResult:msg->param1 path:[NSString stringWithUTF8String:msg->szStr]];
  203. }
  204. }
  205. break;
  206. #pragma mark 停止播放
  207. case EMSG_STOP_PLAY:{
  208. if ([self.delegate respondsToSelector:@selector(mediaPlayer:stopResult:)]) {
  209. [self.delegate mediaPlayer:self stopResult:msg->param1];
  210. }
  211. }
  212. break;
  213. #pragma mark 刷新播放
  214. case EMSG_REFRESH_PLAY:{
  215. if (self.delegate && [self.delegate respondsToSelector:@selector(mediaPlayer:refreshPlayResult:)]) {
  216. [self.delegate mediaPlayer:self refreshPlayResult:msg->param1];
  217. }
  218. }
  219. break;
  220. #pragma mark -鱼眼相关处理
  221. #pragma mark 用户自定义信息帧回调
  222. case EMSG_ON_FRAME_USR_DATA:{
  223. int Hardandsoft = 0;//软解
  224. int Hardmodel = 0 ;
  225. if (msg->param2 == 3 ) {
  226. SDK_FishEyeFrameHW fishFrame = {0};
  227. memcpy(&fishFrame, msg->pObject + 8, sizeof(SDK_FishEyeFrameHW));
  228. if (fishFrame.secene == SDK_FISHEYE_SECENE_P360_FE) {
  229. Hardandsoft = 3;
  230. Hardmodel = SDK_FISHEYE_SECENE_P360_FE;
  231. FUN_SetIntAttr(self.player, EOA_MEDIA_YUV_USER, self.msgHandle);//返回Yuv数据
  232. FUN_SetIntAttr(self.player, EOA_SET_MEDIA_VIEW_VISUAL, 0);//自己画画面
  233. self.IsYuv = YES;
  234. }else if (fishFrame.secene == SDK_FISHEYE_SECENE_RRRR_R) {
  235. Hardandsoft = 3;
  236. Hardmodel = SDK_FISHEYE_SECENE_RRRR_R;
  237. FUN_SetIntAttr(self.player, EOA_MEDIA_YUV_USER, 0);//不返回Yuv数据
  238. FUN_SetIntAttr(self.player, EOA_SET_MEDIA_VIEW_VISUAL, 1);//底层画画面
  239. self.IsYuv = NO;
  240. }
  241. }
  242. else if((msg->param2 == 4) && \
  243. (msg->param1 >= (8 + sizeof(SDK_FishEyeFrameSW)))) {
  244. SDK_FishEyeFrameSW fishFrame = {0};
  245. Hardandsoft =4;
  246. memcpy(&fishFrame, msg->pObject + 8, sizeof(SDK_FishEyeFrameSW));
  247. FUN_SetIntAttr(self.player, EOA_MEDIA_YUV_USER, self.msgHandle);//返回Yuv数据
  248. FUN_SetIntAttr(self.player, EOA_SET_MEDIA_VIEW_VISUAL, 0);//自己画画面
  249. self.IsYuv = YES;
  250. // 圆心偏差横坐标 单位:像素点
  251. short centerOffsetX = fishFrame.centerOffsetX;
  252. //圆心偏差纵坐标 单位:像素点
  253. short centerOffsetY = fishFrame.centerOffsetY;
  254. //半径 单位:像素点
  255. short radius = fishFrame.radius;
  256. //圆心校正时的图像宽度 单位:像素点
  257. short imageWidth = fishFrame.imageWidth;
  258. //圆心校正时的图像高度 单位:像素点
  259. short imageHeight = fishFrame.imageHeight;
  260. //视角 0:俯视 1:平视
  261. if (fishFrame.viewAngle == 0) {
  262. }
  263. //显示模式 0:360VR
  264. if (fishFrame.lensType == SDK_FISHEYE_LENS_360VR || fishFrame.lensType == SDK_FISHEYE_LENS_360LVR) {//360vr
  265. Hardmodel =0;
  266. }else{//180Vr
  267. Hardmodel = 1;
  268. }
  269. if ( self.delegate && [self.delegate respondsToSelector:@selector(centerOffSetX:offSetx:offY:radius:width:height:)] ) {
  270. [self.delegate centerOffSetX:self offSetx:centerOffsetX offY:centerOffsetY radius:radius width:imageWidth height:imageHeight];
  271. }
  272. }
  273. else if (msg->param2 == 5)
  274. {
  275. //如果是已经保存过信息不支持的设备,则不进行YUV
  276. NSString *correct;// = [Config getCorrectdev:_devID];
  277. if ([correct isEqualToString:@"0"]) {
  278. }else{
  279. Hardandsoft = 5;
  280. FUN_SetIntAttr(self.player, EOA_MEDIA_YUV_USER, self.msgHandle);//返回Yuv数据
  281. FUN_SetIntAttr(self.player, EOA_SET_MEDIA_VIEW_VISUAL, 0);//自己画画面
  282. }
  283. }
  284. else if (msg->param2 == 8)
  285. {
  286. if ([self.delegate respondsToSelector:@selector(mediaPlayer:AnalyzelLength:site:Analyzel:)]) {
  287. [self.delegate mediaPlayer:self AnalyzelLength:msg->param1 site:msg->param3 Analyzel:msg->pObject];
  288. }
  289. //如果是智能分析报警坐标信息,则调用代理之后直接return
  290. return;
  291. }
  292. if ( self.delegate && [self.delegate respondsToSelector:@selector(mediaPlayer:Hardandsoft:Hardmodel:)] ) {
  293. [self.delegate mediaPlayer:self Hardandsoft:Hardandsoft Hardmodel:Hardmodel];
  294. }
  295. ChannelObject *channel = [[DeviceControl getInstance] getSelectChannel];
  296. channel.isFish = self.IsYuv;
  297. }
  298. break;
  299. #pragma mark YUV数据回调
  300. case EMSG_ON_YUV_DATA:{
  301. if ( self.delegate && [self.delegate respondsToSelector:@selector(mediaPlayer:width:height:pYUV:)] ) {
  302. [self.delegate mediaPlayer:self width:msg->param2 height:msg->param3 pYUV:(unsigned char *)msg->pObject];
  303. }
  304. }
  305. break;
  306. default:
  307. break;
  308. }
  309. }
  310. @end