js录制系统/麦克风声音(基于electron)
最近想用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);
--参数
- bufferSize:缓冲区大小
256到16384之间的 2 的次幂, 为256,512,1024,2048,4096,8192或者16384(为0则由系统自动选取最优值) - inputChannels :输入node的声道数(1-32)默认值是2
- outputChannels:输出node的声道数(1-32)默认值是2
--概念
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;
---------------
附:
- mateType Media Types
- h5端调用有大神造好的轮子:https://www.cnblogs.com/xiaoqi/p/6993912.html
js录制系统/麦克风声音(基于electron)的更多相关文章
- Node.js 操作 OSX 系统麦克风、扬声器音量
最近几年 Electron 很火,公司也正好有个项目想做跨平台客户端,大家研究了一下就选择了 Electron,第一次做 js 的项目遇到了不少坑,不过也都一点点解决了. 因为项目中需要对用户录音,H ...
- mas录屏,带系统声音和麦克风声音
自带的QuickTime + Soundflower 可完美解决,同时录系统的声音和mic声音,也可以只录系统声音. 安装Soundflower 在应用程序 -> 实用工具,里面找到“音频 MI ...
- 使用 Python 的 sounddevice 包录制系统声音
博客中的文章均为meelo原创,请务必以链接形式注明本文地址 sounddevice是一个与Numpy兼容的录音以及播放声音的包. 安装sounddevice包 直接通过pip就能安装. pip in ...
- Mac录屏同时录制系统声音和画外音(Soundflower无法安装解决方案)
个人博客地址:xzajyjs.cn 前言 以前一直有录屏的需求,但苦于自带的QuickTime 无法录制内屏声音,一直使用的是第三方的app.近期开腾讯会议需要录屏,但主持人本身没有开启录屏权限,只好 ...
- javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG、javaCV-openCV)
javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...
- 基于 Electron 实现 uTools 的超级面板
前言 为了进一步提高开发工作效率,最近我们基于 electron 开发了一款媲美 uTools 的开源工具箱 rubick.该工具箱不仅仅开源,最重要的是可以使用 uTools 生态内所有开源插件!这 ...
- 使用Squirrel创建基于Electron开发的Windows 应用安装包
我们把自己开发的Electron应用发布之前,需要把app打包成简单的安装包,这样app更容易被获取,以此来发布我们的应用.我们可以参考Wix或其他的安装程序,但是对于Electron应用更好的打包程 ...
- 基于 Electron 的爬虫框架 Nightmare
作者:William 本文为原创文章,转载请注明作者及出处 Electron 可以让你使用纯 JavaScript 调用 Chrome 丰富的原生的接口来创造桌面应用.你可以把它看作一个专注于桌面应用 ...
- 基于 electron 实现简单易用的抓包、mock 工具
背景 经常我们要去看一些页面所发出的请求时,经常会用到 Charles 做为抓包工具来进行接口抓取,但一方面市面是很多抓包工具都是收费或者无法二次开发的.当前我们团队大多数用的也都是 Charles, ...
- 基于 Electron 的 Rubick 2.4k star 啦,同步更新新功能!
为什么要做 Rubick 其实做 Rubick 1.x 的初衷就是解决自己的问题的:特别需要一款支持自定义插件的桌面端应用来简化使用者安装庞大桌面端应用的臃肿.而且涉及到数据安全的问题,插件只能在公司 ...
随机推荐
- 独立看门狗IWDG
一.简介 STM32F10xxx内置两个看门狗(独立看门狗是12位递减计数器,窗口看门狗是7位递减计数器),提供了更高的安全性.时间的精确性和使用的灵活性.两个看门狗设备(独立看门狗和窗口看门 ...
- java中的接口和枚举
接口:可以简单的理解为规则 接口的基本语法: interface 接口名称 { 规则属性, 规则行为} 接口 接口其实是抽象的 接口的属性必须是固定的值,并且不能够修改的 属性和行为的访问权限必须是公 ...
- Sa-Token v1.40.0 发布 🚀,来看看有没有令你心动的功能!
Sa-Token 是一个轻量级 Java 权限认证框架,主要解决:登录认证.权限认证.单点登录.OAuth2.0.微服务网关鉴权 等一系列权限相关问题. 目前最新版本 v1.40.0 已发布至 Mav ...
- JavaScript数组(包括上一笔记都是ECMAScript对象),BOM对象,DOM对象,html DOM Enent(事件)
JavaScript数组(包括上一笔记都是ECMAScript对象),BOM对象,DOM对象,html DOM Enent(事件) 1.Arrary; var ret = new Arrary(1,2 ...
- Git指南-从入门到精通
代码提交和同步命令 流程图如下: 第零步: 工作区与仓库保持一致 第一步: 文件增删改,变为已修改状态 第二步: git add ,变为已暂存状态 $ git status $ git add --a ...
- C# 获取计算机唯一标识
C# 获取计算机唯一标识 原文链接 private static string _sFingerPrint { get; set; } /// <summary> /// 计算机唯一标识 ...
- window本地部署deepseek
window本地部署deepseek 学习自[[教程]DeepSeek本地免费部署教程,丝滑不卡顿!带你解锁隐藏功能!]https://www.bilibili.com/video/BV1viFaeB ...
- mybatis - [11] ResultMap结果集映射
题记部分 用于处理数据库中的字段名和Java实体类中的属性名不一致的问题 数据库中的字段为id,name,pwd.Java实体类属性为id,name,password. 在映射文件中select标签使 ...
- K8s - 容器编排引擎Kubernetes
什么是Kubernetes? 背景 Kubernetes 是开源的容器集群管理项目,诞生于2014年,由Google公司发起 前身Borg系统在Google内部应用了十几年,积累了大量来自生产环境的实 ...
- halcon中是怎么实现半导体/Led中的GoldenDie的检测方法的 基于局部可变形模板匹配 variation_model模型
原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/18739196 这篇简单介绍一下halcon中的print_check_single_chars ...