BGKSYLinkMicPlayerController.m 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452
  1. //
  2. // BGKSYLinkMicPlayerController.m
  3. // FanweApp
  4. //
  5. // Created by xfg on 2017/2/13.
  6. // Copyright © 2017年 xfg. All rights reserved.
  7. //
  8. #import "BGKSYLinkMicPlayerController.h"
  9. #define kCfgTimes 0.25 // 连麦参数相对于推流参数的倍数
  10. @interface BGKSYLinkMicPlayerController ()
  11. {
  12. GlobalVariables *_fanweApp;
  13. NSMutableDictionary *_obsDict;
  14. }
  15. @end
  16. @implementation BGKSYLinkMicPlayerController
  17. - (void)viewDidLoad
  18. {
  19. [super viewDidLoad];
  20. }
  21. //#pragma mark 开始鉴权
  22. ///*
  23. // * 开始鉴权
  24. // * applicantId:申请连麦者ID
  25. // */
  26. //- (void)startRegister:(NSString *)applicantId
  27. //{
  28. // _applicantId = applicantId;
  29. //
  30. // _fanweApp = [GlobalVariables sharedInstance];
  31. //
  32. // _gPUStreamerKit = [[KSYRTCStreamerKit alloc] initWithDefaultCfg];
  33. //
  34. // // 采集相关设置初始化
  35. // [self setCaptureCfg];
  36. // // 推流相关设置初始化
  37. // [self setStreamerCfg];
  38. // // 设置rtc参数
  39. // [self setStreamerKitCfg];
  40. //
  41. // // 添加监听
  42. // [self initObservers];
  43. // [self addObservers];
  44. //}
  45. //
  46. //#pragma mark 开始连麦
  47. ///*
  48. // * 开始连麦
  49. // * applicantId:申请连麦者ID
  50. // * responderId:接收连麦者ID
  51. // */
  52. //- (void)startLinkMic:(NSString *)applicantId andResponderId:(NSString *)responderId
  53. //{
  54. // [self.moviePlayer pause];
  55. // int ret = [_gPUStreamerKit.rtcClient startCall:responderId];
  56. // NSLog(@"%d",ret);
  57. // if (_gPUStreamerKit)
  58. // {
  59. // self.videoContrainerView.hidden = YES;
  60. // [_gPUStreamerKit startPreview:self.view];
  61. // }
  62. //}
  63. //
  64. //#pragma mark 停止连麦
  65. ///*
  66. // * 停止连麦
  67. // * applicantId:申请连麦者ID
  68. // */
  69. //- (void)stopLinkMic:(NSString *)applicantId
  70. //{
  71. // if (_gPUStreamerKit)
  72. // {
  73. // if (_gPUStreamerKit.callstarted)
  74. // {
  75. // [_gPUStreamerKit.rtcClient stopCall];
  76. // }
  77. // else
  78. // {
  79. // [_gPUStreamerKit.rtcClient unRegisterRTC];
  80. // [_gPUStreamerKit stopPreview];
  81. // _gPUStreamerKit = nil;
  82. // }
  83. // }
  84. //
  85. // self.videoContrainerView.hidden = NO;
  86. // [self.moviePlayer play];
  87. //
  88. // if (_linkMicPlayDelegate && [_linkMicPlayDelegate respondsToSelector:@selector(applicantLinkMickResult:applicantId:)])
  89. // {
  90. // [_linkMicPlayDelegate applicantLinkMickResult:NO applicantId:_applicantId];
  91. // }
  92. //}
  93. //
  94. //#pragma mark 结束播放
  95. //- (void)stopPlay
  96. //{
  97. // [super stopPlay];
  98. // [self stopLinkMic:_applicantId];
  99. //}
  100. //
  101. //#pragma mark - ----------------------- 配置 -----------------------
  102. //#pragma mark 采集相关设置初始化
  103. //- (void)setCaptureCfg
  104. //{
  105. // _gPUStreamerKit.videoOrientation = [[UIApplication sharedApplication] statusBarOrientation];
  106. //
  107. // //配置profile 0:标清(360*640) 1:高清(540*960) 2:超清(720*1280)
  108. // if (_fanweApp.appModel.video_resolution_type == 0)
  109. // {
  110. // [_gPUStreamerKit setStreamerProfile:KSYStreamerProfile_360p_auto];
  111. // }
  112. // else if (_fanweApp.appModel.video_resolution_type == 1)
  113. // {
  114. // [_gPUStreamerKit setStreamerProfile:KSYStreamerProfile_540p_auto];
  115. // }
  116. // else if (_fanweApp.appModel.video_resolution_type == 2)
  117. // {
  118. // [_gPUStreamerKit setStreamerProfile:KSYStreamerProfile_720p_auto];
  119. // }
  120. // // 视频帧率 默认:15
  121. // _gPUStreamerKit.videoFPS = 15;
  122. //
  123. // // 摄像头位置 (仅在开始采集前设置有效)
  124. // _gPUStreamerKit.cameraPosition = AVCaptureDevicePositionFront;
  125. // // gpu output pixel format (默认:kCVPixelFormatType_32BGRA) (仅在开始采集前设置有效)
  126. // _gPUStreamerKit.gpuOutputPixelFormat = kCVPixelFormatType_32BGRA;
  127. //
  128. // // 视频处理回调接口
  129. // _gPUStreamerKit.videoProcessingCallback = ^(CMSampleBufferRef buf){
  130. // // 在此处添加自定义图像处理, 直接修改buf中的图像数据会传递到观众端
  131. // // 或复制图像数据之后再做其他处理, 则观众端仍然看到处理前的图像
  132. // };
  133. //
  134. // // 采集模块输出的像素格式 (默认:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange) (仅在开始采集前设置有效)
  135. // // _gPUStreamerKit.capturePixelFormat = kCVPixelFormatType_32BGRA;
  136. //
  137. // // 音频处理回调接口
  138. // // _gPUStreamerKit.audioProcessingCallback = ^(CMSampleBufferRef buf){
  139. // // // 在此处添加自定义音频处理, 直接修改buf中的pcm数据会传递到观众端
  140. // // // 或复制音频数据之后再做其他处理, 则观众端仍然听到原始声音
  141. // // };
  142. // //
  143. // // // 摄像头采集被打断的消息通知
  144. // // _gPUStreamerKit.interruptCallback = ^(BOOL bInterrupt){
  145. // // // 在此处添加自定义图像采集被打断的处理 (比如接听电话等)
  146. // // };
  147. //}
  148. //
  149. //#pragma mark 推流相关设置初始化
  150. //- (void)setStreamerCfg
  151. //{
  152. // if (_gPUStreamerKit.streamerBase == nil)
  153. // {
  154. // return;
  155. // }
  156. //
  157. // // must set after capture
  158. // // stream default settings
  159. // // 视频编码器 默认为 自动选择
  160. // _gPUStreamerKit.streamerBase.videoCodec = KSYVideoCodec_AUTO;
  161. //
  162. // if (_fanweApp.appModel.video_resolution_type == 0)
  163. // {
  164. // // 视频编码起始码率(单位:kbps, 默认:500)
  165. // _gPUStreamerKit.streamerBase.videoInitBitrate = 400 * kCfgTimes;
  166. // // 视频编码最高码率(单位:kbps, 默认:800)
  167. // _gPUStreamerKit.streamerBase.videoMaxBitrate = 800 * kCfgTimes;
  168. // // 视频编码最低码率(单位:kbps, 默认:200)
  169. // _gPUStreamerKit.streamerBase.videoMinBitrate = 200 * kCfgTimes;
  170. // }
  171. // else if (_fanweApp.appModel.video_resolution_type == 1)
  172. // {
  173. // // 视频编码起始码率(单位:kbps, 默认:500)
  174. // _gPUStreamerKit.streamerBase.videoInitBitrate = 600 * kCfgTimes;
  175. // // 视频编码最高码率(单位:kbps, 默认:800)
  176. // _gPUStreamerKit.streamerBase.videoMaxBitrate = 1000 * kCfgTimes;
  177. // // 视频编码最低码率(单位:kbps, 默认:200)
  178. // _gPUStreamerKit.streamerBase.videoMinBitrate = 200 * kCfgTimes;
  179. // }
  180. // else if (_fanweApp.appModel.video_resolution_type == 2)
  181. // {
  182. // // 视频编码起始码率(单位:kbps, 默认:500)
  183. // _gPUStreamerKit.streamerBase.videoInitBitrate = 800 * kCfgTimes;
  184. // // 视频编码最高码率(单位:kbps, 默认:800)
  185. // _gPUStreamerKit.streamerBase.videoMaxBitrate = 1000 * kCfgTimes;
  186. // // 视频编码最低码率(单位:kbps, 默认:200)
  187. // _gPUStreamerKit.streamerBase.videoMinBitrate = 200 * kCfgTimes;
  188. // }
  189. //
  190. // // 音频编码码率(单位:kbps)
  191. // _gPUStreamerKit.streamerBase.audiokBPS = 48;
  192. // // 收集网络相关状态的日志,默认开启
  193. // _gPUStreamerKit.streamerBase.shouldEnableKSYStatModule = NO;
  194. // // 获取Streamer中与网络相关的日志
  195. // _gPUStreamerKit.streamerBase.logBlock = ^(NSString* str){
  196. // // NSLog(@"%@", str);
  197. // };
  198. //
  199. // // // 直播场景 (KSY内部会根据场景的特征进行参数调优)
  200. // // _gPUStreamerKit.streamerBase.liveScene = KSYLiveScene_Showself;
  201. // // // 视频编码性能档次 (视频质量 和 设备资源之间的权衡)
  202. // // _gPUStreamerKit.streamerBase.videoEncodePerf = KSYVideoEncodePer_Balance;
  203. // // // 是否处理视频的图像数据 (默认YES)
  204. // // _gPUStreamerKit.streamerBase.bWithVideo = YES;
  205. // // //是否冻结图像(主动提供重复图像) 比如:视频采集被打断时, bAutoRepeat为NO,则停止提供图像; 为YES, 则主动提供最后一帧图像
  206. // // _gPUStreamerKit.gpuToStr.bAutoRepeat = YES;
  207. // // // 自动重连次数 关闭(0), 开启(>0), 默认为0
  208. // // _gPUStreamerKit.maxAutoRetry = 3;
  209. //}
  210. //
  211. //- (UIView *)createUIView
  212. //{
  213. // UIView * view = [[UIView alloc]initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height)];
  214. // view.layer.borderWidth = 10;
  215. // view.layer.borderColor = [kClearColor CGColor];
  216. // return view;
  217. //}
  218. //
  219. //#pragma mark 设置rtc参数
  220. //- (void)setStreamerKitCfg
  221. //{
  222. // //设置鉴权信息
  223. // _gPUStreamerKit.rtcClient.authString = nil;//设置ak/sk鉴权信息,本demo从testAppServer取,客户请从自己的appserver获取。
  224. // //设置音频属性
  225. // _gPUStreamerKit.rtcClient.sampleRate = 44100;//设置音频采样率,暂时不支持调节
  226. // //设置视频属性
  227. // _gPUStreamerKit.rtcClient.videoFPS = 15; //设置视频帧率
  228. // _gPUStreamerKit.rtcClient.videoWidth = 360;//设置视频的宽高,和当前分辨率相关,注意一定要保持16:9
  229. // _gPUStreamerKit.rtcClient.videoHeight = 640;
  230. // _gPUStreamerKit.rtcClient.MaxBps = 256000;//设置rtc传输的最大码率,如果推流卡顿,可以设置该参数
  231. // //设置小窗口属性
  232. // _gPUStreamerKit.winRect = CGRectMake(kLinkMickXRate, kLinkMickYRate, kLinkMickWRate, kLinkMickHRate);//设置小窗口属性
  233. // _gPUStreamerKit.rtcLayer = 4;//设置小窗口图层,因为主版本占用了1~3,建议设置为4
  234. //
  235. // //特性1:悬浮图层,用户可以在小窗口叠加自己的view,注意customViewLayer >rtcLayer,(option)
  236. //// _gPUStreamerKit.customViewRect = CGRectMake(0.6, 0.6, 0.3, 0.3);
  237. //// _gPUStreamerKit.customViewLayer = 5;
  238. ////
  239. //// UIView * customView = [self createUIView];
  240. //// [_gPUStreamerKit.contentView addSubview:customView];
  241. //
  242. // //特性2:圆角小窗口
  243. // // _gPUStreamerKit.maskPicture = [[GPUImagePicture alloc] initWithImage:[UIImage imageNamed:@"mask.png"]];
  244. //
  245. // //rtcClient的回调,(option)
  246. // __weak typeof(self) ws = self;
  247. //
  248. // // 接收注册结果的回调函数
  249. // _gPUStreamerKit.rtcClient.onRegister= ^(int status){
  250. // NSLog(ASLocalizedString(@"======接收注册结果的回调函数,状态码:%d"),status);
  251. //
  252. // if (ws.linkMicPlayDelegate && [ws.linkMicPlayDelegate respondsToSelector:@selector(registerResult2:registerUserId:)])
  253. // {
  254. // [ws.linkMicPlayDelegate registerResult2:status registerUserId:ws.applicantId];
  255. // }
  256. // };
  257. //
  258. // // 接收反注册结果的回调函数
  259. // _gPUStreamerKit.rtcClient.onUnRegister= ^(int status){
  260. // NSLog(@"unregister callback");
  261. //
  262. // if (ws.linkMicPlayDelegate && [ws.linkMicPlayDelegate respondsToSelector:@selector(unRegisterResult2:registerUserId:)])
  263. // {
  264. // [ws.linkMicPlayDelegate unRegisterResult2:status registerUserId:ws.applicantId];
  265. // }
  266. // };
  267. //
  268. // // start call的回调函数
  269. // _gPUStreamerKit.onCallStart =^(int status){
  270. //
  271. // NSLog(@"oncallstart:%d",status);
  272. //
  273. // if(status == 200) // 建立连接
  274. // {
  275. // if([UIApplication sharedApplication].applicationState != UIApplicationStateBackground)
  276. // {
  277. // if (ws.linkMicPlayDelegate && [ws.linkMicPlayDelegate respondsToSelector:@selector(applicantLinkMickResult:applicantId:)])
  278. // {
  279. // [ws.linkMicPlayDelegate applicantLinkMickResult:YES applicantId:ws.applicantId];
  280. // }
  281. // }
  282. // }
  283. // else if(status == 408) // 对方无应答
  284. // {
  285. // [ws stopLinkMic:ws.applicantId];
  286. //
  287. // if (ws.linkMicPlayDelegate && [ws.linkMicPlayDelegate respondsToSelector:@selector(applicantLinkMickResult:applicantId:)])
  288. // {
  289. // [ws.linkMicPlayDelegate applicantLinkMickResult:NO applicantId:ws.applicantId];
  290. // }
  291. // }
  292. // else if(status == 404) // 呼叫未注册号码,主动停止
  293. // {
  294. // [ws stopLinkMic:ws.applicantId];
  295. //
  296. // if (ws.linkMicPlayDelegate && [ws.linkMicPlayDelegate respondsToSelector:@selector(applicantLinkMickResult:applicantId:)])
  297. // {
  298. // [ws.linkMicPlayDelegate applicantLinkMickResult:NO applicantId:ws.applicantId];
  299. // }
  300. // }
  301. // };
  302. //
  303. // // stop call的回调函数
  304. // _gPUStreamerKit.onCallStop = ^(int status){
  305. //
  306. // NSLog(@"oncallstop:%d",status);
  307. //
  308. // if(status == 200)
  309. // {
  310. // if([UIApplication sharedApplication].applicationState != UIApplicationStateBackground)
  311. // {
  312. // NSLog(ASLocalizedString(@"断开连接"));
  313. // }
  314. // }
  315. // else if(status == 408)
  316. // {
  317. // NSLog(ASLocalizedString(@"408超时"));
  318. // }
  319. //
  320. // [ws stopLinkMic:ws.applicantId];
  321. //
  322. // if (ws.linkMicPlayDelegate && [ws.linkMicPlayDelegate respondsToSelector:@selector(applicantLinkMickResult:applicantId:)])
  323. // {
  324. // [ws.linkMicPlayDelegate applicantLinkMickResult:NO applicantId:ws.applicantId];
  325. // }
  326. // };
  327. //
  328. // //sdk日志接口(option)
  329. // _gPUStreamerKit.rtcClient.openRtcLog = NO;//是否打开rtc的日志
  330. // _gPUStreamerKit.rtcClient.sdkLogBlock = ^(NSString * message){
  331. // NSLog(ASLocalizedString(@"=======辅播端rtc的日志:%@"),message);
  332. // };
  333. //}
  334. //
  335. //#pragma mark - ----------------------- 监听 -----------------------
  336. //- (void)initObservers
  337. //{
  338. // _obsDict = [NSMutableDictionary dictionaryWithObjectsAndKeys:
  339. // SEL_VALUE(onCaptureStateChange:) , KSYCaptureStateDidChangeNotification,
  340. // SEL_VALUE(onStreamStateChange:) , KSYStreamStateDidChangeNotification,
  341. // SEL_VALUE(onBgmPlayerStateChange:) ,KSYAudioStateDidChangeNotification,
  342. // nil];
  343. //}
  344. //
  345. //- (void)addObservers
  346. //{
  347. // //KSYStreamer state changes
  348. // NSNotificationCenter* dc = [NSNotificationCenter defaultCenter];
  349. // for (NSString* key in _obsDict)
  350. // {
  351. // SEL aSel = [[_obsDict objectForKey:key] pointerValue];
  352. // [dc addObserver:self
  353. // selector:aSel
  354. // name:key
  355. // object:nil];
  356. // }
  357. //}
  358. //
  359. //- (void)setInFront
  360. //{
  361. // _gPUStreamerKit.selfInFront = YES;
  362. //}
  363. //
  364. //#pragma mark state change
  365. //- (void)onCaptureStateChange:(NSNotification *)notification
  366. //{
  367. // if (_gPUStreamerKit.captureState == KSYCaptureStateIdle)
  368. // {
  369. // self.view.backgroundColor = [UIColor darkGrayColor];
  370. // }
  371. // else if(_gPUStreamerKit.captureState == KSYCaptureStateCapturing)
  372. // {
  373. // self.view.backgroundColor = [UIColor lightGrayColor];
  374. // [self performSelector:@selector(setInFront) withObject:nil afterDelay:3];
  375. // }
  376. //}
  377. //
  378. //#pragma mark 推流状态监听
  379. //- (void)onStreamStateChange:(NSNotification *)notification
  380. //{
  381. // if (_gPUStreamerKit.streamerBase)
  382. // {
  383. // NSLog(@"stream State %@", [_gPUStreamerKit.streamerBase getCurStreamStateName]);
  384. // }
  385. //
  386. // if(_gPUStreamerKit.streamerBase.streamState == KSYStreamStateError)
  387. // {
  388. // [self onStreamError:_gPUStreamerKit.streamerBase.streamErrorCode];
  389. // }
  390. // else if (_gPUStreamerKit.streamerBase.streamState == KSYStreamStateConnecting)
  391. // {
  392. //
  393. // }
  394. // else if (_gPUStreamerKit.streamerBase.streamState == KSYStreamStateConnected)
  395. // {
  396. // self.view.backgroundColor = [UIColor lightGrayColor];
  397. //
  398. // }
  399. // else if (_gPUStreamerKit.streamerBase.streamState == KSYStreamStateIdle)
  400. // {
  401. // self.view.backgroundColor = [UIColor darkGrayColor];
  402. // }
  403. //}
  404. //
  405. //#pragma mark 推流错误处理
  406. //- (void)onStreamError:(KSYStreamErrorCode) errCode
  407. //{
  408. // if (errCode == KSYStreamErrorCode_CONNECT_BREAK)
  409. // {
  410. // [self tryReconnect];
  411. // }
  412. // else if (errCode == KSYStreamErrorCode_AV_SYNC_ERROR)
  413. // {
  414. // NSLog(@"audio video is not synced, please check timestamp");
  415. // [self tryReconnect];
  416. // }
  417. // else if (errCode == KSYStreamErrorCode_CODEC_OPEN_FAILED)
  418. // {
  419. // NSLog(@"video codec open failed, try software codec");
  420. // _gPUStreamerKit.streamerBase.videoCodec = KSYVideoCodec_X264;
  421. // [self tryReconnect];
  422. // }
  423. //}
  424. //
  425. //- (void)onBgmPlayerStateChange:(NSNotification *)notification
  426. //{
  427. // NSString *st = [_gPUStreamerKit.bgmPlayer getCurBgmStateName];
  428. // NSLog(@"=====bgmStatus:%@",[st substringFromIndex:17]);
  429. //}
  430. //
  431. //#pragma mark 尝试重连
  432. //- (void)tryReconnect
  433. //{
  434. // // if (_gPUStreamerKit.maxAutoRetry > 0)
  435. // // {
  436. // // return;
  437. // // }
  438. // dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC));
  439. // dispatch_after(delay, dispatch_get_main_queue(), ^{
  440. // [_gPUStreamerKit.streamerBase startStream:self.pushUrl];
  441. // });
  442. //}
  443. @end