useAgora.ts 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. // argora
  2. import AgoraRTC, { IAgoraRTCClient, ILocalAudioTrack, ILocalVideoTrack } from 'agora-rtc-sdk-ng';
  3. import { useRtcStore } from '/@/store/modules/rtc';
  4. export type AgoraClient = IAgoraRTCClient;
  5. export { ILocalAudioTrack, ILocalVideoTrack } from 'agora-rtc-sdk-ng';
  6. import { useRtcSdk } from './useTRTC';
  7. export let localAudioTrack: ILocalAudioTrack;
  8. export let localVideoTrack: ILocalVideoTrack;
  9. export const createAgoraClient = async (
  10. sdkAppId: string,
  11. roomId: string,
  12. sign: string,
  13. userId: string,
  14. ): Promise<IAgoraRTCClient> => {
  15. const rtcStore = useRtcStore();
  16. const { muteVideoLeader } = useRtcSdk();
  17. const client: IAgoraRTCClient = AgoraRTC.createClient({ mode: 'rtc', codec: 'vp9' });
  18. const uid = await client.join(String(sdkAppId), roomId, sign, userId);
  19. console.log('client', uid, client);
  20. client.on('volume-indicator', function (result) {
  21. result.forEach(function (volume, index) {
  22. console.warn(`${index} UID ${volume.uid} Level ${volume.level}`);
  23. });
  24. });
  25. client.on('exception', (error) => {
  26. console.error(error);
  27. });
  28. client.on('user-joined', (user) => {
  29. console.log('userJoin', user);
  30. });
  31. client.on('user-info-updated', (user) => {
  32. console.log('userJoin', user);
  33. });
  34. client.on('user-unpublished', async (user, mediaType) => {
  35. if (mediaType === 'audio') {
  36. console.error('unpublished', user);
  37. }
  38. if (mediaType === 'video') {
  39. // console.error('unpublished', user);
  40. //暂时只有leader有video
  41. muteVideoLeader.value = true;
  42. }
  43. });
  44. client.on('user-published', async (user, mediaType) => {
  45. await client.subscribe(user, mediaType);
  46. if (mediaType === 'video') {
  47. console.error('subscribe video success', user);
  48. const remoteVideoEl = document.getElementById(`cameraRemoteBox`);
  49. if (user.videoTrack && remoteVideoEl) {
  50. // remoteVideoEl.style.display = 'block';
  51. console.warn('video play');
  52. user.videoTrack.play(remoteVideoEl);
  53. muteVideoLeader.value = false;
  54. }
  55. }
  56. if (mediaType === 'audio') {
  57. user.audioTrack?.play();
  58. }
  59. });
  60. const isHasCamera = (await AgoraRTC.getCameras()).length > 0;
  61. localAudioTrack = await AgoraRTC.createMicrophoneAudioTrack();
  62. localVideoTrack = await AgoraRTC.createCameraVideoTrack();
  63. const localVideoEl = document.getElementById(`camera_box_${userId}`);
  64. //
  65. if (rtcStore.role === 'leader') {
  66. console.warn('isHasCamera', isHasCamera);
  67. if (isHasCamera) {
  68. rtcStore.setHasCamera();
  69. if (localVideoEl) {
  70. localVideoTrack.play(localVideoEl);
  71. }
  72. await client.publish([localAudioTrack, localVideoTrack]);
  73. } else {
  74. await client.publish([localAudioTrack]);
  75. }
  76. } else {
  77. await client.publish([localAudioTrack]);
  78. }
  79. localAudioTrack.setMuted(true);
  80. rtcStore.setIsRTCJoined(true);
  81. return client;
  82. };
  83. export const muteVideo = () => {
  84. //通用开音方法
  85. localVideoTrack.setMuted(true);
  86. };
  87. export const unMuteVideo = () => {
  88. localVideoTrack.setMuted(false);
  89. };
  90. export const mutedAudio = () => {
  91. //通用禁音方法
  92. console.error('mutedAudio');
  93. localAudioTrack.setMuted(true);
  94. };
  95. export const unMutedAudio = () => {
  96. //通用开音方法
  97. console.error('unMutedAudio');
  98. localAudioTrack.setMuted(false);
  99. };