最近想用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. RPM常用命令以及组合使用场景

    本文分享自天翼云开发者社区<RPM常用命令以及组合使用场景>,作者:邬祥钊   当涉及到管理基于 Red Hat 系的 Linux 系统时,RPM (Red Hat Package Man ...

  2. 将个人PC转变为高效的云电脑:理论、实践与优化

    本文分享自天翼云开发者社区<将个人PC转变为高效的云电脑:理论.实践与优化>,作者:不知不觉 在数字化时代的今天,我们越来越依赖互联网和计算机技术进行工作和生活.然而,传统的个人电脑(PC ...

  3. Project Euler 588 题解

    这玩意好像甚至有递推式--不太懂 (为什么是图片?cnblogs 第一个公式没渲染成功) 时间复杂度是 \(O(4^{\deg F}\log K)\) 的. #include<bits/stdc ...

  4. P1081 [NOIP 2012 提高组] 开车旅行 题解

    传送门 前言 爆肝到半夜,中间假了一次,最终调过了两个样例,交上去过了. 题解 思路 首先进行预处理. 用一种你喜欢的数据结构维护每个城市的海拔,容易求出从每个城市出发,小 \(A\) 和小 \(B\ ...

  5. 最小生成树可并行化的 Sollin(Boruvka)算法

    上期回顾:https://www.cnblogs.com/ofnoname/p/18715203 在前文中,我们剖析了最小生成树(MST)问题中的两大经典算法: Kruskal 以"边权平等 ...

  6. DeepSeek本地性能调优

    技术背景 大模型性能调优是一个很复杂的工程,涉及到很多细节,如果真要对模型动刀子,还需要对模型和数据集本身有非常好的理解.这里我们仅仅考虑模型加载过程中,可以优化的一些参数配置.关于DeepSeek在 ...

  7. 【COM3D2Mod 制作教程(3)】Mod 制作概要

    [COM3D2Mod 制作教程(3)]Mod 制作概要 制作工具整合包:https://mod.3dmgame.com/mod/205516 该工具包简单整合了些本章需要的小型工具.插件.以及其他一些 ...

  8. 【论文随笔】深度推荐系统的自动化_一项调查(Automl for deep recommender systems_ A survey)

    前言 今天读的论文为一篇于2021年1月发表在ACM Transactions on Information Systems的论文,本文是一篇关于深度推荐系统自动化机器学习(AutoML)的综述,由R ...

  9. Git pull(拉取),push(上传)命令整理(详细)

    转自:https://www.cnblogs.com/wbl001/p/11495110.html (文档较长,请大家耐心阅读,很有帮助) git比较本地仓库和远程仓库的差异 更新本地的远程分支 gi ...

  10. C/C++ GOTO妙用

    目录 GOTO 语句 跳出多层循环 循环首次部分跳过 GOTO 语句 C/C++ 的 goto 语句用来在一个函数内进行任意跳转,用起来也是很方便.示例如下: int a() { int x = 0, ...