YBPlayVC.m 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900
  1. //
  2. // YBPlayVC.m
  3. // YBVideo
  4. //
  5. // Created by YB007 on 2019/11/29.
  6. // Copyright © 2019 cat. All rights reserved.
  7. //
  8. #import "YBPlayVC.h"
  9. #import "YBPlayCtrlView.h"
  10. #import <TXLiteAVSDK_Professional/V2TXLivePlayer.h>
  11. #import <mach/mach.h>
  12. #import "UserBulletWindow.h"
  13. #import "YBSocketPlay.h"
  14. #import "YBLiveEndView.h"
  15. #import "YBCenterVC.h"
  16. #import "YBLiveReportVC.h"
  17. #import "MsgSysVC.h"
  18. #import "YBImRoomSmallView.h"
  19. #import <ZFPlayer/ZFPlayer.h>
  20. #import <ZFPlayer/ZFPlayerControlView.h>
  21. #import <ZFPlayer/ZFIJKPlayerManager.h>
  22. #import "ZFCustomControlView.h"
  23. @interface YBPlayVC ()<UserBulletWindowDelegate,UIScrollViewDelegate,V2TXLivePlayerObserver,V2TIMConversationListener> {
  24. NSString *_userType; //用户类型:普通用户-30;房间管理-40;主播-50;超管-60;
  25. int _userlistRefreshTime; //用户列表刷新时间
  26. NSTimer *_listTimer; //用户列表计时器
  27. UserBulletWindow *buttleView; //用户信息卡
  28. int _firstStar;
  29. MsgSysVC *sysView;
  30. int unRead;
  31. CGFloat _changeScorllOffSetY;
  32. YBImRoomSmallView *_imListView;
  33. }
  34. @property(nonatomic,strong)UIImageView *pkBgIV;
  35. @property(nonatomic,strong)TXView *videoPlayView; //播放器
  36. @property(nonatomic,strong)YBPlayCtrlView *playCtrlView; //控制层
  37. @property(nonatomic,strong)YBLiveEndView *playEndView; //直播结束页面
  38. @property(nonatomic,strong)UIScrollView *changeRoomScroll; //房间切换底部scroll
  39. @property (nonatomic, strong)V2TXLivePlayer *txLivePlayer;
  40. @property (nonatomic, strong) ZFPlayerController *videoPlayer;
  41. //@property (nonatomic, strong) ZFCustomControlView *fullControlView;
  42. @end
  43. @implementation YBPlayVC
  44. - (void)viewWillAppear:(BOOL)animated {
  45. [super viewWillAppear:animated];
  46. [IQKeyboardManager sharedManager].enable = NO;
  47. [self requestJmsg];
  48. if (_txLivePlayer) {
  49. [_txLivePlayer setPlayoutVolume:100];
  50. }
  51. if (_playCtrlView) {
  52. [_playCtrlView showGoodsBtnAnimaition];
  53. }
  54. }
  55. - (void)viewWillDisappear:(BOOL)animated {
  56. [super viewWillDisappear:animated];
  57. [IQKeyboardManager sharedManager].enable = YES;
  58. if (_txLivePlayer) {
  59. [_txLivePlayer setPlayoutVolume:0];
  60. }
  61. if (_playCtrlView) {
  62. [_playCtrlView removeGoodsBtnAnimation];
  63. _playCtrlView.keyBoardIsShow = NO;
  64. [_playCtrlView.chatTool.chatTF resignFirstResponder];
  65. }
  66. }
  67. - (void)viewDidLoad {
  68. [super viewDidLoad];
  69. self.naviView.hidden = YES;
  70. self.navigationController.interactivePopGestureRecognizer.enabled = NO;
  71. self.navigationController.interactivePopGestureRecognizer.delegate =nil;
  72. //私信
  73. [self.view addSubview:self.changeRoomScroll];
  74. self.changeRoomScroll.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
  75. [self initPlayer];
  76. [_changeRoomScroll addSubview:self.pkBgIV];
  77. [_changeRoomScroll addSubview:self.playCtrlView];
  78. [self addNotification];
  79. _playDic = _listArray[_currentIndex];
  80. [self changeRoomReset];
  81. }
  82. -(void)changeRoomReset {
  83. [self releaseAllOfChangeRoom:YES];
  84. _userType = @"30";
  85. _firstStar = 0;
  86. [_playCtrlView clearChatList];
  87. _playCtrlView.playDic = _playDic;
  88. _changeRoomScroll.contentOffset = CGPointMake(0, _window_height*_currentIndex);
  89. _pkBgIV.frame = CGRectMake(0, _window_height*_currentIndex, _window_width, _window_height);
  90. _playCtrlView.frame = CGRectMake(0, _window_height*_currentIndex, _window_width, _window_height);
  91. _videoPlayView.frame = CGRectMake(0, _window_height*_currentIndex, _window_width, _window_height);
  92. [self changeLinkPlayer:NO toHostid:@""];
  93. [self bringPlayerToFront:NO];
  94. if ([minstr([_playDic valueForKey:@"isvideo"]) isEqual:@"1"]) {
  95. [self playWithVideoPlayer];
  96. }else{
  97. [self.txLivePlayer setRenderFillMode:V2TXLiveFillModeFill];
  98. if ([minstr([_playDic valueForKey:@"anyway"]) isEqual:@"1"]) {
  99. [self.txLivePlayer setRenderFillMode:V2TXLiveFillModeFit];
  100. }
  101. if ([minstr([_playDic valueForKey:@"isvideo"]) isEqual:@"1"]) {
  102. [self.txLivePlayer setRenderFillMode:V2TXLiveFillModeFill];
  103. }
  104. [self.txLivePlayer setRenderView:_videoPlayView];
  105. NSString *playUrl = [_playDic valueForKey:@"pull"];
  106. V2TXLiveCode result = [self.txLivePlayer startLivePlay:playUrl];
  107. NSLog(@"wangminxin-----%ld",result);
  108. if( result != 0)
  109. {
  110. [MBProgressHUD showPop:YZMsg(@"播放失败")];
  111. [self dismissVC];
  112. }
  113. if( result == 0){
  114. NSLog(@"播放视频");
  115. }
  116. }
  117. //进房间、链接socket
  118. [self enterRoom];
  119. //进场标题
  120. [self showTitle];
  121. }
  122. #pragma mark -视频播放器
  123. -(ZFPlayerController *)videoPlayer{
  124. if(!_videoPlayer){
  125. ZFIJKPlayerManager *playerManager = [[ZFIJKPlayerManager alloc] init];
  126. NSString *ijkRef = [NSString stringWithFormat:@"Referer:%@\r\n",h5url];
  127. [playerManager.options setFormatOptionValue:ijkRef forKey:@"headers"];
  128. _videoPlayer =[ZFPlayerController playerWithPlayerManager:playerManager containerView:_videoPlayView];
  129. _videoPlayer.shouldAutoPlay = YES;
  130. _videoPlayer.allowOrentitaionRotation = NO;
  131. _videoPlayer.WWANAutoPlay = YES;
  132. //不支持的方向
  133. _videoPlayer.disablePanMovingDirection = ZFPlayerDisablePanMovingDirectionVertical;
  134. //不支持的手势类型
  135. _videoPlayer.disableGestureTypes = ZFPlayerDisableGestureTypesPinch;
  136. /// 1.0是消失100%时候
  137. _videoPlayer.playerDisapperaPercent = 1.0;
  138. //功能
  139. @weakify(self)
  140. _videoPlayer.playerPrepareToPlay = ^(id<ZFPlayerMediaPlayback> _Nonnull asset, NSURL * _Nonnull assetURL) {
  141. NSLog(@"准备");
  142. @strongify(self)
  143. };
  144. _videoPlayer.playerReadyToPlay = ^(id<ZFPlayerMediaPlayback> _Nonnull asset, NSURL * _Nonnull assetURL) {
  145. @strongify(self)
  146. _playCtrlView.avatarEffect.hidden = YES;
  147. [self bringPlayerToFront:YES];
  148. // self.fullControlView.playDoc = self.playDic;
  149. };
  150. _videoPlayer.playerDidToEnd = ^(id _Nonnull asset) {
  151. NSLog(@"结束");
  152. @strongify(self)
  153. [self.videoPlayer.currentPlayerManager replay];
  154. };
  155. _videoPlayer.orientationDidChanged = ^(ZFPlayerController * _Nonnull player, BOOL isFullScreen) {
  156. @strongify(self)
  157. // if (isFullScreen) {
  158. // self.fullControlView.hidden = NO;
  159. // self.videoPlayer.controlView = self.fullControlView;
  160. // }else{
  161. // self.fullControlView.hidden = YES;
  162. // }
  163. };
  164. }
  165. return _videoPlayer;
  166. }
  167. -(void)playWithVideoPlayer{
  168. NSString *playUrl = [_playDic valueForKey:@"pull"];
  169. self.videoPlayer.assetURL = [NSURL URLWithString:playUrl];
  170. }
  171. //- (ZFCustomControlView *)fullControlView {
  172. // YBWeakSelf;
  173. // if (!_fullControlView) {
  174. // _fullControlView = [[ZFCustomControlView alloc] init];
  175. // _fullControlView.btnEvent = ^(NSString *str) {
  176. // if ([str isEqual:@"focus"]){
  177. // [weakSelf guanzhuZhuBolela];
  178. // }
  179. // };
  180. //
  181. // }
  182. // return _fullControlView;
  183. //}
  184. //显示进场标题
  185. - (void)showTitle{
  186. if (minstr([_playDic valueForKey:@"title"]).length > 0) {
  187. CGFloat titleWidth = [PublicObj sizeWithString:minstr([_playDic valueForKey:@"title"]) andFont:[UIFont systemFontOfSize:14]].width;
  188. UIImageView *titleBackImgView = [[UIImageView alloc]initWithFrame:CGRectMake(_window_width, 95+statusbarHeight, 35+titleWidth+20, 30)];
  189. titleBackImgView.image = [UIImage imageNamed:@"moviePlay_title"];
  190. titleBackImgView.alpha = 0.5;
  191. titleBackImgView.layer.cornerRadius = 15;
  192. titleBackImgView.layer.masksToBounds = YES;
  193. [self.view addSubview:titleBackImgView];
  194. UIImageView *laba = [[UIImageView alloc]initWithFrame:CGRectMake(10, 7.5, 15, 15)];
  195. laba.image = [UIImage imageNamed:@"moviePlay_laba"];
  196. [titleBackImgView addSubview:laba];
  197. UILabel *titL = [[UILabel alloc]initWithFrame:CGRectMake(laba.right+10, 0, titleWidth+20, 30)];
  198. titL.text = minstr([_playDic valueForKey:@"title"]);
  199. titL.textColor = [UIColor whiteColor];
  200. titL.font = [UIFont systemFontOfSize:14];
  201. [titleBackImgView addSubview:titL];
  202. [UIView animateWithDuration:3 animations:^{
  203. titleBackImgView.alpha = 1;
  204. titleBackImgView.x = 10;
  205. }];
  206. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(6 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  207. [UIView animateWithDuration:2 animations:^{
  208. titleBackImgView.alpha = 0;
  209. titleBackImgView.x = -_window_width;
  210. } completion:^(BOOL finished) {
  211. [titleBackImgView removeFromSuperview];
  212. }];
  213. });
  214. }
  215. }
  216. -(void)initPlayer {
  217. [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"isPlaying"];
  218. [[UIApplication sharedApplication] setIdleTimerDisabled:YES];
  219. _videoPlayView = [[TXView alloc]initWithFrame:CGRectMake(0, 0, _window_width, _window_height)];
  220. _videoPlayView.backgroundColor = UIColor.clearColor;
  221. [_changeRoomScroll addSubview:_videoPlayView];
  222. [self.txLivePlayer setRenderView:_videoPlayView];
  223. }
  224. -(void)bringPlayerToFront:(BOOL)isFront {
  225. if (isFront) {
  226. [_changeRoomScroll bringSubviewToFront:_pkBgIV];
  227. [_changeRoomScroll bringSubviewToFront:_videoPlayView];
  228. [_changeRoomScroll bringSubviewToFront:_playCtrlView];
  229. }else{
  230. [_changeRoomScroll sendSubviewToBack:_videoPlayView];
  231. [_changeRoomScroll sendSubviewToBack:_pkBgIV];
  232. }
  233. }
  234. -(void)destroyPusher {
  235. if(_txLivePlayer) {
  236. [_txLivePlayer stopPlay];
  237. _txLivePlayer = nil;
  238. }
  239. if(self.videoPlayer){
  240. [self.videoPlayer stop];
  241. }
  242. }
  243. -(V2TXLivePlayer *)txLivePlayer{
  244. if(!_txLivePlayer){
  245. _txLivePlayer = [[V2TXLivePlayer alloc] init];
  246. [_txLivePlayer setObserver:self];
  247. [_txLivePlayer enableObserveAudioFrame:YES];
  248. [_txLivePlayer setRenderFillMode:V2TXLiveFillModeFill];
  249. }
  250. return _txLivePlayer;
  251. }
  252. #pragma mark---liveplayObserver
  253. - (void)onError:(id<V2TXLivePlayer>)player code:(V2TXLiveCode)code message:(NSString *)msg extraInfo:(NSDictionary *)extraInfo;
  254. {
  255. NSLog(@"liveplay-error");
  256. }
  257. - (void)onWarning:(id<V2TXLivePlayer>)player code:(V2TXLiveCode)code message:(NSString *)msg extraInfo:(NSDictionary *)extraInfo;
  258. {
  259. NSLog(@"liveplay-onWarning");
  260. }
  261. /**
  262. * 已经成功连接到服务器
  263. *
  264. * @param player 回调该通知的播放器对象。
  265. * @param extraInfo 扩展信息。
  266. */
  267. - (void)onVideoPlaying:(id<V2TXLivePlayer>)player firstPlay:(BOOL)firstPlay extraInfo:(NSDictionary *)extraInfo;
  268. {
  269. NSLog(@"moviplay不连麦视频播放开始");
  270. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  271. _playCtrlView.avatarEffect.hidden = YES;
  272. [self bringPlayerToFront:YES];
  273. });
  274. }
  275. - (void)onAudioPlaying:(id<V2TXLivePlayer>)player firstPlay:(BOOL)firstPlay extraInfo:(NSDictionary *)extraInfo;{
  276. NSLog(@"onAudioPlaying");
  277. }
  278. /**
  279. * 视频加载事件
  280. *
  281. * @param player 回调该通知的播放器对象。
  282. * @param extraInfo 扩展信息。
  283. */
  284. - (void)onVideoLoading:(id<V2TXLivePlayer>)player extraInfo:(NSDictionary *)extraInfo;{
  285. NSLog(@"onVideoLoading");
  286. }
  287. /**
  288. /*
  289. * 直播播放器分辨率变化通知
  290. *
  291. * @param player 回调该通知的播放器对象。
  292. * @param width 视频宽。
  293. * @param height 视频高。
  294. */
  295. - (void)onVideoResolutionChanged:(id<V2TXLivePlayer>)player width:(NSInteger)width height:(NSInteger)height;
  296. {
  297. }
  298. //#pragma mark - TXLivePlayListener
  299. //-(void) onPlayEvent:(int)EvtID withParam:(NSDictionary*)param {
  300. // dispatch_async(dispatch_get_main_queue(), ^{
  301. // if (EvtID == PLAY_EVT_CONNECT_SUCC) {
  302. // NSLog(@"moviplay不连麦已经连接服务器");
  303. // }else if (EvtID == PLAY_EVT_RTMP_STREAM_BEGIN){
  304. // NSLog(@"moviplay不连麦已经连接服务器,开始拉流");
  305. // }else if (EvtID == PLAY_EVT_PLAY_BEGIN){
  306. // NSLog(@"moviplay不连麦视频播放开始");
  307. // dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  308. // _playCtrlView.avatarEffect.hidden = YES;
  309. // [self bringPlayerToFront:YES];
  310. // });
  311. // }else if (EvtID== PLAY_WARNING_VIDEO_PLAY_LAG){
  312. // NSLog(@"moviplay不连麦当前视频播放出现卡顿(用户直观感受)");
  313. // } else if (EvtID == PLAY_EVT_PLAY_END){
  314. // NSLog(@"moviplay不连麦视频播放结束");
  315. // [_txLivePlayer resume];
  316. // }else if (EvtID == PLAY_ERR_NET_DISCONNECT) {
  317. // NSLog(@"moviplay不连麦网络断连,且经多次重连抢救无效,可以放弃治疗,更多重试请自行重启播放");
  318. // }else if (EvtID == PLAY_EVT_CHANGE_RESOLUTION) {
  319. // NSLog(@"主播连麦分辨率改变");
  320. // }
  321. // });
  322. //}
  323. //-(void)onNetStatus:(NSDictionary *)param{
  324. //
  325. //}
  326. #pragma mark - 进房间
  327. -(void)enterRoom {
  328. YBWeakSelf;
  329. [[YBSocketPlay playSocketManeger]enterRoomAndConnectSocket:_playDic complete:^(NSString *socEvent, NSDictionary *socketDic) {
  330. if ([socEvent isEqual:@"0"]) {
  331. [weakSelf enterSuc:socketDic];
  332. }else {
  333. [MBProgressHUD showPop:socEvent];
  334. [weakSelf dismissVC];
  335. }
  336. }];
  337. }
  338. -(void)enterSuc:(NSDictionary *)roomDic {
  339. [self startSocketBlockMonitor];
  340. _userType = minstr([roomDic valueForKey:@"usertype"]);
  341. [_playCtrlView enterroomUpdateInfo:roomDic];
  342. _userlistRefreshTime = [minstr([roomDic valueForKey:@"userlist_time"]) intValue];
  343. if (_userlistRefreshTime < 10) {
  344. _userlistRefreshTime = 10;
  345. }
  346. if (!_listTimer) {
  347. _listTimer = [NSTimer scheduledTimerWithTimeInterval:_userlistRefreshTime target:self selector:@selector(reloadUserList) userInfo:nil repeats:YES];
  348. }
  349. NSDictionary *pkInfo = @{};
  350. if ([[roomDic valueForKey:@"pkinfo"] isKindOfClass:[NSDictionary class]]) {
  351. pkInfo = [roomDic valueForKey:@"pkinfo"];
  352. if (![minstr([pkInfo valueForKey:@"pkuid"]) isEqual:@"0"]) {
  353. [self changeLinkPlayer:YES toHostid:minstr([pkInfo valueForKey:@"pkuid"])];
  354. if ([minstr([pkInfo valueForKey:@"ifpk"]) isEqual:@"1"]) {
  355. [_playCtrlView socketLinkPKStart:pkInfo];
  356. NSMutableDictionary *pkDic = [NSMutableDictionary dictionary];
  357. [pkDic setObject:minstr([_playDic valueForKey:@"uid"]) forKey:@"pkuid1"];
  358. [pkDic setObject:minstr([pkInfo valueForKey:@"pk_gift_liveuid"]) forKey:@"pktotal1"];
  359. [pkDic setObject:minstr([pkInfo valueForKey:@"pk_gift_pkuid"]) forKey:@"pktotal2"];
  360. [_playCtrlView socketLinkPKProgress:pkDic];
  361. }
  362. }
  363. }
  364. }
  365. -(void)reloadUserList {
  366. [_playCtrlView timerReloadList];
  367. }
  368. #pragma mark - socket 监听
  369. -(void)startSocketBlockMonitor {
  370. YBWeakSelf;
  371. //被超管关播
  372. [YBSocketPlay playSocketManeger].roomCloseByAdmin = ^(NSString *socEvent, NSDictionary *socketDic) {
  373. //进入结束页面
  374. [weakSelf requestLiveOverInfo];
  375. };
  376. //用户点亮
  377. [YBSocketPlay playSocketManeger].userLight = ^(NSString *socEvent, NSDictionary *socketDic) {
  378. [weakSelf.playCtrlView socketLightAnimation];
  379. };
  380. //发言
  381. [YBSocketPlay playSocketManeger].userSendMsg = ^(NSString *socEvent, NSDictionary *socketDic) {
  382. [weakSelf.playCtrlView socketChatDic:socketDic];
  383. };
  384. //用户离开
  385. [YBSocketPlay playSocketManeger].userLeave = ^(NSString *socEvent, NSDictionary *socketDic) {
  386. [weakSelf.playCtrlView socketUserLeave:socketDic];
  387. };
  388. //用户进入
  389. [YBSocketPlay playSocketManeger].userEnter = ^(NSString *socEvent, NSDictionary *socketDic) {
  390. [weakSelf.playCtrlView socketUserEnter:socketDic];
  391. };
  392. //直播关闭
  393. [YBSocketPlay playSocketManeger].liveOff = ^(NSString *socEvent, NSDictionary *socketDic) {
  394. [weakSelf requestLiveOverInfo];
  395. };
  396. //系统消息
  397. [YBSocketPlay playSocketManeger].systemMsg = ^(NSString *socEvent, NSDictionary *socketDic) {
  398. [weakSelf.playCtrlView socketChatDic:socketDic];
  399. };
  400. //设置-取消管理
  401. [YBSocketPlay playSocketManeger].setAdmin = ^(NSString *socEvent, NSDictionary *socketDic) {
  402. _userType = minstr([socketDic valueForKey:@"usertype"]);
  403. [weakSelf.playCtrlView socketChatDic:socketDic];
  404. };
  405. //踢人
  406. [YBSocketPlay playSocketManeger].kickUser = ^(NSString *socEvent, NSDictionary *socketDic) {
  407. //退出房间
  408. [weakSelf dismissVC];
  409. };
  410. //送礼物
  411. [YBSocketPlay playSocketManeger].sendGift = ^(NSString *socEvent, NSDictionary *socketDic) {
  412. [weakSelf.playCtrlView socketSendGift:socketDic];
  413. };
  414. //在售商品
  415. [YBSocketPlay playSocketManeger].onSaleMsg = ^(NSString *socEvent, NSDictionary *socketDic) {
  416. [weakSelf.playCtrlView socketOnSale:socketDic];
  417. };
  418. //购买守护
  419. [YBSocketPlay playSocketManeger].buyGuardMsg = ^(NSString *socEvent, NSDictionary *socketDic) {
  420. [weakSelf.playCtrlView socketUpdateGuardMsg:socketDic];
  421. };
  422. //主播同意
  423. [YBSocketPlay playSocketManeger].linkHostAgree = ^(NSString *socEvent, NSDictionary *socketDic) {
  424. [weakSelf.playCtrlView socketHostIsAgree:YES andSocDic:socketDic];
  425. };
  426. //主播拒绝
  427. [YBSocketPlay playSocketManeger].linkHostUnAgree = ^(NSString *socEvent, NSDictionary *socketDic) {
  428. [weakSelf.playCtrlView socketHostIsAgree:NO andSocDic:socketDic];
  429. };
  430. //主播下麦用户
  431. [YBSocketPlay playSocketManeger].linkHostDisconnect = ^(NSString *socEvent, NSDictionary *socketDic) {
  432. [weakSelf.playCtrlView socketHostDisconnect:socketDic];
  433. NSString *touid = minstr([socketDic valueForKey:@"touid"]);
  434. if ([touid isEqual:[Config getOwnID]]) {
  435. NSString *playUrl = [_playDic valueForKey:@"pull"];
  436. V2TXLiveCode result = [weakSelf.txLivePlayer startLivePlay:playUrl];
  437. NSLog(@"wangminxin-----%ld",result);
  438. }
  439. };
  440. //主播忙碌
  441. [YBSocketPlay playSocketManeger].linkHostBusy = ^(NSString *socEvent, NSDictionary *socketDic) {
  442. [weakSelf.playCtrlView socketHostBusy:socketDic];
  443. };
  444. //主播超时
  445. [YBSocketPlay playSocketManeger].linkHostTimeout = ^(NSString *socEvent, NSDictionary *socketDic) {
  446. [weakSelf.playCtrlView socketHostTimeout:socketDic];
  447. };
  448. //主播主播开始
  449. [YBSocketPlay playSocketManeger].linkHostToHostStart = ^(NSString *socEvent, NSDictionary *socketDic) {
  450. [weakSelf changeLinkPlayer:YES toHostid:minstr([socketDic valueForKey:@"pkuid"])];
  451. };
  452. //主播主播结束
  453. [YBSocketPlay playSocketManeger].linkHostToHostDisconnect = ^(NSString *socEvent, NSDictionary *socketDic) {
  454. [weakSelf changeLinkPlayer:NO toHostid:@""];
  455. [weakSelf.playCtrlView destroyPkView];
  456. };
  457. //PK开始
  458. [YBSocketPlay playSocketManeger].linkPKSuc = ^(NSString *socEvent, NSDictionary *socketDic) {
  459. [weakSelf.playCtrlView socketLinkPKStart:socketDic];
  460. };
  461. //PK结果
  462. [YBSocketPlay playSocketManeger].linkPKResult = ^(NSString *socEvent, NSDictionary *socketDic) {
  463. [weakSelf.playCtrlView socketLinkPKReult:socketDic];
  464. };
  465. //PK进度
  466. [YBSocketPlay playSocketManeger].linkPKProgress = ^(NSString *socEvent, NSDictionary *socketDic) {
  467. [weakSelf.playCtrlView socketLinkPKProgress:socketDic];
  468. };
  469. }
  470. -(void)changeLinkPlayer:(BOOL)isLink toHostid:(NSString *)toHostid{
  471. _pkBgIV.hidden = !isLink;
  472. if (isLink) {
  473. [_playCtrlView showToHostInfoWithId:toHostid];
  474. _videoPlayView.frame = CGRectMake(0, _window_height*_currentIndex + 130+statusbarHeight, _window_width, _window_width*2/3);
  475. }else {
  476. [_playCtrlView destroyPkTohostInfo];
  477. _videoPlayView.frame = CGRectMake(0, _window_height*_currentIndex, _window_width, _window_height);
  478. }
  479. // [_txLivePlayer setupVideoWidget:_videoPlayView.bounds containView:_videoPlayView insertIndex:0];
  480. [_txLivePlayer setRenderView:_videoPlayView];
  481. }
  482. #pragma mark - 控制层回调
  483. -(void)controlViewCallBack:(NSString *)eventType andEvnent:(NSDictionary *)eventDic {
  484. YBWeakSelf;
  485. if ([eventType isEqual:@"控制-关闭"]) {
  486. [weakSelf dismissVC];
  487. }
  488. if ([eventType isEqual:@"控制-直播聊天"]) {
  489. //发送socket 'ct' [eventDic valueForKey:@"ct"]
  490. [[YBSocketPlay playSocketManeger] playSendMsg:minstr([eventDic valueForKey:@"ct"]) otherDic:@{@"usertype":_userType,@"guard_type":minstr([_playCtrlView.guardInfo valueForKey:@"type"])}];
  491. }
  492. if ([eventType isEqual:@"控制-信息卡"]) {
  493. [weakSelf showButtleView:minstr([eventDic valueForKey:@"id"])];
  494. }
  495. if ([eventType isEqual:@"控制-点亮"] && _firstStar == 0 && ![_userType isEqual:@"60"]) {
  496. _firstStar = 1;
  497. [[YBSocketPlay playSocketManeger] playSendLight:_userType otherDic:@{@"guard_type":minstr([_playCtrlView.guardInfo valueForKey:@"type"])}];
  498. }
  499. if ([eventType isEqual:@"控制-礼物"]) {
  500. [[YBSocketPlay playSocketManeger] playSendGift:eventDic];
  501. }
  502. if ([eventType isEqual:@"控制-关注"]) {
  503. [[YBSocketPlay playSocketManeger] playSendAttention];
  504. }
  505. if ([eventType isEqual:@"控制-私信"]) {
  506. [weakSelf liveRoomPraviteMsg];
  507. }
  508. if ([eventType isEqual:@"控制-购买守护"]) {
  509. //发送守护购买成功socket
  510. [[YBSocketPlay playSocketManeger] playSendBuyGuardSuc:eventDic];
  511. }
  512. if ([eventType isEqual:@"控制-用户申请连麦"]) {
  513. [[YBSocketPlay playSocketManeger] playSendUserHostLink];
  514. }
  515. if ([eventType isEqual:@"控制-用户连麦重新拉流"]) {
  516. [_txLivePlayer stopPlay];
  517. NSString *playurl = minstr([eventDic valueForKey:@"playurl"]);
  518. NSString *streamUrlWithSignature = minstr([eventDic valueForKey:@"streamUrlWithSignature"]);
  519. V2TXLiveCode liveCode = [_txLivePlayer startLivePlay:streamUrlWithSignature];
  520. NSLog(@"gethostlowurl---:%ld",liveCode);
  521. [[YBSocketPlay playSocketManeger] playSendUserLinkUrl:playurl];
  522. }
  523. if ([eventType isEqual:@"控制-用户断开连麦"]) {
  524. [[YBSocketPlay playSocketManeger] playSendUserDisconnect];
  525. NSString *playUrl = [_playDic valueForKey:@"pull"];
  526. V2TXLiveCode result = [weakSelf.txLivePlayer startLivePlay:playUrl];
  527. NSLog(@"wangminxin-----%ld",result);
  528. }
  529. }
  530. #pragma mark - 直播间私信列表开始
  531. -(void)liveRoomPraviteMsg {
  532. [self destroyImListView];
  533. YBWeakSelf;
  534. _imListView = [YBImRoomSmallView showImListWithLiveUid:minstr([_playDic valueForKey:@"uid"])];
  535. _imListView.imSmallType = ImSmall_List;
  536. _imListView.imCtrEvent = ^(ImCtrType type, NSDictionary *ctrDic) {
  537. if (type == ImCtr_Dismiss) {
  538. [weakSelf destroyImListView];
  539. }
  540. };
  541. }
  542. -(void)destroyImListView {
  543. if (_imListView) {
  544. [_imListView removeFromSuperview];
  545. _imListView = nil;
  546. }
  547. }
  548. #pragma mark - 用户卡片信息开始
  549. - (void)showButtleView:(NSString *)touid{
  550. if (buttleView) {
  551. [self removeButtleView];
  552. }
  553. buttleView = [[UserBulletWindow alloc]initWithUserID:touid andIsAnchor:NO andAnchorID:minstr([_playDic valueForKey:@"uid"])];
  554. buttleView.delegate = self;
  555. [self.view addSubview:buttleView];
  556. }
  557. - (void)removeButtleView {
  558. [buttleView destroySubs];
  559. [buttleView removeFromSuperview];
  560. buttleView = nil;
  561. }
  562. -(void)socketShutUp:(NSString *)name andID:(NSString *)ID andType:(NSString *)type {
  563. [[YBSocketPlay playSocketManeger] playSendShutUpUser:@{@"type":type,@"touid":ID,@"touname":name}];
  564. }
  565. -(void)socketkickuser:(NSString *)name andID:(NSString *)ID {
  566. [[YBSocketPlay playSocketManeger] playSendKickUser:@{@"touname":name,@"touid":ID}];
  567. }
  568. -(void)pushZhuYe:(NSString *)IDS {
  569. YBCenterVC *center = [[YBCenterVC alloc]init];
  570. center.otherUid = IDS;
  571. center.isPush = YES;
  572. YBWeakSelf;
  573. center.followEvent = ^(NSString *isAttent) {
  574. [weakSelf updateFollowBtnIsAtten:[isAttent intValue]];
  575. };
  576. [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"isPlaying"];
  577. [[YBBaseAppDelegate sharedAppDelegate] pushViewController:center animated:YES];
  578. }
  579. -(void)siXin:(NSString *)icon andName:(NSString *)name andID:(NSString *)ID andIsatt:(NSString *)isatt {
  580. [self destroyImListView];
  581. YBWeakSelf;
  582. [[YBMessageManager shareManager] getChatCellDataWithTouid:ID finish:^(int code, TConversationCellData * _Nonnull cellData) {
  583. dispatch_async(dispatch_get_main_queue(), ^{
  584. if (code == 0) {
  585. _imListView = [YBImRoomSmallView showImListWithLiveUid:[Config getOwnID]];
  586. _imListView.imSmallType = ImSmall_C2C;
  587. [_imListView goChatWithC2CWithConv:cellData];
  588. _imListView.imCtrEvent = ^(ImCtrType type, NSDictionary *ctrDic) {
  589. if (type == ImCtr_Dismiss) {
  590. [weakSelf destroyImListView];
  591. }
  592. };
  593. }
  594. });
  595. }];
  596. }
  597. -(void)superAdmin:(NSString *)state andBanMsg:(NSString *)banMsg;{
  598. [[YBSocketPlay playSocketManeger] playSendStopLive:banMsg];
  599. }
  600. -(void)doReportAnchor:(NSString *)touid {
  601. YBLiveReportVC *vc = [[YBLiveReportVC alloc]init];
  602. vc.dongtaiId = touid;
  603. vc.isLive = YES;
  604. [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"isPlaying"];
  605. [[YBBaseAppDelegate sharedAppDelegate]pushViewController:vc animated:YES];
  606. }
  607. #pragma mark - 用户卡片信息结束
  608. #pragma mark - 退出房间
  609. -(void)releaseAllOfChangeRoom:(BOOL)isChangeRoom {
  610. if (!isChangeRoom) {
  611. [self destroyPusher];
  612. [[NSNotificationCenter defaultCenter]removeObserver:self];
  613. [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"isPlaying"];
  614. [[UIApplication sharedApplication] setIdleTimerDisabled:NO];
  615. }else{
  616. [_txLivePlayer stopPlay];
  617. if(self.videoPlayer){
  618. [self.videoPlayer stop];
  619. }
  620. }
  621. [_playCtrlView destroyCtrSubView];
  622. //计时器
  623. if (_listTimer) {
  624. [_listTimer invalidate];
  625. _listTimer = nil;
  626. }
  627. //socket
  628. [[YBSocketPlay playSocketManeger]playDisconnectSocket];
  629. //用户信息卡
  630. if (buttleView) {
  631. [buttleView removeFromSuperview];
  632. buttleView = nil;
  633. }
  634. [self destroyImListView];
  635. }
  636. //直接退出房间
  637. -(void)dismissVC {
  638. [self releaseAllOfChangeRoom:NO];
  639. [self clickNaviLeftBtn];
  640. }
  641. #pragma mark - 直播结束
  642. //进入结束页面
  643. -(void)requestLiveOverInfo {
  644. //释放
  645. [self releaseAllOfChangeRoom:NO];
  646. [MBProgressHUD showMessage:@""];
  647. YBWeakSelf;
  648. [YBNetworking postWithUrl:@"Live.stopInfo" Dic:@{@"stream":minstr([_playDic valueForKey:@"stream"])} Suc:^(int code, id info, NSString *msg) {
  649. [MBProgressHUD hideHUD];
  650. if (code == 0) {
  651. _playCtrlView.hidden = YES;
  652. NSDictionary *subdic = [info firstObject];
  653. [weakSelf createEndView:subdic];
  654. }else {
  655. [MBProgressHUD showPop:msg];
  656. }
  657. } Fail:^(id fail) {
  658. [MBProgressHUD hideHUD];
  659. }];
  660. }
  661. -(void)createEndView:(NSDictionary *)endDic {
  662. [self.view addSubview:self.playEndView];
  663. NSMutableDictionary *allDic = @{@"hostAvatar":minstr([_playDic valueForKey:@"avatar"]),@"hostName":minstr([_playDic valueForKey:@"user_nickname"])}.mutableCopy;
  664. [allDic addEntriesFromDictionary:endDic];
  665. [_playEndView updateData:allDic];
  666. }
  667. #pragma mark - 通知
  668. -(void)addNotification {
  669. NSNotificationCenter *noti = [NSNotificationCenter defaultCenter];
  670. [noti addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
  671. [noti addObserver:self selector:@selector(keyboardWillHidden) name:UIKeyboardWillHideNotification object:nil];
  672. // [noti addObserver:self selector:@selector(forsixin:) name:@"sixinok" object:nil];
  673. [noti addObserver:self selector:@selector(reloadLiveplayAttion:) name:@"reloadLiveplayAttion" object:nil];
  674. [noti addObserver:self selector:@selector(youngModelTimeEnd:) name:ybYoungModelTimeEndEvent object:nil];
  675. // [noti addObserver:self selector:@selector(onRefreshConversations:) name:TUIKitNotification_TIMRefreshListener object:nil];
  676. [noti addObserver:self selector:@selector(updataFollow:) name:ybImC2CFollow object:nil];
  677. //获取所有未读消息
  678. [[V2TIMManager sharedInstance] addConversationListener:self];
  679. }
  680. -(void)updataFollow:(NSNotification *)not {
  681. NSString *isAttent = [NSString stringWithFormat:@"%@",not.object];
  682. [self updateFollowBtnIsAtten:[isAttent intValue]];
  683. }
  684. // 收到所有会话的未读总数变更通知
  685. - (void)onTotalUnreadMessageCountChanged:(UInt64)totalUnreadCount {
  686. [self requestJmsg];
  687. }
  688. -(void)youngModelTimeEnd:(NSNotification *)not {
  689. [self dismissVC];
  690. [PublicObj layoutWindowPopLayer];
  691. }
  692. -(void)keyboardWillShow:(NSNotification *)not {
  693. //获取键盘的高度
  694. NSDictionary *userInfo = [not userInfo];
  695. NSValue *aValue = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey];
  696. CGRect keyboardRect = [aValue CGRectValue];
  697. CGFloat height = keyboardRect.size.height;
  698. [UIView animateWithDuration:0.3 animations:^{
  699. if (_playCtrlView) {
  700. _playCtrlView.keyBoardIsShow = YES;
  701. _playCtrlView.top = - height+_window_height*_currentIndex;
  702. [_playCtrlView keyBoardNoticeIsShow:YES andHeight:height];
  703. }
  704. }completion:^(BOOL finished) {
  705. //很奇怪刘海屏offsety会变为37,这里重置一下
  706. [_playCtrlView.horScrollView setContentOffset:CGPointMake(_window_width, 0) animated:YES];
  707. }];
  708. }
  709. -(void)keyboardWillHidden {
  710. [UIView animateWithDuration:0.3 animations:^{
  711. if (_playCtrlView) {
  712. _playCtrlView.keyBoardIsShow = NO;
  713. _playCtrlView.top = 0+_window_height*_currentIndex;
  714. _playCtrlView.chatTool.hidden = YES;
  715. _playCtrlView.botBtnFunView.hidden = NO;
  716. [_playCtrlView keyBoardNoticeIsShow:NO andHeight:0];
  717. }
  718. }];
  719. }
  720. - (void)reloadLiveplayAttion:(NSNotification *)not{
  721. NSDictionary *dic = [not object];
  722. int isAttent = [minstr([dic valueForKey:@"isattent"]) intValue];
  723. [self updateFollowBtnIsAtten:isAttent];
  724. }
  725. -(void)updateFollowBtnIsAtten:(int)isAttent {
  726. [_playCtrlView updateFollowShow:(isAttent == 1 ? NO : YES)];
  727. if (isAttent == 1) {
  728. [[YBSocketPlay playSocketManeger] playSendAttention];
  729. }
  730. }
  731. #pragma mark - 私信监听
  732. -(void)requestJmsg {
  733. [[YBImManager shareInstance]getAllUnredNumExceptUser:@[@"dsp_admin_1",@"dsp_fans",@"dsp_like",@"dsp_at",@"dsp_comment",@"dsp_user_live",@"goodsorder_admin"] complete:^(int allUnread) {
  734. unRead = allUnread;
  735. dispatch_async(dispatch_get_main_queue(), ^{
  736. if (_playCtrlView) {
  737. [_playCtrlView updateUnread:unRead];
  738. }
  739. });
  740. }];
  741. }
  742. #pragma mark - set/get
  743. - (UIImageView *)pkBgIV {
  744. if (!_pkBgIV) {
  745. _pkBgIV = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, _window_width, _window_height)];
  746. _pkBgIV.contentMode = UIViewContentModeScaleAspectFill;
  747. _pkBgIV.clipsToBounds = YES;
  748. //_pkBgIV.image = [UIImage imageNamed:@"pk背景"];
  749. _pkBgIV.userInteractionEnabled = YES;
  750. _pkBgIV.hidden = YES;
  751. _pkBgIV.backgroundColor = RGB_COLOR(@"#1e1e1e", 1);
  752. }
  753. return _pkBgIV;
  754. }
  755. - (YBPlayCtrlView *)playCtrlView {
  756. if (!_playCtrlView) {
  757. YBWeakSelf;
  758. _playCtrlView = [[YBPlayCtrlView alloc]initWithFrame:CGRectMake(0, 0, _window_width, _window_height)];
  759. _playEndView.backgroundColor = RGB_COLOR(@"#1e1e1e", 1);
  760. _playCtrlView.playDic = _playDic;
  761. _playCtrlView.playCtrEvent = ^(NSString *eventStr, NSDictionary *eventDic) {
  762. [weakSelf controlViewCallBack:eventStr andEvnent:eventDic];
  763. };
  764. }
  765. return _playCtrlView;
  766. }
  767. - (YBLiveEndView *)playEndView {
  768. if (!_playEndView) {
  769. YBWeakSelf;
  770. _playEndView = [[YBLiveEndView alloc]initWithFrame:CGRectMake(0, 0, _window_width, _window_height)];
  771. _playEndView.liveEndEvent = ^{
  772. [weakSelf clickNaviLeftBtn];
  773. };
  774. }
  775. return _playEndView;
  776. }
  777. #pragma mark - 切换房间 s
  778. - (UIScrollView *)changeRoomScroll {
  779. if (!_changeRoomScroll) {
  780. _changeRoomScroll = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, _window_width, _window_height)];
  781. _changeRoomScroll.delegate = self;
  782. _changeRoomScroll.pagingEnabled = YES;
  783. _changeRoomScroll.showsVerticalScrollIndicator = NO;
  784. _changeRoomScroll.bounces = NO;
  785. _changeRoomScroll.contentSize = CGSizeMake(_window_width, _window_height*_listArray.count);
  786. _changeRoomScroll.contentOffset = CGPointMake(0, _window_height*_currentIndex);
  787. for (int i=0; i<_listArray.count; i++) {
  788. NSDictionary *listDic = _listArray[i];
  789. UIImageView *avaEffect = [PublicObj getAvatarEffectWithUrl:minstr([listDic valueForKey:@"avatar"])];
  790. avaEffect.frame = CGRectMake(0, _window_height*i, _window_width, _window_height);
  791. [_changeRoomScroll addSubview:avaEffect];
  792. }
  793. }
  794. return _changeRoomScroll;
  795. }
  796. - (void)scrollViewDidScroll:(UIScrollView *)scrollView {
  797. if (scrollView == _changeRoomScroll) {
  798. _playCtrlView.keyBoardIsShow = NO;
  799. [_playCtrlView.chatTool.chatTF resignFirstResponder];
  800. _changeScorllOffSetY = _changeRoomScroll.contentOffset.y;
  801. }
  802. }
  803. -(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
  804. if (scrollView == _changeRoomScroll) {
  805. _changeScorllOffSetY = _changeRoomScroll.contentOffset.y;
  806. if (_changeScorllOffSetY < 0 || (_currentIndex == _changeScorllOffSetY/_window_height)) {
  807. return;
  808. }
  809. NSInteger newIndex = _changeScorllOffSetY/_window_height;
  810. NSDictionary *newPlayDic = _listArray[newIndex];
  811. //[MBProgressHUD showMessage:@""];
  812. YBWeakSelf;
  813. [YBNetworking postWithUrl:@"Live.checkLive" Dic:@{@"liveuid":minstr([newPlayDic valueForKey:@"uid"]),@"stream":minstr([newPlayDic valueForKey:@"stream"])} Suc:^(int code, id info, NSString *msg) {
  814. [MBProgressHUD hideHUD];
  815. if (code == 0) {
  816. _currentIndex = newIndex;
  817. _playDic = newPlayDic;
  818. [_txLivePlayer stopPlay];
  819. if(self.videoPlayer){
  820. [self.videoPlayer stop];
  821. }
  822. [weakSelf changeRoomReset];
  823. }else {
  824. [MBProgressHUD showPop:msg];
  825. }
  826. } Fail:^(id fail) {
  827. [MBProgressHUD hideHUD];
  828. }];
  829. }
  830. }
  831. #pragma mark - 切换房间 e
  832. @end