技术标签: js声道音量控制 js获取视音频轨道 Web API Web前端 Js音频可视化 音频控制 js音频声道 Web Audio API js音视频处理
接上篇博文:Web前端JS如何获取 Video/Audio 视音频声道(左右声道|多声道)、视音频轨道、音频流数据 讲解了如何根据视频链接地址,实现在播放时实时的显示该视频的音频轨道情况,并实时的将各音频轨道数据以可视化(峰值电平 / 响度跳表)的形式展现出来。
本篇博文主要w介绍:Web前端JS如何控制 Video/Audio 视音频声道(左右声道|多声道)、视音频轨道、音频流数据。如:实现各个 视音频声道(左右声道|多声道)的 独立音量大小、静音的控制。
需要注意的是,由于我们日常中活中大部份硬件设备,如:电视机、笔记本电脑、耳机等,只有两个扬声器(简音来说,就是只有左L 和 右R 两个喇叭,就只能听到两个音频轨道的声音)如果要测试多声道的话,至少满足以下两个条件:
- 1、播放的视音频文件必须是有多音轨的(就是两个以上的声道)
- 2、播放的硬件设备必须是有多个扬声器(就是两个以上的喇叭)
在Web浏览器中,想要获取多媒体文件的相关数据信息,需要借助对应的API来完成,比如获取视音文件的音频信息,就需要用到Web Audio API,通过该API我们可以轻松做到播放声音、获取声音数据,修改声音数据、甚至还可以制造声音。
GainNode 接口表示音量的变化。它是一个 AudioNode 音频处理模块,在输出前使用给定增益应用到输入。一个 GainNode 始终只有一个输入和一个输出,两者拥有同样数量的声道。
增益是一个无单位的值,会对所有输入声道的音频进行相应的增加(相乘)。如果进行了修改,则会立即应用新增益,从而在结果音频中产生奇怪的“咔嗒”声。为了防止这种情况发生,请不要直接更改值,而应在 AudioParam 接口上使用指数插值方法。
GainNode接口:
https://developer.mozilla.org/zh-CN/docs/Web/API/GainNode
了解更多API:
https://www.w3.org/TR/webaudio、https://developer.mozilla.org/zh-CN/docs/Web/API/Web_Audio_API
由于video和audio都有音频,所以我们可以video或者audio来获取输入源,除此以外,我们还可以通过 navigator.getUserMedia API 或 Ajax请求的方式来获取输入源。
<video loop controls>
<source src="./media/xxx.mp4" type="video/mp4" />
</video>
<audio loop controls>
<source src="./media/xxx.mp3" type="audio/mp3" />
</audio>
在创建AudioContext 上下文环境对象时, 由于浏览器安全策略要求音频上下文必须在用户事件(单击、键盘按键等)中启用。这意味着,如果您尝试在没有用户事件的情况下自动播放音乐,所以在loadedmetadata元数据已加载时再执行!!
// 创建一个 AudioContext 环境
const ac = new (window.AudioContext || window.webkitAudioContext)();
// 从 video 或 audio 标签元素中拿到输入源
const audio = document.querySelector("video");
// const audio = document.querySelector("audio");
// 创建并获取输入源
const audioSource = ac.createMediaElementSource(audio);
// 音频通道数 默认值是 2,最高能取 32
const channelCount = 2 || audioSource.channelCount;
// 创建音频处理器
const processor = ac.createScriptProcessor(2048, channelCount, channelCount);
// 链接音频处理器
audioSource.connect(processor).connect(ac.destination);
// 创建通道控制器
const volumeNodeL = new GainNode(ac, {
gain: 1 });
const volumeNodeR = new GainNode(ac, {
gain: 1 });
// 创建通道分配器
const splitterNode = new ChannelSplitterNode(ac, {
numberOfOutputs: channelCount,
});
splitterNode.connect(volumeNodeL, 0);
splitterNode.connect(volumeNodeR, 1);
// 控制链接到输入源
audioSource.connect(splitterNode);
// 创建通道合并器
const mergerNode = new ChannelMergerNode(ac, {
numberOfInputs: channelCount,
});
volumeNodeL.connect(mergerNode, 0, 0);
volumeNodeR.connect(mergerNode, 0, 1);
// 通道链接到扬声器
mergerNode.connect(ac.destination);
// 监听音频处理器每次处理的样本帧
processor.onaudioprocess = (evt) => {
//获取声轨1输入的缓冲区数据
let input =evt.inputBuffer.getChannelData(0);
//获取声轨1输出的缓冲区数据
let output = evt.outputBuffer.getChannelData(0);
};
// 静音左L声道
LBTN.onclick = function () {
volumeNodeL.gain.value = Number(!volumeNodeL.gain.value);
};
// 左L声道音量大小控制
VL.oninput = function () {
// volumeNodeL.gain.value = this.value;
volumeNodeL.gain.setValueAtTime(this.value, ac.currentTime);
VLV.innerText = '音量:' + this.value;
};
可以通过添加本地的视频 或 音频文件,来测试对应的声道,并实时的渲染到响度跳表中,需要注意的是,音频峰值电平跳表从-60开始的原因主要是,当输出音量接近满载时,THD(总谐波失真)的表现会比较差,此时产生的谐波会盖掉原本存在的背景噪音,影响到测试成绩。因此,采用-60dB的测试信号。
音频峰值电平跳表值:通常在-60dB到+3dB之间。在音频设备测试中,跳表值反映了设备的频率响应和增益。不同的音频设备可能会有不同的跳表值范围,根据测试标准和设备要求而定。
为了能在项目上提高开发效率,我将其封装发布至Npm上了,在我们Web前端常用的开发框架(如:Vue.js,React.js,Angular.js等)中,使用Npm命令直接下载安装即可:
Npm安装命令:
npm i @muguilin/web-audio-track
Yarn安装命令:
yarn add @muguilin/web-audio-track
文章浏览阅读4.9k次,点赞2次,收藏5次。将下载好的 redis-6.2.7.tar.gz 安装包上传到虚拟机的任意目录(一般推荐上传到 /usr/local/src目录)。如果是前台启动的话,如果关闭当前会话,则Redis服务也随即关闭,因此这种方式不推荐使用。redis-sentinel:它是 redis 提供的哨兵启动脚本。redis-check-dump:修复有问题的dump.rdb文件。redis-server:它是 redis 的服务端启动脚本。redis-cli:它是 redis 提供的客户端启动脚本。如果没有出错,就会安装成功。_redis安装部署
文章浏览阅读1.5k次,点赞3次,收藏6次。OpenCL设备每个平台可能关联不同的设备,在把内核程序发送到OpenCL设备上执行前,编程人员需要指定执行该内核代码的计算设备。OpenCL中设备对象的类型为cl_device_id,我们可以通过以下函数来查询支持OpenCL设备列表。cl_int clGetDeviceIDs(cl_platform_id platform, cl_device..._cl::device
文章浏览阅读1.4k次。1、在自动化测试中经常要模拟窗口按钮的点击。参考文章:http://blog.csdn.net/blackboyofsnp/article/details/3372719有时我们需要这么做, 手动模拟按钮按下的事件, 让程序做出与按钮真的按下时一样的响应.设按钮ID为ID_BTN_OK, 当前Dialog窗口.实际上系统并不能区分按钮是真的按下了(如用鼠标点击), 还是一个我们自己用代码模拟出的一种"假象".它所需要知道的只是哪个窗口(按钮也是一种窗口)发生了哪一种事件, 然..._在mfc中使用c#窗体
文章浏览阅读160次。py3中只有 str和bytes两种数据类型str: unicode编码(万国码,全世界都能看懂的一种编码方式)s = 'hello袁浩' #内部寸的是一个个unicode编码bytes:十六进制#utf8编码由str转到bytes叫做编码b1 = bytes(s,'utf8') #把字符串格式的str转换为由utf8编码的十六进制类型b1,而utf8是世界公认的#utf8规定一个汉字占..._python中encoding什么时候用gbk,utf-8
文章浏览阅读474次,点赞8次,收藏13次。1.背景介绍蚁群算法(Ant Colony Optimization, ACO)是一种基于生物学蚂蚁的优化算法,它可以用于解决各种优化问题。在过去的几年里,蚁群算法已经成为一种非常受欢迎的机器学习方法,因为它可以用于解决许多复杂的优化问题。然而,蚁群算法和机器学习之间的关系并不是那么简单。在这篇文章中,我们将讨论蚁群算法与机器学习的结合,以及它们之间的关系和联系。我们还将探讨蚁群算法的核心算法..._蚁群算法在机器学习中的发展前景
文章浏览阅读3k次,点赞3次,收藏7次。变量的定义我们都知道,不过,有时候我们写的代码,明明已经定义了,而且还没啥语法错误,但是,就是一直报错error C2065: “n”: 未声明的标识符。同样的道理,在调用函数的时候,这个问题也会被遇到“is_prime”未定义;假设外部返回 int同样的事情也会发生在结构体上,写结构体的时候也是一定要写在使用这个结构体的函数之前,要不然,会出现结构体未定义的现象_printf未定义假设外部返回int的问题怎么解决
文章浏览阅读104次。华为路由器交换机配置命令大全**一、计算机命令**PCAlogin:root;使用root用户password:linux;口令是linux#shutdown-hnow;关机#init0;关机#logout;用户注销#login;用户登录#ifconfig;显示IP地址#ifconfigeth0netmask;设置IP地址#ifconfigeht0netmaskdown;禁用IP地址#rout..._华为交换机路由器,是否可以用命令关机
文章浏览阅读3.9k次。温馨提示:修复都不可以远程,需要邮寄;修复不是100%的,硬件问题修复不了,需要更换会提前你,确认好在进行后续工作,修复不了不收费,退回即可;修复好发回是顺丰到付,(咨询特价)(广东省内9-(咨询特价),广西,福建,新疆(咨询特价),西藏到不了,只能付费发邮政);专业修复kindle voyage死机,卡大树,变砖,不拆机、零损伤,速度快!Kindle voyage可安装安卓系统,能自由安装大部分..._kindle刷安卓变砖
文章浏览阅读1.8k次。springmvc处理请求的流程_springmvc处理请求的流程
文章浏览阅读3.8w次,点赞59次,收藏230次。MybatisX 是一款基于 IDEA 的快速开发插件,方便在使用mybatis以及mybatis-plus开始时简化繁琐的重复操作,提高开发速率。 节省大量持久层代码开发时间强大的功能为业务编写提供各类支持配置简单,告别各类复杂的配置文件 输入用户、密码及数据库名 当Test Connection时会提示这么一段话:这是时区未设置问题 根据提示来到Advanced,找到severTimezone,将其设置为GM_mybatisx
文章浏览阅读2.8k次。老老实实手打路径,别在属性里复制,但我在everthing中复制从来都没有报错_invalid argument: '\u202ad:\\电信行业客户数据.xlsx
文章浏览阅读4.6k次,点赞6次,收藏18次。当代科技领域中,正逐渐崭露头角,成为引领未来科技发展的一股重要力量。AR技术是一种通过将虚拟世界的数字信息与现实世界进行融合,使用户能够在现实世界中感知和与虚拟世界互动的技术。本文将介绍AR技术的基本原理、应用领域以及未来发展趋势。_ar技术