最近想用electron写一个和音视频相关的软件,尽管在写之前都想好了要用哪些技术,但依然写得很艰难,今天对相关知识的个人理解做个记录和整理。

时隔半年,最近发现网上有大神造好的轮子,而且功能强大:https://www.cnblogs.com/xiaoqi/p/6993912.html

先看几个浏览器api

1、AudioContext构造器

  • AudioContext接口表示由音频模块连接而成的音频处理上下文;它可以控制它所包含的节点的创建,以及音频处理、解码操作的执行。做任何事情之前都要先创建AudioContext对象,因为一切都发生在这个环境之中。 more
  • 通过var audioCtx = new AudioContext()创建;

2、ScriptProcessorNode 方法

  • ScriptProcessorNode是一个音频节点(AudioNode),js可以通过它直接处理音频
  • 通过audioCtx.createScriptProcessor方法创建
  • AudioContext.createScriptProcessor(bufferSize,inputChannels ,outputChannels);

--参数

  1. bufferSize:缓冲区大小 256 到 16384 之间的 2 的次幂, 为 2565121024204840968192 或者 16384(为0则由系统自动选取最优值)
  2. inputChannels :输入node的声道数(1-32)默认值是2
  3. outputChannels:输出node的声道数(1-32)默认值是2

--概念

  1. AudioNode 接口是一个处理音频的通用模块, 一个AudioNode 既有输入也有输出。输入与输出都有一定数量的通道。只有一个输出而没有输入的 AudioNode 叫做音频源。more》

3、createMediaStreamSource方法

  • createMediaStreamSource用于通过音频上下文创建一个可以被播放和处理的媒体流资源

  • 它需要传入一个流对象(可以通过navigator.getUserMedia获得

好了,开干

获取系统/麦克风音频流的buffer:


// config.resourceType :媒体类型(可传'system'|'device'指定获取系统/麦克风声音)
// config.bufferHanduler :buffer处理回调函数
// config.getMediaSuccessCallback :获取媒体设备(系统声道或这麦克风)成功后的回调函数
// config.errorHanduler :异常处理函数 class Recorder
{
constructor (desktopCapturer,config){
this.audioContext = null;
this.desktopCapturer = desktopCapturer; // electron的desktopCapturer对象
this.config = config;
} start() {
if(this.audioContext && this.audioContext.state == 'running'){
this.stop();
}
if(!(navigator.getUserMedia && AudioContext)){
return false;
} if(!this.AudioContext || this.audioContext.state == 'closed'){
this.audioContext = new AudioContext();
// audioContext.onstatechange = function(e){
// console.log(e);
// }
let audioNode = this.audioContext.createScriptProcessor(0, 1, 1); let _self = this;
let getMediaSuccess = function(stream){
console.log('success get ===========');
let mediaSource = _self.audioContext.createMediaStreamSource(stream); mediaSource.connect(audioNode);
audioNode.connect(_self.audioContext.destination); audioNode.onaudioprocess = (e) => {
// 好了,这里就获取到了音频流的buffer,你可以为所欲为了,嘿嘿。。
// 我这里发给另个一个线程把buffer转成pcm编码
_self.config.bufferHanduler && _self.config.bufferHanduler(e.inputBuffer.getChannelData(0)); } // 获取媒体成功,执行回调
_self.config.getMediaSuccessCallback && _self.config.getMediaSuccessCallback();
} // 获取音视频媒体
// 系统音频流
if(this.config.resourceType == 'system'){
this.desktopCapturer.getSources(
{types: ['screen']}
).then(async sources => {
for (const source of sources) {
console.log(source.name);
if (source.name === "Entire screen" || source.name === "Entire Screen") {
try {
const stream = await navigator.mediaDevices.getUserMedia({
video: {
mandatory: {
// cursor:"never",
chromeMediaSource: 'desktop'
}
},
audio: {
mandatory: {
chromeMediaSource: 'desktop',
}
}
});
getMediaSuccess(stream);
} catch (err) {
this.config.errorHanduler && this.config.errorHanduler(err);
}
}
}
});
// 麦克风音频流
}else if(this.config.resourceType == 'device'){
navigator.mediaDevices.getUserMedia({ video: false, audio: true }).then(function(stream){
if(!stream){
this.config.errorHanduler && this.config.errorHanduler('读取设备失败,请确认你的设备是否已经正确连接好麦克风设备!');
return;
}
getMediaSuccess(stream);
}).catch(function(err){
this.config.errorHanduler && this.config.errorHanduler(err);
});
}else{
this.config.errorHanduler && this.config.errorHanduler('不支持此类型!');
} } } stop(){
try{
this.audioContext.close();
}catch (e){
console.log(e);
}
} restart(){
if(this.audioContext && this.audioContext.state == 'running'){
this.stop();
}
this.start();
} } export default Recorder;

---------------

附:

  1. mateType Media Types
  2. h5端调用有大神造好的轮子:https://www.cnblogs.com/xiaoqi/p/6993912.html

js录制系统/麦克风声音(基于electron)的更多相关文章

  1. Node.js 操作 OSX 系统麦克风、扬声器音量

    最近几年 Electron 很火,公司也正好有个项目想做跨平台客户端,大家研究了一下就选择了 Electron,第一次做 js 的项目遇到了不少坑,不过也都一点点解决了. 因为项目中需要对用户录音,H ...

  2. mas录屏,带系统声音和麦克风声音

    自带的QuickTime + Soundflower 可完美解决,同时录系统的声音和mic声音,也可以只录系统声音. 安装Soundflower 在应用程序 -> 实用工具,里面找到“音频 MI ...

  3. 使用 Python 的 sounddevice 包录制系统声音

    博客中的文章均为meelo原创,请务必以链接形式注明本文地址 sounddevice是一个与Numpy兼容的录音以及播放声音的包. 安装sounddevice包 直接通过pip就能安装. pip in ...

  4. Mac录屏同时录制系统声音和画外音(Soundflower无法安装解决方案)

    个人博客地址:xzajyjs.cn 前言 以前一直有录屏的需求,但苦于自带的QuickTime 无法录制内屏声音,一直使用的是第三方的app.近期开腾讯会议需要录屏,但主持人本身没有开启录屏权限,只好 ...

  5. javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG、javaCV-openCV)

    javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...

  6. 基于 Electron 实现 uTools 的超级面板

    前言 为了进一步提高开发工作效率,最近我们基于 electron 开发了一款媲美 uTools 的开源工具箱 rubick.该工具箱不仅仅开源,最重要的是可以使用 uTools 生态内所有开源插件!这 ...

  7. 使用Squirrel创建基于Electron开发的Windows 应用安装包

    我们把自己开发的Electron应用发布之前,需要把app打包成简单的安装包,这样app更容易被获取,以此来发布我们的应用.我们可以参考Wix或其他的安装程序,但是对于Electron应用更好的打包程 ...

  8. 基于 Electron 的爬虫框架 Nightmare

    作者:William 本文为原创文章,转载请注明作者及出处 Electron 可以让你使用纯 JavaScript 调用 Chrome 丰富的原生的接口来创造桌面应用.你可以把它看作一个专注于桌面应用 ...

  9. 基于 electron 实现简单易用的抓包、mock 工具

    背景 经常我们要去看一些页面所发出的请求时,经常会用到 Charles 做为抓包工具来进行接口抓取,但一方面市面是很多抓包工具都是收费或者无法二次开发的.当前我们团队大多数用的也都是 Charles, ...

  10. 基于 Electron 的 Rubick 2.4k star 啦,同步更新新功能!

    为什么要做 Rubick 其实做 Rubick 1.x 的初衷就是解决自己的问题的:特别需要一款支持自定义插件的桌面端应用来简化使用者安装庞大桌面端应用的臃肿.而且涉及到数据安全的问题,插件只能在公司 ...

随机推荐

  1. 0511-Properties集合

    package A10_IOStream; import java.io.*; import java.util.Properties; import java.util.Set; /* java.u ...

  2. PHP变量与变量作用域

    PHP变量与变量作用域 1. 变量的基本概念 在PHP中,变量用于存储各种类型的数据,如字符串.整数.浮点数.布尔值.数组和对象等.变量名以美元符号$开头,后面跟着一个或多个字符(变量名).例如: & ...

  3. PHP简介与开发环境搭建

    PHP简介与开发环境搭建 一.PHP简介 PHP,全称PHP: Hypertext Preprocessor(超文本预处理器),是一种广泛使用的开源服务器端脚本语言,尤其适合Web开发.PHP由Ras ...

  4. 国产AI生态新突破!“息壤”+DeepSeek王炸组合来了!

    2025,国产AI火力全开! 天翼云"息壤"深度适配DeepSeek-R1/V3 实现"国产模型+国产算力+国产云服务" 全产业链闭环 打造国产AI新高度 助力 ...

  5. I2C死锁产生机理与解决方法

    在I2C实际使用过程中,最容易出现的一个问题就是死锁 ,其主要表现为:SCL持续为高,SDA持续为低. 产生机理 I2C死锁产生的机理是:当Slave输出应答信号或者输出数据0时,Master发生异常 ...

  6. RocketMQ实战—7.生产集群部署和生产参数

    大纲 1.RocketMQ生产集群部署和生产参数分析 2.RocketMQ生产集群10wTPS压测 3.RocketMQ生产级故障案例 1.RocketMQ生产集群部署和生产参数分析 (1)服务器数量 ...

  7. 13. Docker-compose容器编排(详解说明)

    13. Docker-compose容器编排(详解说明) @ 目录 13. Docker-compose容器编排(详解说明) 1. Docker-compose容器编排概述 2. Docker-Com ...

  8. 发那科FANUC机器人A06B-0652-B212电机维修基本流程

    发那科FANUC机器人以其卓越的性能和可靠性赢得了广泛的认可.然而,就像其他任何机械设备一样,长时间的运行和复杂的工作环境都可能使伺服电机面临维修的需求.为了确保您的发那科FANUC机器人A06B-0 ...

  9. 傻妞教程——对接mongoDB使用返佣系统

    使用docker安装mongo 1.安装 1.1 拉取mongo镜像 docker pull mongo:4.4 1.2 创建mongo数据持久化目录 mkdir -p /docker_volume/ ...

  10. Twain Capabilities属性

    Asynchronous Device Events 异步设备事件 CAP_DEVICEEVENT MSG_SET选择应用程序希望Twain源报告的事件; MSG_RESET返回Twain源的首选设置 ...