VideoManager.m 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. //
  2. // VideoManager.m
  3. // SikeyComm
  4. //
  5. // Created by 刘振兴 on 2024/3/21.
  6. // Copyright © 2024 BaH Cy. All rights reserved.
  7. //
  8. #import "VideoManager.h"
  9. #import "VideoManager+juphoon.h"
  10. #import "VideoManager+agora.h"
  11. #import "VideoManager+http.h"
  12. #import "VideoManager+timer.h"
  13. @implementation VideoManager
  14. + (VideoManager *)shared {
  15. static VideoManager *manager;
  16. static dispatch_once_t token;
  17. dispatch_once(&token, ^{
  18. manager = [[VideoManager alloc] init];
  19. });
  20. return manager;
  21. }
  22. - (void)initManager {
  23. [self initJuphoon];
  24. [self initAgora];
  25. }
  26. - (void)clear {
  27. [self logoutJuphoon];
  28. [self clearAgora];
  29. }
  30. #pragma mark -
  31. - (void)actionFromSocket:(SocketModel*)model dial:(NSInteger)dial {
  32. if (dial <= 0) {
  33. ChildModel* childModel = [[DataManager shared] getChildWithTicket:self.mTicket];
  34. BOOL isEquel = [model.sendId isEqualToString:childModel.cid];
  35. if (isEquel) {
  36. [EasyTextView showInfoText:NSLocalizedString(@"Video.Error.Hangup", nil)];
  37. [self term];
  38. }
  39. } else {
  40. self.uid = [DataManager shared].loginModel.uid;
  41. self.mTicket = [[DataManager shared] getDevice:model.sendId].ticket;
  42. self.mToken = ((SocketContentModel*)model.content).token;
  43. self.mChannelName = ((SocketContentModel*)model.content).channelName;
  44. [self videoReceiveStart];
  45. }
  46. }
  47. - (void)videoCallStart:(NSString*)uid ticket:(NSString*)ticket {
  48. @weakify(self);
  49. BOOL isReachable = [[AFNetworkReachabilityManager sharedManager] isReachable];
  50. if (!isReachable) {
  51. [EasyTextView showErrorText:NSLocalizedString(@"Network.Error", nil)];
  52. return;
  53. }
  54. HDNormalLog(([NSString stringWithFormat:@"VideoManager: videoCallStart: uid:%@ ticket:%@", uid, ticket]));
  55. DeviceModel* model = [[DataManager shared]getDeviceWithTicket:ticket];
  56. if (!model)
  57. return;
  58. self.uid = uid;
  59. self.mTicket = ticket;
  60. if (model.videoType == VIDEO_TYPE_JUPHOON) {
  61. BOOL isok = [self call:uid ticket:ticket];
  62. if (!isok) {
  63. //如果失败,很有可能登录失败,重新登录//
  64. [self loginJuphoon];
  65. [EasyTextView showErrorText:[NSString stringWithFormat:NSLocalizedString(@"Video.Error.User.Login", nil)]];
  66. } else {
  67. [self requestVideo:uid ticket:ticket dial:1 callback:^(BOOL isOK, NSString *token) {
  68. }];
  69. [self startTimeoutTimer];
  70. }
  71. } else if (model.videoType == VIDEO_TYPE_AGORA) {
  72. [self requestVideo:uid ticket:ticket dial:1 callback:^(BOOL isOK, NSString *token) {
  73. if (isOK && token.length > 0) {
  74. [weak_self joinChannel:token channelId:[self getChannelName:uid ticket:ticket] uid:0];
  75. [weak_self startTimeoutTimer];
  76. }
  77. }];
  78. }
  79. }
  80. - (void)videoReceiveStart {
  81. DeviceModel* model = [[DataManager shared]getDeviceWithTicket:self.mTicket];
  82. if (model.videoType == VIDEO_TYPE_JUPHOON) {
  83. [self loginJuphoon];
  84. } else if (model.videoType == VIDEO_TYPE_AGORA) {
  85. [self showInCallVC];
  86. }
  87. }
  88. - (void)videoAnswer {
  89. DeviceModel* model = [[DataManager shared]getDeviceWithTicket:self.mTicket];
  90. if (model.videoType == VIDEO_TYPE_JUPHOON) {
  91. JCCallItem *activeCall = [self getActiveCall];
  92. [self.mJuphoonCall answer:activeCall video:true];
  93. } else if (model.videoType == VIDEO_TYPE_AGORA) {
  94. [self joinChannel:self.mToken channelId:self.mChannelName uid:0];
  95. }
  96. }
  97. - (void)videoEnd:(BOOL)isIncomming isSendMessage:(BOOL)isSendMessage {
  98. HDNormalLog(([NSString stringWithFormat:@"VideoManager: videoEnd:%d", isIncomming]));
  99. //发消息
  100. if (isSendMessage) {
  101. [self requestVideo:self.uid ticket:self.mTicket dial:-1 callback:^(BOOL isOK, NSString *token) {
  102. }];
  103. }
  104. [self term];
  105. }
  106. - (void)termWithTimeout {
  107. [EasyTextView showErrorText:NSLocalizedString(@"Video.Error.Timeout", nil)];
  108. [self videoEnd:YES isSendMessage:YES];
  109. }
  110. - (void)term {
  111. DeviceModel* model = [[DataManager shared] getDeviceWithTicket:self.mTicket];
  112. if (model.videoType == VIDEO_TYPE_JUPHOON) {
  113. [self termJuphoon];
  114. } else if (model.videoType == VIDEO_TYPE_AGORA) {
  115. [self termAgora];
  116. }
  117. }
  118. - (void)switchCamera {
  119. DeviceModel* model = [[DataManager shared] getDeviceWithTicket:self.mTicket];
  120. if (model.videoType == VIDEO_TYPE_JUPHOON) {
  121. [self switchCameraJuphoon];
  122. } else if (model.videoType == VIDEO_TYPE_AGORA) {
  123. [self switchCameraAgora];
  124. }
  125. }
  126. - (void)showInCallVC {
  127. if (self.mInCallVC)
  128. return;
  129. NSLog(@"VideoManager: showInCallVC");
  130. UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
  131. self.mInCallVC = [storyboard instantiateViewControllerWithIdentifier:@"InCallVC"];
  132. [self.mInCallVC setHidesBottomBarWhenPushed:YES];
  133. [EUtil pushViewController:self.mInCallVC animated:YES];
  134. }
  135. - (void)removeInCallVC {
  136. if (self.mInCallVC) {
  137. [self.mInCallVC.navigationController popViewControllerAnimated:YES];
  138. }
  139. self.mInCallVC = nil;
  140. }
  141. - (BOOL)isVideoTalking {
  142. DeviceModel* model = [[DataManager shared] getDeviceWithTicket:self.mTicket];
  143. if (model.videoType == VIDEO_TYPE_JUPHOON) {
  144. JCCallItem *activeCall = [[VideoManager shared] getActiveCall];
  145. return activeCall.video || activeCall.state == JCCallStateTalking;
  146. } else if (model.videoType == VIDEO_TYPE_AGORA) {
  147. return self.uid.length > 0 && self.mChannelName.length > 0;
  148. }
  149. return NO;
  150. }
  151. - (JCCallItem*)getActiveCall {
  152. for (JCCallItem* item in self.mJuphoonCall.callItems) {
  153. if (item.active) {
  154. return item;
  155. }
  156. }
  157. return nil;
  158. }
  159. - (NSString*)getTalkName {
  160. NSString* talkId = self.mTicket;
  161. ChildModel* model = [[DataManager shared] getChildWithTicket:talkId];
  162. return model ? model.name : @"";
  163. }
  164. - (NSString*)getTalkHeadImageURL {
  165. NSString* talkId = self.mTicket;
  166. ChildModel* model = [[DataManager shared] getChildWithTicket:talkId];
  167. return model ? model.avatar : @"";
  168. }
  169. - (NSString*)getChannelName:(NSString*)sid ticket:(NSString*)ticket {
  170. return [NSString stringWithFormat:@"%@_%@", sid, ticket];
  171. }
  172. @end