我有 AGORA sdk 4.3.0,演示应用程序运行良好。
现在我将项目更改为“实时”。
我包含了生成令牌的令牌生成器,在 index.js 中适当的地方以及当我尝试连接时包含了 uid
(使用 appid
、channel
(这是一个自定义字符串) 、uid
(适当范围内的无符号整数)和由 RtcTokenBuilder.py 生成的 token
(它接受 appID
、appCertificate
、channelName
和其他自动生成的东西,例如时间)我得到以下控制台输出;
AgoraRTC_N-4.3.0.js:402 11:53:12:684 Agora-SDK [DEBUG]: [lock-safari-1] is created.
AgoraRTC_N-4.3.0.js:403 11:53:12:698 Agora-SDK [INFO]: browser compatibility {"getDisplayMedia":true,"getStreamFromExtension":true,"supportUnifiedPlan":true,"supportMinBitrate":true,"supportSetRtpSenderParameters":true,"supportDualStream":true,"webAudioMediaStreamDest":true,"supportReplaceTrack":true,"supportWebGL":true,"webAudioWithAEC":false,"supportRequestFrame":true,"supportShareAudio":false,"supportDualStreamEncoding":false} {"name":"Chrome","version":"88","os":"Android"}
AgoraRTC_N-4.3.0.js:402 11:53:12:703 Agora-SDK [DEBUG]: [lock-client-leave-2] is created.
AgoraRTC_N-4.3.0.js:402 11:53:12:703 Agora-SDK [DEBUG]: [lock-client-publish-3] is created.
AgoraRTC_N-4.3.0.js:403 11:53:12:703 Agora-SDK [INFO]: [client-f5c02] Initializing AgoraRTC client v4.3.0 build: v4.3.0-0-g0586d79(1/27/2021, 4:10:54 PM), mode: rtc, codec: vp8
AgoraRTC_N-4.3.0.js:403 11:53:15:173 Agora-SDK [INFO]: [client-f5c02] start join channel 714d7057-e9d7-4c2e-98c9-759b597e517c
AgoraRTC_N-4.3.0.js:403 11:53:15:174 Agora-SDK [INFO]: [client-f5c02] connection state change: DISCONNECTED -> CONNECTING
AgoraRTC_N-4.3.0.js:402 11:53:15:174 Agora-SDK [DEBUG]: [client-f5c02] new Session 9FBAD23D03AA6980E99E4E8B87B620DB
AgoraRTC_N-4.3.0.js:403 11:53:15:179 Agora-SDK [INFO]: start create microphone audio track with config {} trackId track-56b46ef1
AgoraRTC_N-4.3.0.js:402 11:53:15:179 Agora-SDK [DEBUG]: [track-56b46ef1] GetUserMedia {"audio":{}}
AgoraRTC_N-4.3.0.js:403 11:53:15:182 Agora-SDK [INFO]: start create camera video track with config {"encoderConfig":"480p_1"} trackId track-5662136d
AgoraRTC_N-4.3.0.js:402 11:53:15:182 Agora-SDK [DEBUG]: [track-5662136d] GetUserMedia {"video":{"width":640,"height":480,"frameRate":15}}
AgoraRTC_N-4.3.0.js:402 11:53:15:185 Agora-SDK [DEBUG]: [client-f5c02] Connect to choose_server: https://webrtc2-ap-web-1.agora.io/api/v1
AgoraRTC_N-4.3.0.js:402 11:53:15:186 Agora-SDK [DEBUG]: [client-f5c02] Connect to choose_server: https://webrtc2-ap-web-2.agoraio.cn/api/v1
AgoraRTC_N-4.3.0.js:402 11:53:15:273 Agora-SDK [DEBUG]: [lock-track-56b46ef1-4] is created.
AgoraRTC_N-4.3.0.js:403 11:53:15:273 Agora-SDK [INFO]: create audio context
AgoraRTC_N-4.3.0.js:403 11:53:15:315 Agora-SDK [INFO]: create microphone audio track success, trackId: track-56b46ef1
AgoraRTC_N-4.3.0.js:402 11:53:16:189 Agora-SDK [DEBUG]: [client-f5c02] Connect to backup choose_server: https://webrtc2-ap-web-3.agora.io/api/v1
AgoraRTC_N-4.3.0.js:402 11:53:16:189 Agora-SDK [DEBUG]: [client-f5c02] Connect to backup choose_server: https://webrtc2-ap-web-4.agoraio.cn/api/v1
AgoraRTC_N-4.3.0.js:402 11:53:16:275 Agora-SDK [DEBUG]: [lock-track-5662136d-5] is created.
AgoraRTC_N-4.3.0.js:403 11:53:16:277 Agora-SDK [INFO]: create camera video success, trackId: track-5662136d
AgoraRTC_N-4.3.0.js:403 11:53:16:825 Agora-SDK [INFO]: [client-f5c02] connection state change: CONNECTING -> DISCONNECTED
AgoraRTC_N-4.3.0.js:402 11:53:16:828 Agora-SDK [DEBUG]: [client-f5c02] reset client
AgoraRTC_N-4.3.0.js:402 11:53:16:829 Agora-SDK [DEBUG]: [lock-client-publish-6] is created.
AgoraRTC_N-4.3.0.js:402 11:53:16:830 Agora-SDK [DEBUG]: [client-f5c02] reset client
AgoraRTC_N-4.3.0.js:402 11:53:16:830 Agora-SDK [DEBUG]: [lock-client-publish-7] is created.
出于某种原因,没有错误或警告,我只是断开连接 -
AgoraRTC_N-4.3.0.js:403 11:53:16:825 Agora-SDK [INFO]: [client-f5c02] connection state change: CONNECTING -> DISCONNECTED
Javascript 不是我的主要内容,我真的不知道如何调试它。
非常感谢您的帮助。
Token Generation (uses token_uid option):
appID = config("AGORA_APP_ID")
appCertificate = config("AGORA_APP_CERTIFICATE")
channelName = "channel_name"
uid = "<user_id>"
userAccount = "0"
expireTimeInSeconds = 3600
currentTimestamp = int(time.time())
privilegeExpiredTs = currentTimestamp + expireTimeInSeconds
def generate_token():
token_uid = RtcTokenBuilder.buildTokenWithUid(appID, appCertificate, channelName, uid, Role_Attendee, privilegeExpiredTs)
# print("Token with int uid: {}".format(token_uid))
token_account = RtcTokenBuilder.buildTokenWithAccount(appID, appCertificate, channelName, userAccount, Role_Attendee, privilegeExpiredTs)
# print("Token with user account: {}".format(token_account))
return token_uid
到 index.js 我在提交加入表单时传递 appid 和令牌,以及我在表单中组成的频道名称。
// create Agora client
var client = AgoraRTC.createClient({ mode: "rtc", codec: "vp8" });
var localTracks = {
videoTrack: null,
audioTrack: null
};
var remoteUsers = {};
// Agora client options
var options = {
appid: null,
channel: null,
// uid: 123456,
uid: null,
token: null
};
// the demo can auto join channel with params in url
$(() => {
var urlParams = new URL(location.href).searchParams;
options.appid = urlParams.get("appid");
options.channel = urlParams.get("channel");
options.token = urlParams.get("token");
// options.uid = 123456;
if (options.appid && options.channel) {
$("#appid").val(options.appid);
$("#token").val(options.token);
$("#channel").val(options.channel);
// $("#uid").val(options.uid);
$("#join-form").submit();
}
})
$("#join-form").submit(async function (e) {
e.preventDefault();
$("#join").attr("disabled", true);
try {
options.appid = $("#appid").val();
options.token = $("#token").val();
options.channel = $("#channel").val();
// options.uid = 123456;
await join();
if(options.token) {
$("#success-alert-with-token").css("display", "block");
} else {
$("#success-alert a").attr("href", `index.html?appid=${options.appid}&channel=${options.channel}&token=${options.token}`);
$("#success-alert").css("display", "block");
}
} catch (error) {
console.error(error);
} finally {
$("#leave").attr("disabled", false);
}
})
$("#leave").click(function (e) {
leave();
})
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, localTracks.videoTrack ] = await Promise.all([
// join the channel
client.join(options.appid, options.channel, options.token || null),
// client.join(options.appid, options.channel, options.token, options.uid || null),
// create local tracks, using microphone and camera
AgoraRTC.createMicrophoneAudioTrack(),
AgoraRTC.createCameraVideoTrack()
]);
// play local video track
localTracks.videoTrack.play("local-player");
$("#local-player-name").text(`localVideo(${options.uid})`);
// publish local tracks to channel
await client.publish(Object.values(localTracks));
console.log("publish success");
}
async function leave() {
for (trackName in localTracks) {
var track = localTracks[trackName];
if(track) {
track.stop();
track.close();
localTracks[trackName] = undefined;
}
}
// remove remote users and player views
remoteUsers = {};
$("#remote-playerlist").html("");
// leave the channel
await client.leave();
$("#local-player-name").text("");
$("#join").attr("disabled", false);
$("#leave").attr("disabled", true);
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");
if (mediaType === 'video') {
const player = $(`
<div id="player-wrapper-${uid}">
<p class="player-name">remoteUser(${uid})</p>
<div id="player-${uid}" class="player"></div>
</div>
`);
$("#remote-playerlist").append(player);
user.videoTrack.play(`player-${uid}`);
}
if (mediaType === 'audio') {
user.audioTrack.play();
}
}
function handleUserPublished(user, mediaType) {
const id = user.uid;
remoteUsers[id] = user;
subscribe(user, mediaType);
}
function handleUserUnpublished(user) {
const id = user.uid;
delete remoteUsers[id];
$(`#player-wrapper-${id}`).remove();
}