h5出现之前,要进行Web音频的展示,往往需要在浏览器加载flash等插件,h5中新增的<audio>标签允许用户进行一些基本的音频流操作,但是对于一些复杂的音频处理应用,其功能远远不能满足需求,而h5中提供的Audio API就派上了用场。H5的Web Audio API很强大,我们可以利用它去创建各种音频,甚至可以创建一段完整的音乐。在进行一些网站建设时,我们前端攻城狮可以摆脱网上搜索背景音乐或特定音频的束缚,完全可以自己创作一段满足网站需求的音频(比如游戏背景音乐,按键点击音乐等)。本文简单介绍一下音频处理流程以及Audio 的应用。

模块化音频节点

音频节点接口是一个个音频处理模块,包括音频源、音频输出、中间处理模块。音频节点模块化允许在两个音频节点之间进行任意连接,每个中间节点有输入和输出。源节点没有输入,只有一个输出;目的节点只有一个输入源没有输出,其他的节点,能够设置在源节点和目的节点之间。

在最简单的例子中,一个音频源可以直接输出,所有的音频路由在一个音频上下文(AudioContext)中进行:

如果要对源进行一些处理,就可以插入中间处理模块:

在这里,我们没有输入音频源,而是通过Oscillator创建了一个输入源。

创建音频步骤

  1. AudioContext

AudioContext是一个音频上下文,所有的音频节点处理在音频上下文中进行,类似于canvas中的context,进行音频操作前,需要获取音频上下文。

var AudioContext = new(window.AudioContext || window.webkitAudioContext)();

考虑IE的兼容性问题,如果是IE浏览器,则报错:

try {var AudioContext = new(window.AudioContext || window.webkitAudioContext)();
} catch (e) {Console.log('浏览器不支持 ');
}
var audioCtx = new AudioContext();

该上下文对象包含很多属性和方法,用于创建各种音频元和音频处理模块。

2.创建音频振荡器OscillatorNode

var oscillator = audioCtx.createOscillator();    //创建振荡器oscillator.type = 'triangle';    //设置波形,可选值:'square','triangle','sawtooth','sine'oscillator.frequency.value = 198;    //设置频率

         声音的本质其实是震动,通过定义震动的频率,振幅,波形可以发出不同的声音,这也是我们创建声音的本质。因此波形不一样,最终的声音也就不一样,波还受频率影响,最终表现为不一样的音调高低。

createOscillator()是AudioContext对象的一个方法,该方法创建一个音频振荡器节点。振荡器是一个重复的波形。它有一个频率和振幅。一个振荡器最重要的特征,除了频率和振幅,是它波形的形状。四种的振荡器波形分别是正弦、三角、方形、锯齿:

利用振荡器输出一个音调。不同的波形决定了音调的不同。

3.创建音量节点GainNode

 var gainNode = audioCtx.createGain();     //创建音量控制节点gainNode.gain.setValueAtTime(0, audioCtx.currentTime);
gainNode.gain.linearRampToValueAtTime(volume, audioCtx.currentTime + 0.01);

我们可以通过创建一个音量控制节点GainNode来调节音量大小。GainNode的gain返回一个AduioParam对象,这里调用AudioParam.setValueAtTime()方法,该方法支持两个参数,一个是音量(范围0-1),另一个参数是时间。这里调用setValueAtTime(0, audioCtx.currentTime)表示当下就把音量设为0,也就是没声音。

linearRampToValueAtTime()方法表示音量在某时间线性变化到某值,这里linearRampToValueAtTime(1, audioCtx.currentTime + 0.01)实际上表示的是在0.01秒的时间内,声音音量线性从01

4.关联中间模块

关联振荡器和音量控制器:

oscillator.connect(gainNode);

音量控制器关联目的输出节点:

gainNode.connect(audioCtx.destination);

5.播放音频

出现声音:

oscillator.start(audioCtx.currentTime);

6音频音量变化,淡入淡出

gainNode.gain.exponentialRampToValueAtTime(0.001, audioCtx.currentTime + 1);

exponentialRampToValueAtTime()方法表示音量在某时间指数变化到某值,这里的exponentialRampToValueAtTime(0.001, audioCtx.currentTime + 1)实际上表示的是在1.00秒的时间内,音量由之前的1以指数曲线的速度降到极低的0.001音量。

7. 关闭音频

oscillator.stop(audioCtx.currentTime + 1)

1秒后,声音关闭。

通过以上步骤,实现了创建音频,控制音量到停止音频播放的应用。利用以上原理,可以制作一些小应用。戳这里,查看Audio钢琴小demo。效果图如下,点击不同的按键,会调整频率,达到发出不同音调声音的目的。github地址:https://github.com/jianfeng418/h5-pinao

H5的Audio API音频相关推荐

  1. Web Audio API与WebSocket播放实时音频

    WebSocket客户端与Web Audio API示例 <!DOCTYPE html> <html><head><meta charset="ut ...

  2. HTML 利用 Web Audio API 进行音频可视化

    利用Web Audio API 进行音乐可视化 1.什么是 Web Audio API: 官方:Web Audio API 提供了在Web上控制音频的一个非常有效通用的系统,允许开发者来自选音频源,对 ...

  3. 利用Web Audio API将振动数据转化为音频数据并播放

    年初在公司做了一个需求:传感器采集到了机器的振动数据,要在网页中利用这个数据播放出振动的声音. 之前只了解过HTML中的<audio>元素可以通过src属性指定音频文件路径来播放音频,现在 ...

  4. Audio API 实现音频播放器

    市面上实现音频播放器的库有很多,比如wavesurfer.js.howler.js等等,但是都不支持大音频文件处理,100多M的文件就有可能导致程序崩溃.总之和我目前的需求不太符合,所以打算自己实现一 ...

  5. h5 audio播放音频文件

    h5 audio播放音频文件 注:下面html中样式及不相关的内容去掉了 第一个例子 播放没有防盗链的外网音频文件是可以的 <!doctype html> <html> < ...

  6. 基于Web Audio API实现音频可视化效果

    网页音频接口最有趣的特性之一它就是可以获取频率.波形和其它来自声源的数据,这些数据可以被用作音频可视化.这篇文章将解释如何做到可视化,并提供了一些基础使用案例. 基本概念节 要从你的音频源获取数据,你 ...

  7. 用web audio api 在canvas上画出音频的音轨

    上一篇讲了一下如何用web audio api实现播放,这一篇讲一下如何画音轨吧

  8. 利用HTML5 Web Audio API给网页JS交互增加声音

    转自张鑫旭老师博客 原文地址 一.庞然的HTML5 Web Audio API 首先务必要弄清这一点,本文这里所说的HTML5 Web Audio API和HTML5 元素完全不是一个东西,其体量也完 ...

  9. 如何使用Web Audio API听到“ Yanny”和“ Laurel”的声音

    by _haochuan 通过_haochuan 如何使用Web Audio API听到" Yanny"和" Laurel"的声音 (How you can h ...

最新文章

  1. 让软件版本信息自动引用SVN修订版本号
  2. Java集合之EnumSet
  3. Windows下,使用dumpcpp 方式访问 COM 接口的方法
  4. 写html前端代码的软件_html用什么软件编写
  5. 二叉树先序、中序、后序的递归算法---《数据结构》
  6. Oracle 集群sysbackup用户登陆随机报错ORA-01017
  7. 史密斯圆图matlab,用MATLAB程序实现Smith圆图的图解过程
  8. springboot Error executing DDL via JDBC Statement
  9. matlab 双均线,双均线策略(CTA)
  10. centos7 设置网络(静态ip),联网失败,DNS解析失败(被覆盖),虚拟机
  11. 维智创始人陶闯博士:利用数字孪生空间计算供需平衡寻找最优解|元宇宙与碳中和
  12. 在spring security手动 自定义 用户认证 SecurityContextHolder
  13. react+antd实现图片上传并且剪裁(请参照最新文章,此案例有bug)
  14. 介绍芯片时为什么都要介绍制程?制程到底是什么?14nm、10nm?
  15. 被绕晕了,嵌入式用C好还是用C++好
  16. 深度解析AI人脸识别技术发展到什么程度了?它的能力极限是什么样子?你会不会因为天网而感到害怕?
  17. Codeforces 1325C. Ehab and Path-etic MEXs(构造)
  18. 手机邮箱好处,邮箱格式地址,安全邮箱号是什么样的?
  19. 【微信小程序】微信小程序读取本地文件--学习微信小程序之路02
  20. 远程教育英语计算机统考试题,2020年远程网络教育计算机应用基础统考题库原题真题(完整版)...

热门文章

  1. 排查自模拟QWheelEvent事件不能向上传递排查
  2. C语言选择结构的嵌套:以if语句计算分段函数为例
  3. centos 6.8下载地址
  4. 模式识别_字符识别算法设计
  5. LUTU iOS 13.3发布:可以过滤iMessage垃圾信息了
  6. Python中的Beautiful Soup库(笔记)
  7. Android的触控重采样算法
  8. 技术人 | 如何写出一篇好的技术方案?
  9. Monkey 测试(猴子测试)
  10. 注册表(2021-10-6)