代码之家  ›  专栏  ›  技术社区  ›  Curious66

如何在谷歌会议中捕获传入的音频流

  •  0
  • Curious66  · 技术社区  · 1 年前

    我正在尝试构建一个机器人,它将捕获来自谷歌会议的传入视频和音频流。

    我使用chatgpt来帮助我,我设法下载了视频录制,但无论我尝试什么,我似乎都找不到音频流的方式/位置。

    以下是我用来下载传入视频流的剪辑:

    // Object to store active recorders by stream ID
    const recorders = {};
    
    // Override setRemoteDescription method to intercept incoming tracks
    const originalSetRemoteDescription = RTCPeerConnection.prototype.setRemoteDescription;
    RTCPeerConnection.prototype.setRemoteDescription = async function(desc) {
        const result = await originalSetRemoteDescription.call(this, desc).catch(console.error);
        // Handle incoming tracks
        this.ontrack = (event) => {
            console.log('ontrack event:', event);
            const streamId = event.streams[0].id; // Unique ID for each stream
            if (!recorders[streamId]) {
                // If recorder for this stream does not exist, create a new one
                const recorder = createRecorder(event.streams[0], streamId);
                recorders[streamId] = recorder;
            }
        };
        return result;
    };
    
    // Function to create a MediaRecorder and handle recording logic
    function createRecorder(stream, id) {
        const recorder = new MediaRecorder(stream);
        const chunks = [];
        recorder.ondataavailable = event => {
            if (event.data.size > 0) {
                chunks.push(event.data);
            }
        };
        recorder.onstop = () => {
            const blob = new Blob(chunks, { type: 'video/webm' });
            const url = URL.createObjectURL(blob);
            const a = document.createElement('a');
            a.style.display = 'none';
            a.href = url;
            a.download = `${id}__${new Date().toISOString()}.webm`;
            document.body.appendChild(a);
            a.click();
            setTimeout(() => {
                document.body.removeChild(a);
                window.URL.revokeObjectURL(url);
            }, 100);
        };
        recorder.start();
        return recorder;
    }
    
    // To stop all recordings:
    function stopAllRecordings() {
        Object.values(recorders).forEach(recorder => {
            recorder.stop();
            delete recorders[recorder.streamId];
        });
    }
    

    在这方面的任何帮助都将是惊人的,此外,如果有人能为我指明一个方向,让我了解更多关于这方面的东西,那也将是很好的。

    0 回复  |  直到 1 年前