View a markdown version of this page

Integre seu aplicativo web com o redirecionamento WebRTC - Amazônia WorkSpaces

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Integre seu aplicativo web com o redirecionamento WebRTC

O redirecionamento WebRTC permite que aplicativos web executados dentro de WorkSpaces sessões usem dispositivos de áudio nativos do lado do cliente. Este tópico mostra aos desenvolvedores de aplicativos web como detectar o ambiente de redirecionamento WebRTC e integrá-lo.

Quando o redirecionamento WebRTC é ativado em um WorkSpace, a extensão de navegador Amazon DCV WebRTC Redirection injeta um SDK proxy na página da web. Seu aplicativo pode detectar esse proxy e usá-lo para redirecionar as chamadas padrão da API WebRTC, incluindo get UserMedia e RTCPeerConnection , para os dispositivos locais do usuário, em vez dos dispositivos virtuais remotos WorkSpace. Isso proporciona um desempenho significativamente melhor e menor latência em comparação com o streaming de mídia por meio do protocolo de exibição DCV.

Seu aplicativo deve lidar com os dois casos: ao ser executado dentro de um WorkSpace com o redirecionamento WebRTC ativado e ao ser executado em um navegador padrão sem ele. O proxy é opcional. Se não estiver presente, seu aplicativo poderá voltar ao WebRTC padrão.

Pré-requisitos

Para usuários finais

Os usuários finais precisam do seguinte:

  • A WorkSpace usando o protocolo DCV. Para obter mais informações, consulte Protocolos para WorkSpaces uso pessoal.

    nota

    Atualmente, o redirecionamento WebRTC no lado do servidor é suportado somente no Windows. WorkSpaces

  • Um WorkSpaces cliente compatível de https://clients.amazonworkspaces.com clients.amazonworkspaces.com. Plataformas suportadas: Windows, macOS, Linux (Ubuntu 22.04 e Ubuntu 24.04, amd64) e Web.

  • Redirecionamento WebRTC ativado por meio da Política de Grupo. Quando ativada, a política instala automaticamente a extensão do navegador no Chrome e no Edge por meio do registro. Para obter mais informações, consulte Gerencie seu Windows WorkSpaces no WorkSpaces Personal. Se necessário, os usuários podem instalar a extensão manualmente: Chrome e Edge.

Para desenvolvedores

Seu aplicativo web deve:

  • Use APIs padrão do WebRTC (como get and) UserMedia RTCPeerConnection

  • Inclua o código de detecção e inicialização conforme descrito neste tópico

Como integrar

A integração envolve quatro etapas: detectar o ambiente de redirecionamento, substituir as APIs do WebRTC, mapear elementos de áudio e lidar com a reconexão.

Etapa 1: Detectar o ambiente de redirecionamento

Adicione esse código de inicialização ao seu aplicativo. O retorno de chamada é executado quando o proxy está pronto ou após o tempo limite se o redirecionamento não estiver disponível.

let proxy = null; function handleInitCallback(result) { if (result.success) { // Redirection is available proxy = result.proxy; console.log('WebRTC redirection enabled, version:', proxy.getVersion()); console.log('Client info:', proxy.clientInfo); // Override WebRTC APIs to use redirection proxy.overrideWebRTC(); // Set up reconnection handling setupReconnectionHandling(); } else { // Not in a redirection environment - use standard WebRTC console.log('WebRTC redirection not available:', result.error); } } // Register the initialization callback if (globalThis.DCVWebRTCPeerConnectionProxyV2) { globalThis.DCVWebRTCPeerConnectionProxyV2.setInitCallback(handleInitCallback, 5000); }

Principais pontos:

  • Verifique se globalThis.DCVWebRTCPeerConnectionProxyV2 para detectar a extensão

  • Ligue para setInitCallback() seu manipulador e um tempo limite de 5000 ms é recomendado

  • O retorno de chamada recebe um objeto de resultado com um success booleano e um ou proxy error

  • Ligue proxy.overrideWebRTC() para redirecionar APIs padrão do WebRTC

Etapa 2: usar APIs padrão do WebRTC

Depois de ligaroverrideWebRTC(), use as APIs WebRTC normalmente. O proxy os redireciona de forma transparente para o cliente local.

nota

O redirecionamento de vídeo não é suportado atualmente. Defina video: false as getUserMedia solicitações.

// Get user media - automatically redirected const stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: false // Video redirection not yet supported }); // Create peer connection - automatically redirected const pc = new RTCPeerConnection(configuration); // Everything else works as standard WebRTC pc.addTrack(stream.getAudioTracks()[0], stream); const offer = await pc.createOffer(); await pc.setLocalDescription(offer);

Se você precisar acessar as APIs originais do navegador (por exemplo, para capturar vídeo do navegador remoto em vez do cliente local), elas serão preservadas emproxy.overridenApis:

// Get the original getUserMedia (runs in remote browser, not redirected) const originalGetUserMedia = proxy.overridenApis.get('navigator.mediaDevices.getUserMedia'); // Available original APIs: // 'navigator.mediaDevices.getUserMedia' // 'navigator.mediaDevices.addEventListener' // 'navigator.mediaDevices.removeEventListener' // 'navigator.mediaDevices.enumerateDevices' // 'navigator.mediaDevices.getDisplayMedia' // 'window.RTCPeerConnection' // 'window.RTCPeerConnection.generateCertificate' // 'window.AudioContext' // 'window.Worker' (experimental) const remoteStream = await originalGetUserMedia.call(navigator.mediaDevices, { audio: false, video: true });

Etapa 3: mapear elementos de áudio

Para reprodução de áudio, ligue mapAudioElement() antes de configurar srcObject qualquer elemento de áudio.

const audioElement = document.querySelector('audio#remote-audio'); // Map the audio element before setting srcObject proxy.mapAudioElement(audioElement); // Now use the audio element normally audioElement.srcObject = remoteStream; await audioElement.play(); // Control playback audioElement.pause(); audioElement.volume = 0.8; audioElement.muted = false; // Change output device await audioElement.setSinkId(deviceId);

Etapa 4: lidar com a reconexão

O serviço de redirecionamento pode ficar temporariamente indisponível, por exemplo, devido a problemas de rede ou reconexão do cliente.

Importante

Após a reconexão, todos os objetos proxy criados anteriormente se tornam inválidos porque o contexto do navegador do cliente é completamente recarregado. Você deve fechar as conexões existentes e criar novos objetos WebRTC.

function setupReconnectionHandling() { proxy.addStatusChangeEventListener((event) => { switch (event.status) { case 'unavailable': console.error('Redirection lost'); handleRedirectionLost(); break; case 'available': console.info('Redirection restored'); handleRedirectionRestored(); break; } }); } function handleRedirectionLost() { // Try to close cleanly - proxies may throw exceptions after reconnection try { if (peerConnection) { peerConnection.close(); } } catch (error) { console.warn('Error closing peer connection (proxy may be invalid):', error); } showReconnectingMessage(); } function handleRedirectionRestored() { // IMPORTANT: All existing proxy objects are invalid after reconnection. // Create new RTCPeerConnection, MediaStream, and other WebRTC objects. hideReconnectingMessage(); restartCall(); // Must create fresh WebRTC objects }

Você pode personalizar o tempo dos batimentos cardíacos:

proxy.resetHeartbeat({ heartbeatTimeoutMs: 5000, // Time before marking unavailable heartbeatIntervalPeriodMs: 500 // How often to check });

Enumeração de dispositivos

Alterações no dispositivo — por exemplo, um usuário conectando um fone de ouvido — são detectadas automaticamente. Use makeMediaDevicesProxy() para ouvir as alterações do dispositivo no cliente local:

const mediaDevices = proxy.makeMediaDevicesProxy(); mediaDevices.ondevicechange = async () => { const devices = await navigator.mediaDevices.enumerateDevices(); updateDeviceList(devices); };

Use proxy.clientInfo para determinar de qual plataforma cliente o usuário está se conectando:

// clientInfo contains: // - platform: 'web' | 'windows' | 'macOS' | 'linux' // - version: SDK version string // - userAgent: browser user agent string // - browserDetails: { browser: string, version: string } switch (proxy.clientInfo.platform) { case 'web': console.log('Connecting from web client'); break; case 'windows': console.log('Connecting from Windows native client'); break; case 'macOS': console.log('Connecting from macOS native client'); break; case 'linux': console.log('Connecting from Linux native client'); break; }

Avançado: processamento de áudio com a API Web Audio

Você pode usar a API Web Audio para processar fluxos de áudio antes de enviá-los por meio de uma conexão de mesmo nível:

const audioContext = new AudioContext(); const source = audioContext.createMediaStreamSource(micStream); const gainNode = audioContext.createGain(); const destination = audioContext.createMediaStreamDestination(); source.connect(gainNode); gainNode.connect(destination); // Control microphone volume gainNode.gain.value = 0.5; // 50% volume // Use the processed stream pc.addTrack(destination.stream.getAudioTracks()[0], destination.stream);

Exemplo completo

O exemplo a seguir demonstra uma integração completa com inicialização, tratamento de reconexão, detecção de alterações de dispositivos e configuração de chamadas:

let proxy = null; let peerConnection = null; let localStream = null; function initializeRedirection() { if (globalThis.DCVWebRTCPeerConnectionProxyV2) { globalThis.DCVWebRTCPeerConnectionProxyV2.setInitCallback((result) => { if (result.success) { proxy = result.proxy; proxy.overrideWebRTC(); proxy.addStatusChangeEventListener(handleStatusChange); proxy.resetHeartbeat({ heartbeatTimeoutMs: 5000, heartbeatIntervalPeriodMs: 500 }); setupDeviceChangeListener(); } else { console.log('Redirection not available:', result.error); } }, 5000); } } function handleStatusChange(event) { if (event.status === 'unavailable') { try { if (peerConnection) { peerConnection.close(); peerConnection = null; } if (localStream) { localStream.getTracks().forEach(t => t.stop()); localStream = null; } } catch (error) { console.warn('Error cleaning up (proxies invalid):', error); peerConnection = null; localStream = null; } } else if (event.status === 'available') { startCall(); // Create fresh WebRTC objects } } function setupDeviceChangeListener() { const mediaDevices = proxy.makeMediaDevicesProxy(); mediaDevices.ondevicechange = async () => { const devices = await navigator.mediaDevices.enumerateDevices(); updateDeviceUI(devices); }; } async function startCall() { try { localStream = await navigator.mediaDevices.getUserMedia({ audio: true, video: false }); peerConnection = new RTCPeerConnection({ iceServers: [{ urls: 'stun:stun.l.google.com:19302' }] }); localStream.getTracks().forEach(track => peerConnection.addTrack(track, localStream)); peerConnection.ontrack = (event) => { const remoteAudio = document.querySelector('audio#remote'); if (proxy) { proxy.mapAudioElement(remoteAudio); } remoteAudio.srcObject = event.streams[0]; remoteAudio.play(); }; peerConnection.onicecandidate = (event) => { if (event.candidate) { sendToSignalingServer({ type: 'ice-candidate', candidate: event.candidate }); } }; const offer = await peerConnection.createOffer(); await peerConnection.setLocalDescription(offer); sendToSignalingServer({ type: 'offer', sdp: offer }); } catch (error) { console.error('Failed to start call:', error); } } initializeRedirection();

Testando sua integração

Sem redirecionamento

Seu aplicativo funciona normalmente quando a extensão não está instalada, quando está sendo executada fora de um WorkSpace ou quando o redirecionamento do WebRTC não está habilitado por meio da Política de Grupo. Teste abrindo seu aplicativo em um navegador comum.

Com redirecionamento

Para testar com o redirecionamento ativado:

  1. Crie um protocolo DCV WorkSpace usando e habilite a configuração da Política de Grupo de redirecionamento WebRTC. Consulte Gerencie seu Windows WorkSpaces no WorkSpaces Personal.

  2. Baixe e instale um WorkSpaces cliente em https://clients.amazonworkspaces.com clients.amazonworkspaces.com e conecte-se ao. WorkSpace Verifique se a extensão Chrome ou Edge está instalada (automática quando o GPO está definido).

  3. Abra seu aplicativo web no WorkSpace navegador. Verifique no console a mensagem “Redirecionamento WebRTC ativado”. Verifique a funcionalidade de áudio com dispositivos locais, teste a enumeração e a comutação de dispositivos e verifique o tratamento da reconexão.

Práticas recomendadas

Siga estas recomendações ao fazer a integração com o redirecionamento WebRTC:

  • Sempre verifique a disponibilidade de redirecionamento - nunca presuma que o proxy existe

  • Ligue com overrideWebRTC() antecedência - antes de criar qualquer objeto WebRTC

  • Mapeie elementos de áudio antes de usar - ligue mapAudioElement() antes de configurar srcObject

  • Gerenciar a reconexão - após a reconexão, todos os objetos proxy são inválidos; sempre crie novos objetos WebRTC

  • Teste os dois modos - garanta que seu aplicativo funcione corretamente com e sem redirecionamento

  • Use APIs WebRTC padrão - o proxy as redireciona de forma transparente; nenhuma API personalizada é necessária para uso básico

  • Limpe os recursos - remova os ouvintes de eventos e feche as conexões quando terminar

Solução de problemas

Redirecionamento não detectado

  • Verifique se a extensão do navegador está instalada e ativada (verifiquechrome://extensions)

  • Confirme se a Política de Grupo de redirecionamento do WebRTC está habilitada no WorkSpace

  • Verifique se você está executando dentro de um WorkSpace protocolo usando DCV

  • Verifique se há mensagens de inicialização no console do navegador

  • Verifique se a versão do WorkSpaces cliente oferece suporte ao redirecionamento WebRTC (Windows 5.21.0 ou posterior, macOS 5.31.0 ou posterior, Linux 2026.0 ou posterior ou cliente Web)

Áudio ou vídeo não funcionam

  • Verify overrideWebRTC() foi chamado antes de criar qualquer objeto WebRTC

  • Verifique se os elementos de áudio estão mapeados mapAudioElement() antes da configuração srcObject

  • Verifique se há erros no console do navegador

  • Verifique se as permissões do dispositivo foram concedidas

Problemas de reconexão

  • Implemente addStatusChangeEventListener() para detectar mudanças de disponibilidade

  • Após a reconexão, sempre crie MediaStream objetos novos RTCPeerConnection e novos - os proxies antigos são inválidos e serão lançados

  • Revise a configuração de pulsação se a indisponibilidade for detectada muito lentamente ou muito rapidamente

Referência de API

Veja a seguir um resumo da API proxy:

interface DCVWebRTCProxy { // Version and client info getVersion(): string; clientInfo: { platform: 'web' | 'windows' | 'macOS' | 'linux'; version: string; userAgent: string; browserDetails: { browser: string; version: string; }; }; // Core methods overrideWebRTC(): void; mapAudioElement(element: HTMLAudioElement): void; // Device management makeMediaDevicesProxy(): MediaDevices; // Status monitoring addStatusChangeEventListener(callback: (event: StatusChangeEvent) => void): void; resetHeartbeat(config: { heartbeatTimeoutMs: number, heartbeatIntervalPeriodMs: number }): void; // Access original (non-redirected) browser APIs overridenApis: Map<string, Function>; } interface StatusChangeEvent { status: 'available' | 'unavailable'; lastHeartbeat?: number; }