You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

121 lines
3.1 KiB

  1. // create Agora client
  2. var client = AgoraRTC.createClient({ mode: "rtc", codec: "vp8" });
  3. var localTracks = {
  4. audioTrack: null
  5. };
  6. var remoteUsers = {};
  7. // Agora client options
  8. var options = {
  9. appid: null,
  10. channel: null,
  11. uid: null,
  12. token: null
  13. };
  14. $('.leave-btn').hide();
  15. $('#local-volume-range').on('input change', function() {
  16. if (localTracks.audioTrack)
  17. localTracks.audioTrack.setVolume(Math.floor($(this).val()**2));
  18. });
  19. $('.join-form').submit(async function (e) {
  20. e.preventDefault();
  21. console.log('ookkkk', this, $(this));
  22. console.log($(this).serializeArray());
  23. $(".join-btn").hide();
  24. $(this).serializeArray().forEach((v) => {
  25. options[v.name] = v.value;
  26. });
  27. options.uid = parseInt(options.uid);
  28. console.log(options);
  29. try {
  30. await join();
  31. $('.u-cnt').hide();
  32. } catch (error) {
  33. console.error(error);
  34. alert('出错啦\n' + error);
  35. } finally {
  36. $(this).find(".leave-btn").show();
  37. }
  38. })
  39. $(".leave-btn").click(function (e) {
  40. leave();
  41. })
  42. function set_soundmeter(ele, at) {
  43. $(ele).val(($(ele).val() + at.getVolumeLevel())/2);
  44. }
  45. async function join() {
  46. // add event listener to play remote tracks when remote user publishs.
  47. client.on("user-published", handleUserPublished);
  48. client.on("user-unpublished", handleUserUnpublished);
  49. // join a channel and create local tracks, we can use Promise.all to run them concurrently
  50. [ options.uid, localTracks.audioTrack] = await Promise.all([
  51. // join the channel
  52. client.join(options.appid, options.channel, options.token || null, options.uid),
  53. // create local tracks, using microphone and camera
  54. AgoraRTC.createMicrophoneAudioTrack(),
  55. ]);
  56. localTracks.audioTrack.intervalId = window.setInterval(set_soundmeter, 250, '#local-player progress', localTracks.audioTrack);
  57. // publish local tracks to channel
  58. await client.publish(Object.values(localTracks));
  59. console.log("publish success");
  60. }
  61. async function leave() {
  62. var track = localTracks.audioTrack;
  63. if(track) {
  64. track.stop();
  65. track.close();
  66. window.clearInterval(track.intervalId);
  67. track = undefined;
  68. }
  69. // remove remote users and player views
  70. remoteUsers = {};
  71. $("#remote-playerlist").html("");
  72. // leave the channel
  73. await client.leave();
  74. $(".join-btn").show();
  75. $('.leave-btn').hide();
  76. console.log("client leaves channel success");
  77. }
  78. async function subscribe(user, mediaType) {
  79. const uid = user.uid;
  80. // subscribe to a remote user
  81. await client.subscribe(user, mediaType);
  82. console.log("subscribe success");
  83. const player = $(`
  84. <div class="qbox" id="player-${uid}">
  85. <p class="player-name">${uid}</p>
  86. <progress value="0" max="1"></progress>
  87. </div>
  88. `);
  89. $("#remote-playerlist").append(player);
  90. user.audioTrack.play();
  91. user.intervalId = window.setInterval(set_soundmeter, 20, `#player-${uid} progress`, user.audioTrack);
  92. }
  93. function handleUserPublished(user, mediaType) {
  94. const id = user.uid;
  95. remoteUsers[id] = user;
  96. subscribe(user, mediaType);
  97. }
  98. function handleUserUnpublished(user) {
  99. window.clearInterval(user.intervalId);
  100. const id = user.uid;
  101. delete remoteUsers[id];
  102. $(`#player-${id}`).remove();
  103. }