最近想用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. Doris端口列表

    实例名称 端口名称 默认端口 通讯方向 说明 BE be_port 9060 FE --> BE BE 上 thrift server 的端口,用于接收来自 FE 的请求 BE webserve ...

  2. CSP2024 to do list...

    马上 CSP 了,感觉得开始培养状态了. 哈希练习 Tarjan 初步学习+刷题 大模拟练习:鸭棋+猪国杀 S 组初赛,选择题部分,刷整卷至少 3 套. 树状数组练习:DX视频 线段树优化 dp 练习 ...

  3. Centos 7 安装Redis5 详细步骤 备忘录笔记

    通过wget下载tar包 wget http://download.redis.io/releases/redis-5.0.5.tar.gz 解压包 tar -zxvf redis-5.0.5.tar ...

  4. 通过 fork 为项目做出贡献

    本文旨在帮助新手小伙伴了解学习如何参与 GitHub 项目,为其献上自己的一份力,留下属于自己的足迹. 普遍流程 通过 fork 为项目做出贡献一个普遍的流程如下图: sequenceDiagram ...

  5. Halcon学习教程(一) 之提取十字线中心 图像分割

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/17266405.html 废话不多说,因为毕业后工作原因比较忙,好久没更新博客了,直接上图... ...

  6. 【效能提升】我们排查一个bug的过程是怎么样的?

    背景 最近发现团队中一些同学对如何排查一个bug,思路不够清晰.本文随笔整理:常规情况下,我们是如何排查一个bug的. 1. 弄清楚问题 有些人看到"弄清楚问题",可能会觉得好笑, ...

  7. Typecho如何添加微博表情包

    自从添加了蛆音娘表情包就想着去爬点其他地方的表情包- 使用教程跟蛆音娘一样 :点我查看 #表情包代码: "微博":{ "type": "usr&quo ...

  8. 八米云-N1、机顶盒设置静态地址和PPPOE拨号流程

    疑难解答加微信机器人,给它发:进群,会拉你进入八米交流群 机器人微信号:bamibot 简洁版教程访问:https://bbs.8miyun.cn 这里以老毛子路由系统举例: 一.设置静态地址 1.路 ...

  9. php批量删除记录

    <?php $arr = $_POST["item"]; $db = new mysqli("localhost","root",&q ...

  10. python 二级 标准库

    1.turtle 函数 包括窗体函数.画笔状态.画笔运动函数 random库 3.time 时间处理.时间格式化.时间计时