VideoManager+juphoon.m 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. //
  2. // VideoManager+juphoon.m
  3. // SikeyComm
  4. //
  5. // Created by 刘振兴 on 2025/2/11.
  6. // Copyright © 2025 BaH Cy. All rights reserved.
  7. //
  8. #import "VideoManager+juphoon.h"
  9. #import "VideoManager+timer.h"
  10. #import "VideoManager+view.h"
  11. #define APP_KEY_JUPHOON @"99c9063b9f54482e1d586e08" //@"75e06df8717cb0df36b35097"
  12. #define kCallIetmKey @"kCallIetmKey"
  13. @interface VideoManager() <JCClientCallback, JCMediaDeviceCallback, JCCallCallback>
  14. @end
  15. @implementation VideoManager (juphoon)
  16. //初始化
  17. - (BOOL)initJuphoon {
  18. self.mJuphoonClient = [JCClient create:APP_KEY_JUPHOON callback:self createParam:nil];
  19. self.mJuphoonMediaDevice = [JCMediaDevice create:self.mJuphoonClient callback:self];
  20. self.mJuphoonCall = [JCCall create:self.mJuphoonClient mediaDevice:self.mJuphoonMediaDevice callback:self];
  21. self.mJuphoonCall.mediaConfig = [JCCallMediaConfig generateByMode:JCCallMediaConfigModeIOT];
  22. self.mJuphoonMediaDevice.videoAngle = JCMediaDeviceVideoAngel0;
  23. [self.mJuphoonMediaDevice setCameraProperty:640 height:360 framerate:10];
  24. [self.mJuphoonMediaDevice enableSpeaker:YES];
  25. //Zmf_VideoCaptureListenRotation(0, 0);
  26. //Zmf_VideoRenderListenRotation(0,0);
  27. return self.mJuphoonClient.state == JCClientStateIdle;
  28. }
  29. - (void)loginJuphoon {
  30. NSString* uid = [DataManager shared].loginModel.uid;
  31. NSString* password = @"123456";
  32. JCClientLoginParam* loginParam = [[JCClientLoginParam alloc] init];
  33. BOOL isOK = [self.mJuphoonClient login:uid password:password loginParam:loginParam];
  34. HDNormalLog(([NSString stringWithFormat:@"VideoManager: login call: %d", isOK]));
  35. }
  36. - (void)logoutJuphoon {
  37. if (self.mJuphoonClient) {
  38. [self.mJuphoonClient logout];
  39. }
  40. }
  41. - (JCMediaDeviceVideoCanvas*)getLocalCanvas {
  42. return [self.mJuphoonMediaDevice startCameraVideo:JCMediaDeviceRenderFullScreen];
  43. }
  44. - (JCMediaDeviceVideoCanvas*)getRemoteCanvas {
  45. JCCallItem *activeCall = [self getActiveCall];
  46. return [self.mJuphoonMediaDevice startVideo:activeCall.renderId renderType:JCMediaDeviceRenderFullContent];
  47. }
  48. - (BOOL)call:(NSString*)uid ticket:(NSString*)ticket {
  49. JCCallParam* callParam = [JCCallParam callParamWithExtraParam:@"" ticket:ticket];
  50. return [self.mJuphoonCall call:ticket video:true callParam:callParam];
  51. }
  52. //挂断
  53. - (void)termJuphoon {
  54. for (JCCallItem* item in self.mJuphoonCall.callItems) {
  55. if (item.active) {
  56. [self.mJuphoonCall term:item reason:JCCallReasonNone description:@"test"];
  57. return;
  58. }
  59. }
  60. }
  61. - (void)switchCameraJuphoon {
  62. [self.mJuphoonMediaDevice switchCamera];
  63. }
  64. - (void)muteJuphoon {
  65. JCCallItem *activeCall = [self getActiveCall];
  66. [self.mJuphoonCall mute:activeCall];
  67. }
  68. - (void)speakerJuphoon {
  69. BOOL isOn = self.mJuphoonMediaDevice.isSpeakerOn;
  70. [self.mJuphoonMediaDevice enableSpeaker:!isOn];
  71. }
  72. #pragma mark - JCMediaDeviceCallback
  73. /**
  74. * 登录结果回调
  75. *
  76. * 在调用 {@link JCClient#login:password:loginParam: login} 方法成功后会收到此回调
  77. *
  78. * @param result 登录是否成功
  79. * - true:登录成功
  80. * - false:登录失败
  81. * @param reason 登录失败原因,当 result 为 false 时该值有效。参见:@ref JCClientReason "错误原因"
  82. */
  83. - (void)onLogin:(bool)result reason:(JCClientReason)reason {
  84. @weakify(self);
  85. HDNormalLog(([NSString stringWithFormat:@"VideoManager: login Result:%d Reason:%ld", result, reason]));
  86. if (result) {// 登录成功
  87. } else if (reason == JCClientReasonAuth) {// 账号密码错误
  88. } else {
  89. //如果没有成功//
  90. if (reason != JCClientReasonNone && reason != JCClientReasonStateCannotLogin) {
  91. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  92. [weak_self loginJuphoon];
  93. });
  94. }
  95. }
  96. }
  97. /**
  98. * 登出回调
  99. *
  100. * 在调用 {@link JCClient#logout logout} 方法成功会收到此回调
  101. *
  102. * @param reason 登出失败原因,参见:@ref JCClientReason "错误原因"
  103. */
  104. - (void)onLogout:(JCClientReason)reason {
  105. HDNormalLog(@"VideoManager: onLogout");
  106. }
  107. /**
  108. * 登录状态变化回调
  109. *
  110. * 在用户的登录状态发生改变时会收到此回调,登录状态:
  111. * - @ref JCClientStateNotInit : 未初始化
  112. * - @ref JCClientStateIdle : 未登录
  113. * - @ref JCClientStateLogining : 登录中
  114. * - @ref JCClientStateLogined : 登录成功
  115. * - @ref JCClientStateLogouting : 登出中
  116. *
  117. * @param state 当前状态值
  118. * @param oldState 之前状态值
  119. */
  120. - (void)onClientStateChange:(JCClientState)state oldState:(JCClientState)oldState {
  121. if (state == JCClientStateIdle) {
  122. [self loginJuphoon];
  123. }
  124. }
  125. #pragma mark - JCCallCallback
  126. /**
  127. * 新增通话回调
  128. *
  129. * 当上层收到此回调时,可以根据 JCCallItem 对象获得该通话的所有信息及状态,从而更新该通话相关UI
  130. *
  131. * @param item JCCallItem 对象
  132. */
  133. - (void)onCallItemAdd:(JCCallItem* __nonnull)item {
  134. HDNormalLog(([NSString stringWithFormat:@"VideoManager: onCallItemAdd direction: %ld", (long)item.direction]));
  135. NSDictionary *dic = @{kCallIetmKey:item};
  136. [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_JUPHOON object:nil userInfo:dic];
  137. if (self.mJuphoonCall.callItems.count == 1) {
  138. [self showInCallVC];
  139. }
  140. }
  141. /**
  142. * 移除通话回调
  143. *
  144. * 当上层收到此回调时,可以根据 JCCallItem 对象获得该通话的所有信息及状态,从而更新该通话相关UI
  145. *
  146. * @param item JCCallItem 对象
  147. * @param reason 通话结束原因,参见:@ref JCCallReason "通话结束原因"
  148. * @param description 通话结束原因的描述,只有被动挂断的时候,才会收到这个值,其他情况下则返回空字符串
  149. */
  150. - (void)onCallItemRemove:(JCCallItem *)item reason:(JCCallReason)reason description:(NSString *)description {
  151. HDNormalLog(([NSString stringWithFormat:@"VideoManager: onCallItemRemove reason:%ld", reason]));
  152. [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_JUPHOON object:nil];
  153. [self removeInCallVC];
  154. switch (reason) {
  155. case JCCallReasonNone:
  156. [EasyTextView showInfoText:[NSString stringWithFormat:NSLocalizedString(@"Video.Error.Hangup", nil)]];
  157. break;
  158. case JCCallReasonNotFound:
  159. [EasyTextView showErrorText:[NSString stringWithFormat:NSLocalizedString(@"Video.Error.User.No", nil)]];
  160. break;
  161. case JCCallReasonUserOffline:
  162. [EasyTextView showErrorText:[NSString stringWithFormat:NSLocalizedString(@"Video.Error.User.Offline", nil)]];
  163. [self loginJuphoon];
  164. break;
  165. case JCCallReasonNotLogin:
  166. [EasyTextView showErrorText:[NSString stringWithFormat:NSLocalizedString(@"Video.Error.User.Login", nil)]];
  167. break;
  168. case JCCallReasonTimeOut:
  169. //[EasyTextView showErrorText:[NSString stringWithFormat:NSLocalizedString(@"Video.Error.Timeout", nil)]];
  170. break;
  171. case JCCallReasonNetWork:
  172. [EasyTextView showErrorText:[NSString stringWithFormat:NSLocalizedString(@"Video.Error.Network", nil)]];
  173. break;
  174. default: {
  175. break;
  176. }
  177. }
  178. }
  179. /**
  180. * 通话状态更新回调
  181. *
  182. * 当上层收到此回调时,可以根据 JCCallItem 对象获得该通话的所有信息及状态,从而更新该通话相关UI
  183. *
  184. * @param item JCCallItem 对象
  185. * @param changeParam JCCallChangeParam 更新标识对象
  186. */
  187. - (void)onCallItemUpdate:(JCCallItem* __nonnull)item changeParam:(JCCallChangeParam * __nullable)changeParam {
  188. if (item.state == JCCallStateTalking && [self getRemoteCanvas] == nil && item.uploadVideoStreamOther) {
  189. [self stopTimeoutTimer];
  190. }
  191. [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_JUPHOON object:nil];
  192. }
  193. @end