[Voice communications] 音量的控制
改变音频的音量是音频处理中最基础的部分,我们可以利用 GainNode 来构建 Mixers 的结构块。GainNode 的接口是很简单的:
interface GainNode : AudioNode {
readonly attribute AudioParam gain;
};
通过调节 GainNode.gain.value 就可以实现音频大小的调控了。下文会先介绍使用 Processor 来处理,这是一个最通用的节点,可以处理很多东西。在上文看得到的音频流中我们也使用了该节点。
本文地址:http://www.cnblogs.com/hustskyking/p/webAudio-volume.html,转载请注明源地址。
P.S:请在较新版的 chrome 火狐 Firefox 中测试。
一、音频流音量大小的控制
1. 使用 Processor 处理
这个过程比较简单:
source Node -> Processor Node -> Destination Node
数据送入到 Processor 后,由于输入 channel 和输出的 channel 之间的对应关系需要我们自己去处理,这些对应关系可以在 onaudioprocess 事件中处理,只要上面的连接导通,那这个事件就一直会处于触发状态,无论是否有数据流送入(其实没有数据流送入也就是数据流 bufferArray 为 0 嘛)。
可以看下面这个 DEMO:
<audio src="http://qianduannotes.duapp.com/file/tankWar.mp3" id="audio" autoplay></audio>
<input type="range" min="0" max="100" id="volume" />
<script type="text/javascript">
var AudioContext = AudioContext || webkitAudioContext;
var context = new AudioContext();
var source = context.createMediaElementSource(audio);
// 低通滤波节点(高频信号被过滤,听到的声音会很沉闷)
var processor = context.createScriptProcessor(1024, 1, 1);
// sourceNode - > processor -> destinationNode
source.connect(processor);
processor.connect(context.destination);
//处理过程
processor.onaudioprocess = function(e){
//获取输入和输出的数据缓冲区
var input = e.inputBuffer.getChannelData(0);
var output = e.outputBuffer.getChannelData(0);
//将输入数缓冲复制到输出缓冲上,并调整音量
for(var i =0; i < input.length; i++)
output[i] = input[i] * value;
};
//音量控制
var value;
onload = volume.onchange = function(){
value = volume.value / 200;
};
</script>
2. 使用 GainNode 控制
上面这种方式,我们可以在 onaudioprocess 事件中拿到几乎我们想要的所有数据,并且可以进行各种处理,可以说 processor 这个节点十分通用,但他的性能并不是高,你应该也看到了上面的代码中有:
//将输入数缓冲复制到输出缓冲上,并调整音量
for(var i =0; i < input.length; i++)
output[i] = input[i] * value;
需要将数据一一复制到输出节点,上面 demo 中我们设定的 bufferSize 是 1024 ,如果再大一些,或者文中需要处理的节点数太多,那页面将会很卡。Web Audio API 中提供了提供音量的节点,GainNode,既然提供了,毫无疑问,就用它呗~
节点连接方式也是十分的方便:
source → gain → destination
然后通过一个 range 控件来调节 Gain 的 gain 参数。DEMO如下:
<audio src="http://qianduannotes.duapp.com/file/tankWar.mp3" id="audio" autoplay></audio>
<input type="range" min="0" max="100" id="volume" />
<script type="text/javascript">
var AudioContext = AudioContext || webkitAudioContext;
var context = new AudioContext();
var source = context.createMediaElementSource(audio);
var Gain = context.createGain();
//连接:source → Gain → destination
source.connect(Gain);
Gain.connect(context.destination);
//音量控制
var value;
onload = volume.onchange = function(){
gain.gain.value = volume.value / 200;
};
</script>
十分轻松简洁的处理一个音量控制。
二、小结
本文主要是介绍 Web Audio API 中的 GainNode 节点,以及相关的应用。文中的两个 DEMO ,前者利用 processor 节点来处理,关于这个几点的说明,可以参考上两篇文章的接受;后者是使用 GainNode ,通过控制 Gain.gain.value 的值来调节音量的大小,过程十分简单,所以本文的思路也是比较的清晰。
如果本文中有叙述不正确的地方,还请斧正!
三、参考资料
- http://www.w3.org/TR/webaudio/ W3C Group
- http://www.web-tinker.com/ 次碳酸钴
[Voice communications] 音量的控制的更多相关文章
- [Voice communications] 声道的转换
本系列文章主要是介绍 Web Audio API 的相关知识,以及 web语音通信 中会遇到的一些问题,阐述可能存在错误,还请多多斧正! 很多粤语剧都提供了两个声道,一个左声道为粤语,一个右声道有国语 ...
- [Voice communications] 声音的滤波
本系列文章主要是介绍 Web Audio API 的相关知识,以及 web语音通信 中会遇到的一些问题,阐述可能存在错误,还请多多斧正! 通过设备获取音频流会不可避免的渗入一些杂音,这些杂音可能来自你 ...
- [Voice communications] 看得到的音频流
上文介绍了 Web Audio API 的相关知识,以及如何在你的 web 程序中引入 音频流,内容都是介绍性的,所以没有写太多 DEMO.本文重点讲解如何利用 Web Audio API 中的中间节 ...
- [Voice communications] 让音乐响起来
本系列文章主要是介绍 Web Audio API 的相关知识,由于该技术还处在 web 草案阶段(很多标准被提出来,至于取舍需要等待稳定版文档来确定,草案阶段的文档很多都会被再次编辑甚至重写.全部删除 ...
- Android手机音量的控制
1.AudioManager audio=(AudioManager) super.getSystemService(Context.AUDIO_SERVICE);//获得手机的声音服务 //设置加音 ...
- Android原生音量控制【转】
本文转载自:http://blog.csdn.net/u013082948/article/details/65630085 本文主要涉及AudioService.还是基于5.1.1版本的代码. Au ...
- audio 基本功能实现(audio停止播放,audio如何静音,audio音量控制等)
audio最简单原始的播放.暂停.停止.静音.音量大小控制的功能,注意某些浏览器会有权限无法自动播放噢(video也会如此) <!doctype html> <html> &l ...
- PCM音量控制(高级篇)
http://blog.jianchihu.net/pcm-volume-control.html 去年写过一篇文章,有关PCM的音量控制:http://blog.jianchihu.net/pcm- ...
- EasyPlayerPro windows播放器本地音频播放音量控制实现
背景描述 作为一个播放器, 除了能播放视频和声音外,音量控制是绝对不能缺少的功能; 本文在音视频播放的基础上,增加对音量的控制: 实现流程 调用mixerGetDevCaps获取音频输出设备列表; 打 ...
随机推荐
- [Linux] 查看jar包内容
jar vtf fileName.jar 用法: jar {ctxui}[vfm0Me] [jar-file] [manifest-file] [entry-point] [-C dir] file ...
- Spring MVC重定向和转发及异常处理
SpringMVC核心技术---转发和重定向 当处理器对请求处理完毕后,向其他资源进行跳转时,有两种跳转方式:请求转发与重定向.而根据要跳转的资源类型,又可分为两类:跳转到页面与跳转到其他处理器.对于 ...
- 《UML大战需求分析》阅读随笔(二)
在需求方面,我自己大体认为,分为两个部分:客户和软件公司. 客户:提出需求. 软件公司:解决需求. 这就是我所认为的 需求的关系. 就像书中所说的: 软件公司(项目组)始终都是跟着客户的后面追,客户需 ...
- MacOS下Python的多版本管理(pyenv)
与windows下设置绝对路径不同,pyenv使用了一种更优雅的方式来管理Python的版本.pyenv通过在$PATH的最前面插入一个垫片路径(shims),例如:~/.pyenv/shims:/u ...
- Oracle Flashback 闪回
Oracle 的闪回技术是一种数据恢复技术,仅能对用户逻辑错误进行恢复, 闪回针对的是提交commit的事务,没有提交的事务,使用rollback 1.闪回版本查询 Flashback Version ...
- Python学习笔记(1)
从今天开始正式学习python,教程看的是廖雪峰老师的Python 2.7教程.链接在此:http://www.liaoxuefeng.com/wiki/0014316089557264a6b3489 ...
- 如何设置GridView中某个字段显示数据的一部分?
后台方法: /// <summary> /// 截取字符串 /// </summary> /// <param name="str">要截取的字 ...
- spring3.0使用annotation完全代替XML(三)
很久之前写过两篇博客: spring3.0使用annotation完全代替XML spring3.0使用annotation完全代替XML(续) 用java config来代替XML,当时还遗留下一些 ...
- PHP 小数点保留两位【转】
最近在做统计这一块内容,接触关于数字的数据比较多, 用到了三个函数来是 数字保留小数后 N 位: 接下来简单的介绍一下三个函数: 1.number_format echo number_format( ...
- sql 更新列表中最老的一条数据
今天组长给个任务说要给摄像头触发一个列表.让缓存5条数据,每次摄像头触发更新一条,丢掉最老的一条数据.原来的update是直接更新掉一条,没带缓存的.然后搞了个sql语句,是这样的: UPDATE C ...