diff --git a/public/app.js b/public/app.js index fd339cd..aad8628 100644 --- a/public/app.js +++ b/public/app.js @@ -156,6 +156,26 @@ function preferOpus(pc) { } } +function preferH264(pc) { + const capabilities = globalThis.RTCRtpReceiver?.getCapabilities?.('video'); + const codecs = capabilities?.codecs || []; + const rank = (codec) => { + const mime = codec.mimeType?.toLowerCase() || ''; + if (mime === 'video/h264') return 0; + if (mime === 'video/vp8') return 1; + if (mime === 'video/vp9') return 2; + return 3; + }; + const ordered = [...codecs].sort((a, b) => rank(a) - rank(b)); + for (const transceiver of pc.getTransceivers()) { + if (transceiver.receiver?.track?.kind === 'video' || transceiver.sender?.track?.kind === 'video') { + try { transceiver.setCodecPreferences(ordered); } catch (err) { + captureRumIssue('Could not prefer H.264 video codec', 'WARNING', { error: err?.message || String(err) }); + } + } + } +} + function monitorPeerQuality(peer) { if (peer.qualityTimer) clearInterval(peer.qualityTimer); peer.qualityTimer = setInterval(async () => { @@ -265,8 +285,8 @@ function effectiveIce() { function microphoneConstraints(deviceId = localStorage.getItem(LS_AUDIO_INPUT)) { const audio = { echoCancellation: true, - noiseSuppression: true, - autoGainControl: true, + noiseSuppression: false, + autoGainControl: false, channelCount: 1, sampleRate: 48000, sampleSize: 16, @@ -1029,6 +1049,7 @@ function addScreenToPeer(peer) { } peerSenders.set(streamId, senders); } + preferH264(peer.pc); S.screenSenders.set(peer.id, peerSenders); // renegotiation fires automatically }