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.DCVWebRTCPeerConnectionProxyV2para 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
successbooleano e um ouproxyerror -
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:
-
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.
-
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). -
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 configurarsrcObject -
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 (verifique
chrome://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çãosrcObject -
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; }