讲师中心 微信公众号

工具推荐

视频效率加速
AniShort
AniShort

AI短剧协同制作平台

剧云
剧云

中文短剧剧本制作平台

updream

一键生成高质量推广成片

Seko
Seko

AI短剧一键生成成片

如何使用 JavaScript 同时录制系统桌面音频与麦克风音频

千墨君_7235

千墨君_7235

发布时间:2025-12-26 12:50:08

|

339人浏览过

|

来源于php中文网

原创

如何使用 JavaScript 同时录制系统桌面音频与麦克风音频

本文详解如何在 web 环境中通过 web audio api 与 mediastream 融合技术,**同步捕获桌面音频(如播放的视频、音乐)和麦克风输入**,解决耳机电流干扰导致桌面音频丢失的常见问题,并提供可落地的 recordrtc + audiocontext 实现方案。

在现代浏览器中,navigator.mediaDevices.getUserMedia({ audio: true }) 仅能获取麦克风权限,无法直接采集桌面音频(即“系统声音”)。这是由浏览器安全模型严格限制的:出于隐私保护,Web 页面默认无权监听或录制用户正在播放的其他应用/标签页的音频流。因此,你遇到的“插耳机时桌面音频消失、拔掉后反而能录到”现象,本质上是误判——实际并非录到了桌面声,而是麦克风偶然拾取了扬声器外放的泄漏音(即“回声”),而耳机阻断了这一泄漏路径,导致“录音变空”。

✅ 正确解法:必须分离并显式获取两类音频源,再用 Web Audio API 混音合成:

  1. 麦克风音频:通过 getUserMedia({ audio: true }) 获取;
  2. 桌面音频:需用户主动选择——调用 navigator.mediaDevices.getDisplayMedia()(用于录屏+系统音)或(更推荐)使用 chrome.desktopCapture(仅 Chromium 扩展)、或依赖操作系统级支持(如 Windows 10+/macOS 12+ 的「虚拟音频设备」配合第三方工具)。但注意:纯前端网页无法绕过用户授权直接获取系统音频。

⚠️ 关键前提:目前标准 Web API 尚不支持直接捕获非当前标签页的桌面音频。若你的场景是录制「当前页面内

Windows 图片打印
Windows 图片打印

通过 Python 使用 mspaint /pt 在 Windows 上打印图像——绕过 bash 中文路径编码问题。

下载

✅ 推荐方案:混音录制(麦克风 + 页面媒体元素音频)

async function startDualAudioRecording() {
  try {
    // 1. 获取麦克风流
    const micStream = await navigator.mediaDevices.getUserMedia({ audio: true });

    // 2. 创建 AudioContext 并混音
    const ac = new (window.AudioContext || window.webkitAudioContext)();

    // 3. 创建目标输出流(用于录制)
    const dest = ac.createMediaStreamDestination();

    // 4. 将麦克风接入混音总线
    const micSource = ac.createMediaStreamSource(micStream);
    micSource.connect(dest);

    // 5. 若需录制页面内 <audio>/<video>,需显式连接其 playback
    const mediaElement = document.getElementById('myVideo'); // 替换为你的媒体元素
    if (mediaElement && 'captureStream' in mediaElement) {
      const mediaStream = mediaElement.captureStream(); // Chrome/Firefox 支持
      const mediaSource = ac.createMediaStreamSource(mediaStream);
      mediaSource.connect(dest); // 混入麦克风流
    }

    // 6. 使用 RecordRTC 录制混音后的流(推荐替代原生 MediaRecorder)
    const recorder = new RecordRTC(dest.stream, {
      type: 'audio',
      mimeType: 'audio/wav',
      recorderType: StereoAudioRecorder,
      numberOfAudioChannels: 2,
      timeSlice: 2000,
      ondataavailable: (blob) => {
        const url = URL.createObjectURL(blob);
        console.log('录音分片生成:', url);
        // 上传、拼接或保存 blob
      }
    });

    recorder.startRecording();
    return recorder;
  } catch (err) {
    console.error('录音初始化失败:', err);
    alert('请允许麦克风权限,并确保浏览器支持 captureStream');
  }
}

⚠️ 注意事项与限制

  • mediaElement.captureStream() 是目前最兼容的页面内媒体捕获方式(Chrome 71+、Firefox 69+),但不捕获系统全局音频(如 QQ 音乐、网易云);
  • 若需真正录制系统级桌面音频(含所有应用声音),必须借助浏览器扩展(如 Chrome Extension + desktopCapture API)或桌面客户端桥接(Electron + node-audiorecorder);
  • RecordRTC 并非万能:它本质是对 MediaRecorder 的封装增强,仍受限于底层流可用性;务必检查 dest.stream.getAudioTracks().length > 0;
  • 耳机问题根源:部分设备驱动将“立体声混音”设为禁用,或系统音频路由策略导致 getDisplayMedia() 在耳机模式下返回空轨道——建议在 getDisplayMedia({ audio: true }) 后显式检测轨道有效性:
    const screenStream = await navigator.mediaDevices.getDisplayMedia({ audio: true });
    if (!screenStream.getAudioTracks().length) {
      throw new Error('未检测到系统音频轨道,请检查系统音频设置或更换设备');
    }

✅ 总结

纯前端 JavaScript 无法突破浏览器沙箱直接录制任意系统音频,但可通过 captureStream() + AudioContext 混音实现「页面内媒体 + 麦克风」的高质量同步录制。对于全系统音频需求,应转向浏览器扩展或混合架构方案。始终优先验证流轨道有效性,并使用 RecordRTC 提升编码稳定性与格式兼容性。

立即学习“Java免费学习笔记(深入)”;

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

相关专题

更多
chrome什么意思
chrome什么意思

chrome是浏览器的意思,由Google开发的网络浏览器,它在2008年首次发布,并迅速成为全球最受欢迎的浏览器之一。本专题为大家提供chrome相关的文章、下载、课程内容,供大家免费下载体验。

2966

2023.08.11

chrome无法加载插件怎么办
chrome无法加载插件怎么办

chrome无法加载插件可以通过检查插件是否已正确安装、禁用和启用插件、清除插件缓存、更新浏览器和插件、检查网络连接和尝试在隐身模式下加载插件方法解决。更多关于chrome相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

6159

2023.11.06

Chrome开启无痕模式
Chrome开启无痕模式

本专题整合了Chrome无痕模式开启相关内容,阅读专题下面的文章了解更多详细教程。

4407

2026.03.24

length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

1987

2023.09.19

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3459

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3018

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

1548

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

2739

2023.08.02

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

80

2026.11.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.5万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn