VideoManager.m 5.6 KB

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