O ApsaraVideo Real-time Communication (ARTC) Web SDK é um conjunto de ferramentas da Alibaba Cloud para desenvolver aplicações web de comunicação em tempo real. Ele permite integrar rapidamente recursos de alta qualidade, como chamadas de áudio e vídeo e mensagens em tempo real, às suas aplicações web. Este guia mostra como criar sua primeira aplicação ARTC de forma ágil.
Etapa 1: Criar uma aplicação
Faça login no ApsaraVideo Live console.
No painel de navegação à esquerda, escolha .
Clique em Create Application.
Insira um instance name personalizado, marque a caixa de seleção Terms of Service e clique em Purchase Now.
-
Após a exibição da mensagem de sucesso, atualize a página Applications para visualizar sua nova aplicação do ApsaraVideo Real-time Communication.
NotaA criação da aplicação é gratuita. A cobrança ocorre no modelo de pagamento conforme o uso, baseada no consumo real. Para mais informações, consulte Faturamento de chamadas de áudio e vídeo.
Etapa 2: Obter o ID da aplicação e a AppKey
Após criar a aplicação, localize-a na lista de aplicações. Na coluna Actions, clique em Manage para abrir a página Basic Information. Nessa página, localize o Application ID e a AppKey.
Etapa 3: Integrar o SDK
-
Integre o SDK.
Script
Inclua o script do SDK na página HTML.
<script src="https://g.alicdn.com/apsara-media-box/imp-web-rtc/7.1.9/aliyun-rtc-sdk.js"></script>NPM
Execute o comando abaixo no projeto para instalar o SDK.
npm install aliyun-rtc-sdk --save -
Inicialize o engine.
// Choose one of the following two import methods. // Use this if you are importing from an npm package. import AliRtcEngine from 'aliyun-rtc-sdk'; // Use this if you are including the SDK with a script tag. const AliRtcEngine = window.AliRtcEngine; // Check browser compatibility. const checkResult = await AliRtcEngine.isSupported(); if (!checkResult.support) { // The current environment is not supported. Prompt the user to switch to or upgrade their browser. } // Create an engine instance. You can save it as a global variable. const aliRtcEngine = AliRtcEngine.getInstance(); -
Após criar a instância do AliRtcEngine, configure listeners para os eventos relevantes.
// Fired when the local user leaves the channel. aliRtcEngine.on('bye', (code) => { // `code` is a reason code. For details, see the API reference. console.log(`bye, code=${code}`); // Handle your business logic here, such as exiting the call page. }); // Fired when a remote user comes online. aliRtcEngine.on('remoteUserOnLineNotify', (userId, elapsed) => { console.log(`User ${userId} joined the channel in ${elapsed} seconds.`); // Handle your business logic here, such as displaying the UI module for this user. }); // Fired when a remote user goes offline. aliRtcEngine.on('remoteUserOffLineNotify', (userId, reason) => { // `reason` is a reason code. For details, see the API reference. console.log(`User ${userId} left the channel. Reason code: ${reason}`); // Handle your business logic here, such as destroying the UI module for this user. }); // Fired when the subscription state of a remote stream changes. aliRtcEngine.on('videoSubscribeStateChanged', (userId, oldState, newState, interval, channelId) => { // 'oldState' and 'newState' are AliRtcSubscribeState values. // Values: 0 (initialized), 1 (unsubscribed), 2 (subscribing), 3 (subscribed). // `interval` is the time between state changes, in milliseconds. console.log(`Subscription state of remote user ${userId} in channel ${channelId} changed from ${oldState} to ${newState}.`); // Handle the logic for viewing the remote stream here. // When `newState` becomes 3, you can play the remote stream by calling setRemoteViewConfig. // When `newState` becomes 1, you can stop the playback. }); // Fired when the authentication information expires. aliRtcEngine.on('authInfoExpired', () => { // This callback indicates that the authentication information has expired. // Get a new token and other data, then call the refreshAuthInfo method to update the authentication data. aliRtcEngine.refreshAuthInfo({ userId, token, timestamp }); }); // Fired when the authentication information is about to expire. aliRtcEngine.on('authInfoWillExpire', () => { // This callback is fired 30 seconds before expiration. You should update the authentication information promptly. // To stay in the session, get a new token and other data, and call joinChannel to rejoin the channel. }); -
(Opcional) Defina o modo do canal. O padrão é o modo de comunicação. Para mais detalhes, consulte Definir o modo do canal e a função do usuário.
// Set the channel mode. Valid values: 'communication' (communication mode), 'interactive_live' (interactive mode). aliRtcEngine.setChannelProfile('interactive_live'); // Set the user role. This method is effective only in interactive mode. // Valid values: 'interactive' (streamer, can publish and subscribe to streams), 'live' (viewer, can only subscribe to streams). aliRtcEngine.setClientRole('interactive'); -
Entre em um canal. Para saber como gerar um token, consulte autenticação baseada em token. Escolha entrar com um único parâmetro ou com múltiplos parâmetros, conforme sua necessidade.
-
Entrar com um único parâmetro
const userName = 'Test User 1'; // You can change this to your username. Chinese characters are supported. try { // You need to implement fetchToken to get the Base64-encoded token from your server. const base64Token = await fetchToken(); await aliRtcEngine.joinChannel(base64Token, userName); // Joined the channel successfully. Proceed with other operations. } catch (error) { // Failed to join the channel. } -
Entrar com múltiplos parâmetros
// Generate authentication information on your server or locally by following the token-based authentication guide. // IMPORTANT: For data security, never publish the token calculation logic that includes your AppKey to end users. const appId = 'yourAppId'; // Get this from the console. const appKey = 'yourAppKey'; // Get this from the console. Do not expose your AppKey in a production environment. const channelId = 'AliRtcDemo'; // You can change this to your channel ID. Only letters and digits are supported. const userId = 'test1'; // You can change this to your user ID. Only letters and digits are supported. const userName = 'Test User 1'; // You can change this to your username. Chinese characters are supported. const timestamp = Math.floor(Date.now() / 1000) + 3600; // Expires in one hour. try { const token = await generateToken(appId, appKey, channelId, userId, timestamp); // Join the channel. Parameters like token and timestamp are typically returned from the server. // Note: When calling this method, ensure the channelId, userId, appId, and timestamp parameters match those used to generate the token. await aliRtcEngine.joinChannel({ channelId, userId, appId, token, timestamp, }, userName); // Joined the channel successfully. Proceed with other operations. } catch (error) { // Failed to join the channel. }
-
-
Siga estas etapas para pré-visualizar o vídeo local. Por padrão, ao entrar em um canal, os dados locais de áudio e vídeo são capturados automaticamente e publicados na Global Realtime Transport Network (GRTN).
-
Adicione um elemento VIDEO com
idigual alocalPreviewerno código HTML.<video id="localPreviewer" muted style="display: block;width: 320px;height: 180px;background-color: black;" ></video> -
Chame o método
setLocalViewConfige passe o ID do elemento para iniciar a pré-visualização.// The first parameter accepts an HTMLVideoElement or its ID. Pass null to stop the preview. // The second parameter specifies the stream type: 1 for a camera stream, 2 for a screen sharing stream. aliRtcEngine.setLocalViewConfig('localPreviewer', 1);
-
-
Assine os streams remotos de áudio e vídeo. Por padrão, após entrar em um canal, o SDK assina automaticamente os streams de áudio e vídeo de outros streamers. Os streams de áudio são reproduzidos automaticamente. Para exibir um stream de câmera ou de compartilhamento de tela, chame o método
setRemoteViewConfig.-
Adicione um elemento
DIVcomidigual aremoteVideoContainerno código HTML para servir como contêiner.<div id="remoteVideoContainer"></div> -
Monitore as alterações de assinatura dos streams de vídeo remotos. Quando um stream for assinado, reproduza-o chamando o método
setRemoteViewConfig. Caso a assinatura seja cancelada, remova o elemento de vídeo.// Store Video elements. const remoteVideoElMap = {}; // The remote container element. const remoteVideoContainer = document.querySelector('#remoteVideoContainer'); function removeRemoteVideo(userId) { const el = remoteVideoElMap[userId]; if (el) { aliRtcEngine.setRemoteViewConfig(null, userId, 1); el.pause(); remoteVideoContainer.removeChild(el); delete remoteVideoElMap[userId]; } } // This is the same example as in the "listen for and handle relevant events" step for `videoSubscribeStateChanged`. aliRtcEngine.on('videoSubscribeStateChanged', (userId, oldState, newState, interval, channelId) => { // `oldState` and `newState` are of the AliRtcSubscribeState type. // Values: 0 (initialized), 1 (unsubscribed), 2 (subscribing), 3 (subscribed). // `interval` is the time between state changes, in milliseconds. console.log(`Subscription state of remote user ${userId} in channel ${channelId} changed from ${oldState} to ${newState}.`); // Example handler if (newState === 3) { const video = document.createElement('video'); video.autoplay = true; video.setAttribute('style', 'display: block;width: 320px;height: 180px;background-color: black;'); remoteVideoElMap[userId] = video; remoteVideoContainer.appendChild(video); // The first parameter is an HTMLVideoElement. // The second parameter is the remote user ID. // The third parameter specifies the stream type: 1 for a camera stream, 2 for a screen sharing stream. aliRtcEngine.setRemoteViewConfig(video, userId, 1); } else if (newState === 1) { removeRemoteVideo(userId); } });
-
-
Encerre a sessão e limpe os recursos.
// Stop the local preview. await aliRtcEngine.stopPreview(); // Leave the channel. await aliRtcEngine.leaveChannel(); // Destroy the instance to release resources. aliRtcEngine.destroy();
Demo de início rápido
O JavaScript desta demo inclui um método generateToken para calcular o token. Por motivos de segurança, nunca publique este código ou sua AppKey em um arquivo JavaScript do lado do cliente, pois isso pode causar vazamento de informações e uso indevido. Recomendamos realizar a assinatura do token no servidor e obtê-lo por meio de uma API autenticada no cliente.
Pré-requisitos
Esta demo requer um servidor HTTP no ambiente de desenvolvimento. Caso não tenha o pacote npm http-server, execute npm install --global http-server para instalá-lo globalmente.
Etapa 1: Criar o diretório
Crie uma pasta demo contendo dois arquivos: quick.html e quick.js.
- demo
- quick.html
- quick.js
Etapa 2: Editar quick.html
Copie o código abaixo para quick.html e salve o arquivo.
Etapa 3: Editar quick.js
Copie o código abaixo para quick.js. Cole seu application ID e sua AppKey nas variáveis indicadas e salve o arquivo.
Etapa 4: Executar a demo
No terminal, navegue até a pasta
demoe executehttp-server -p 8080para iniciar um servidor HTTP.Abra uma nova aba no navegador e acesse
localhost:8080/quick.html. Insira um Channel ID e um User ID, depois clique em Join Channel.Abra uma segunda aba no navegador e acesse
localhost:8080/quick.html. Insira o mesmo Channel ID, mas use um User ID diferente, e clique em Join Channel.Verifique se o stream de mídia do outro usuário foi assinado automaticamente e está sendo exibido na página.