You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用RecordRTC录屏问题:无法捕获屏幕视频声音及录屏+麦克风需求

解决屏幕录制无法捕获系统音频的问题

看起来你遇到的核心问题是屏幕录制时无法捕获系统播放的音频(比如视频声音),这是因为默认的屏幕捕获请求没有包含系统音频权限,而且如果需要同时录制麦克风音频,还得把系统音频流和麦克风音频流合并后再进行录制。

问题根源

当调用navigator.mediaDevices.getDisplayMedia()时,如果只请求视频或者没有明确指定系统音频,浏览器只会捕获屏幕画面,不会包含系统播放的声音。另外,若要同时保留麦克风输入,必须将两个音频流合并成一个混合流,才能同时录制两种声音。

解决方案步骤

  • 明确在屏幕捕获请求中加入系统音频权限
  • 获取麦克风音频流,将其与屏幕流的音视频轨道合并
  • 使用合并后的混合流进行录制

修改后的代码示例

<!DOCTYPE html>
<html>
<head>
    <title>Screen recording using RecordRTC</title>
    <style>
        html, body{ margin: 0!important; padding: 0!important; width: 100%; height: 100%; }
    </style>
    <script src="https://cdn.jsdelivr.net/npm/recordrtc@5.6.2/dist/RecordRTC.min.js"></script>
</head>
<body>
    <video controls autoplay height="600" width="800" style="float: left; margin-top: 20px"></video>
    <button onclick="startRecording()">开始录制</button>
    <button onclick="stopRecording()">停止录制</button>

    <script>
        let recorder;
        let mixedStream;

        async function startRecording() {
            try {
                // 请求屏幕捕获,同时获取系统音频
                const screenStream = await navigator.mediaDevices.getDisplayMedia({
                    video: true,
                    audio: true // 关键:启用系统音频捕获
                });

                // 请求麦克风音频流
                const micStream = await navigator.mediaDevices.getUserMedia({
                    audio: true,
                    video: false
                });

                // 合并屏幕视频、系统音频、麦克风音频到同一个流
                mixedStream = new MediaStream([
                    ...screenStream.getVideoTracks(),
                    ...screenStream.getAudioTracks(),
                    ...micStream.getAudioTracks()
                ]);

                // 初始化RecordRTC进行录制
                recorder = RecordRTC(mixedStream, {
                    type: 'video'
                });

                recorder.startRecording();
                console.log("录制已开始");
            } catch (err) {
                console.error("捕获媒体流失败:", err);
            }
        }

        function stopRecording() {
            if (recorder) {
                recorder.stopRecording(() => {
                    const blob = recorder.getBlob();
                    // 将录制结果展示到页面的video元素中
                    const videoElement = document.querySelector('video');
                    videoElement.src = URL.createObjectURL(blob);
                    
                    // 停止所有媒体轨道,释放资源
                    mixedStream.getTracks().forEach(track => track.stop());
                    console.log("录制已停止");
                });
            }
        }
    </script>
</body>
</html>

关键注意点

  • 浏览器兼容性:目前Chrome、Edge等Chromium系浏览器,以及新版本Firefox都支持系统音频捕获,建议使用较新的浏览器版本。
  • 权限授权:浏览器会弹出权限对话框,需要用户同时允许「屏幕捕获」和「音频捕获」权限,才能正常获取两种音频流。
  • 资源清理:录制结束后一定要停止所有媒体轨道,避免浏览器持续占用摄像头、麦克风或屏幕捕获资源。

内容的提问来源于stack exchange,提问作者Hardiksinh Gohil

火山引擎 最新活动