From 3823173d92767eeed39891ad9b0405fffc5d5826 Mon Sep 17 00:00:00 2001 From: mrekk-hub Date: Wed, 21 May 2025 19:58:59 +0300 Subject: [PATCH] Add tabs sound support (first version) --- client/scripts/media.js | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/client/scripts/media.js b/client/scripts/media.js index 35017b6..f5cf6b9 100644 --- a/client/scripts/media.js +++ b/client/scripts/media.js @@ -205,7 +205,7 @@ async function getMediaDevices() { "Не отключайте эти разрешения до окончания записи. " + "Это необходимо для корректной работы системы прокторинга."], "Разрешения для прокторинга"); - chrome.desktopCapture.chooseDesktopMedia(['screen'], async (streamId) => { + chrome.desktopCapture.chooseDesktopMedia(['screen', 'audio'], async (streamId) => { if (!streamId) { logClientAction({ action: "User cancels screen selection" }); console.error('Пользователь отменил выбор экрана'); @@ -217,6 +217,12 @@ async function getMediaDevices() { logClientAction({ action: "User grants screen access" }); streams.screen = await navigator.mediaDevices.getUserMedia({ + audio: { + mandatory: { + chromeMediaSource: 'desktop', + chromeMediaSourceId: streamId + } + }, video: { mandatory: { chromeMediaSource: 'desktop', @@ -236,6 +242,8 @@ async function getMediaDevices() { }, }); + console.log('Audio tracks from screen:', streams.screen.getAudioTracks()); + if (!streams.screen || streams.screen.getVideoTracks().length === 0) { logClientAction({ action: "Screen stream not available" }); throw new Error('Не удалось получить видеопоток с экрана'); @@ -378,9 +386,26 @@ async function getMediaDevices() { } }; + // Объединяем аудио (экран + микрофон) + const audioContext = new AudioContext(); + const destination = audioContext.createMediaStreamDestination(); + + const screenAudioTrack = streams.screen.getAudioTracks()[0]; + if (screenAudioTrack) { + const screenSource = audioContext.createMediaStreamSource(new MediaStream([screenAudioTrack])); + screenSource.connect(destination); + } + + const micAudioTrack = streams.microphone.getAudioTracks()[0]; + if (micAudioTrack) { + const micSource = audioContext.createMediaStreamSource(new MediaStream([micAudioTrack])); + micSource.connect(destination); + } + streams.combined = new MediaStream([ streams.screen.getVideoTracks()[0], - streams.microphone.getAudioTracks()[0] + ...destination.stream.getAudioTracks() + // streams.microphone.getAudioTracks()[0] ]); combinedPreview.srcObject = streams.combined;