// create Agora client var client = AgoraRTC.createClient({ mode: "rtc", codec: "vp8" }); var localTracks = { audioTrack: null }; var remoteUsers = {}; // Agora client options var options = { appid: null, channel: null, uid: null, token: null }; $('.leave-btn').hide(); $('#local-volume-range').on('input change', function() { if (localTracks.audioTrack) localTracks.audioTrack.setVolume(Math.floor($(this).val()**2)); }); $('.join-form').submit(async function (e) { e.preventDefault(); console.log('ookkkk', this, $(this)); console.log($(this).serializeArray()); $(".join-btn").hide(); $(this).serializeArray().forEach((v) => { options[v.name] = v.value; }); options.uid = parseInt(options.uid); console.log(options); try { await join(); $('.u-cnt').hide(); } catch (error) { console.error(error); alert('出错啦\n' + error); } finally { $(this).find(".leave-btn").show(); } }) $(".leave-btn").click(function (e) { leave(); }) function set_soundmeter(ele, at) { $(ele).val(($(ele).val() + at.getVolumeLevel())/2); } async function join() { // add event listener to play remote tracks when remote user publishs. client.on("user-published", handleUserPublished); client.on("user-unpublished", handleUserUnpublished); // join a channel and create local tracks, we can use Promise.all to run them concurrently [ options.uid, localTracks.audioTrack] = await Promise.all([ // join the channel client.join(options.appid, options.channel, options.token || null, options.uid), // create local tracks, using microphone and camera AgoraRTC.createMicrophoneAudioTrack(), ]); localTracks.audioTrack.intervalId = window.setInterval(set_soundmeter, 250, '#local-player progress', localTracks.audioTrack); // publish local tracks to channel await client.publish(Object.values(localTracks)); console.log("publish success"); } async function leave() { var track = localTracks.audioTrack; if(track) { track.stop(); track.close(); window.clearInterval(track.intervalId); track = undefined; } // remove remote users and player views remoteUsers = {}; $("#remote-playerlist").html(""); // leave the channel await client.leave(); $(".join-btn").show(); $('.leave-btn').hide(); console.log("client leaves channel success"); } async function subscribe(user, mediaType) { const uid = user.uid; // subscribe to a remote user await client.subscribe(user, mediaType); console.log("subscribe success"); const player = $(`

${uid}

`); $("#remote-playerlist").append(player); user.audioTrack.play(); user.intervalId = window.setInterval(set_soundmeter, 20, `#player-${uid} progress`, user.audioTrack); } function handleUserPublished(user, mediaType) { const id = user.uid; remoteUsers[id] = user; subscribe(user, mediaType); } function handleUserUnpublished(user) { window.clearInterval(user.intervalId); const id = user.uid; delete remoteUsers[id]; $(`#player-${id}`).remove(); }