TAT.Jdo:【Web Audio API】 — 那些年的 web audio

这主题主要是早期对 web audio api的一些尝试,这里整理一下以便以后翻阅,如有错误,诚请指正。

在这之前,先回顾一下那些年我们一起走过的web audio:

<bgsound>

在我印象当中,bgsound是个很古老的东西,接触互联网之后,那时兴起的个人blog都有一个增加小组件或者背景音乐的功能,就是允许你贴入一段代码来实现,那是我最早接触bgsound的时候;当然那时也只是会ctrl+c/v ~~

网上翻来些资料,大概是这样的:

早在1996年,IE3.0定义了<bgsound>的标签,这应该web最早的一个能播放音频的标签;但它却从未成为标准,由始至终只有IE支持该标签;提供的功能比较有限,简单的后台自动播放,支持.wav|.mid|.ua格式音频;

<embed>

IE推出bgsound之后没多久,作为当年浏览器厂商的大哥 – NetScape同年即推出了功能类似的标签<embed>;

个人觉得<embed>早期相对于<bgsound>而言,最大的两个特色:

1.有界面交互,可以让用户控制播放/暂停(该属性可选);

2.不止能播放音频格式文件,还能播放当时比较高端的VRML Live3D图形动画。

以浏览器厂商老大的身份,很快IE3V2+, 以及后续的 safari, opare, firefox均支持了<embed>。

<object>

随着web的快速发展,标准变得越来越重要,这时就有了W3C存在的理由,1997年伴随着HTML4的到来,W3C引入了<object>标签,囊括了图片、音频、视频等格式文件,可以说非常彪悍;作为第一款可以跨浏览器间播放音频的标签,基本能满足我们当时对嵌入媒体的欲望,但<object>同样存在自己的弊端,例如标签臃肿,依赖插件,SEO困难等;

<audio>

08年初,第一份正式的HTML5草案发布,引入更新的富媒体元素<video> <audio> <canvas>,这些标签的引入最大目的还是为了减少web富媒体应用对插件的依赖。仅从标签名来说就能很好区分各自的功能,这点无疑是非常有利于搜索引擎去索引资源的,相比<object>来说,最明显的特色即是:

  1. 标签语义化,结构更简单;

  2. 脱离插件;

  3. 简单的javascript内置方法以及事件交互。

看似对音频控制都比较完善,但开发者缺少了对音频数据的访问权限,在很多更动感的交互,更复杂的音效需求面前就显得力不从心了。

[Audio Data API]

为了解决现状,Mozilla社区提出了Audio Data API,对<audio>标签进行js能力方面的扩展,这套API主要还是以提供读取写入音频数据接口为主,例如:

// 定义音频对象
var audio = new Audio();
var bufferLenth;
audio.src = "song.ogg";
audio.addEventListener('MozAudioAvailable', handleWithSample, false);
audio.addEventListener('loadedmetadata', handleWithMeta, false);
audio.play();
function handleWithMeta () {
bufferLenth = audio.mozFrameBufferLength;
}
function handleWithSample (e) {
var samples = e.frameBuffer;
for (var i = 0; i < bufferLenth; i++) {
// do something with audio data
dosomething(samples[i])
}
}

基于MozAudioAvailable事件驱动读取音频原始数据

注:该方法已无法正确执行,Firefox已转向Web Audio API的支持,后续的Firefox版本逐渐废弃了Audio Data API的旧接口。

但对于一个开发者来说,并非人人都是音频资深用户或者发烧级音乐玩家,而且在很多音频的专业效果处理上需涉及大量波形相关处理算法,这就直接把很多开发者拒之门外了,这也是为什么最后W3C推荐了 Web Audio API。

[Web Audio API]

Web Audio API最早是Chrome社区提出并支持的,Web Audio API 是一套全新的相对独立的接口系统,对音频文件拥有更高的处理权限以及内置相关的音频专业效果处理,可以完全独立于 <audio> 标签而存在。这里把内置相关音频专业效果处理标红主要是因为,我个人觉得这是Web Audio API相对于Audio Data API最大的一个区别,也是为什么最终被W3C推荐的原因。

大概整了一下Web Audio API的新特点:

  1. 更精准的时间控制;

  2. 可完全独立<audio>,允许更多音频文件同时播放,用于游戏或者复杂音频应用场景;

  3. 模块化路由连接方式,让音频操作更加灵活形象;

4.实时的频域、时域数据访问/操作;

  1. 更多专业的音频处理方法

(1) 音道分离/合并;

(2) 音频延时效果;

(3) 内置频率滤波器;

(4) 音频空间感效果以及多普勒效应模拟;

(5) 音频卷积运算(用于声场环境模拟);

(6) 自定义波形生成器;

(7) 波形非线性失真处理。

【Web Audio API】 — 那些年的 web audio的更多相关文章

  1. Web性能API——帮你分析Web前端性能

    前端性能统计必备api,有不知道的吗? 正文从这开始- 开发一个现代化的互联网网站是一项复杂的任务,需要各种职能的密切合作以应对用户日新月异的需求.其中,网页的性能直接决定了用户的体验,而随着新型客户 ...

  2. 【HTML5】Web Audio API打造超炫的音乐可视化效果

    HTML5真是太多炫酷的东西了,其中Web Audio API算一个,琢磨着弄了个音乐可视化的demo,先上效果图: 项目演示:别说话,点我!  源码已经挂到github上了,有兴趣的同学也可以去st ...

  3. H5的Web Audio Api

    概述 研究Web Audio Api的主要原因是:工作中需要在ios中实现声音的淡出效果,主要是通过setInterval来改audio标签的volume属性实现的,但是ios上面volume属性是只 ...

  4. Web Audio API之手把手教你用web api处理声音信号:可视化音乐demo

    1.Web Audio API 介绍 Web Audio API 提供了在Web上控制音频的一个非常有效通用的系统 ,这些通用系统通俗的讲就是我们可以利用Web Audio API提供的各种方法操作各 ...

  5. 关于HTML5音频——audio标签和Web Audio API各平台浏览器的支持情况

    对比audio标签 和 Web Audio API 各平台浏览器的支持情况:   audio element Web Audio API desktop browsers Chrome 14 Yes  ...

  6. [Javascript] Intro to the Web Audio API

    An introduction to the Web Audio API. In this lesson, we cover creating an audio context and an osci ...

  7. 关于Web Audio API的入门

    Web Audio API提供了一个简单强大的机制来实现控制web应用程序的音频内容.它允许你开发复杂的混音,音效,平移以及更多. 可以先看一下MDN的这篇文章<Web Audio API的运用 ...

  8. 使用Web Audio API绘制音波图

    摘要:Web Audio API是对<audio> 标签功能上的补充,我们可以用它完成混音.音效.平移等各种复杂的音频处理,本文简单的使用其完成音波图的绘制. PS:本例子使用ES6编程, ...

  9. HTML5 ——web audio API 音乐可视化(二)

    上一篇 web audio API 音乐可视化(一)介绍了一些基本的API,以及如何简单的播放一个音频,本篇介绍一下怎么对获取到的音频进行分析,并将分析后的数据绘制成图像. 最终效果请戳这里; 完整版 ...

  10. HTML5 ——web audio API 音乐可视化(一)

    使用Web Audio API可以对音频进行分析和操作,最终实现一个音频可视化程序. 最终效果请戳这里; 完整版代码请戳这里,如果还看得过眼,请给一个start⭐ 一.API AudioContext ...

随机推荐

  1. Seastar 教程(二)

    协程 注意:协程需要 C++20 和支持的编译器.已知 Clang 10 及更高版本可以工作. 使用 Seastar 编写高效异步代码的最简单方法是使用协程.协程没有传统continuation(如下 ...

  2. python如何data格式和时间戳的转换

    Python 获取几天前的时间 计算几天前并转换为指定格式. import time import datetime # 先获得时间数组格式的日期 threeDayAgo = (datetime.da ...

  3. Lua中如何实现类似gdb的断点调试--03通用变量修改及调用栈回溯

    在前面两篇01最小实现及02通用变量打印中,我们已经实现了设置断点.删除断点及通用变量打印接口. 本篇将继续新增两个辅助的调试接口:调用栈回溯打印接口.通用变量设置接口.前者打印调用栈的回溯信息,后者 ...

  4. Jmeter---压力模式

    需求 下面有3个场景,思考一下在jmeter里面如何设计 场景1:有一个项目,500用户同时登录,响应时间能达到多少场景2:考勤打卡,最大吞吐量能达到多少(每秒最大能完成多少笔打卡业务)场景3:银行业 ...

  5. 矩池云上安装及使用Milvus教程

    选择cuda10.1的镜像 更新源及拷贝文件到本地 apt-get update cp -r /public/database/milvus/ / cd /milvus/ cp ./lib/* /us ...

  6. 为什么不让用join?《死磕MySQL系列 十六》

    大家好,我是咔咔 不期速成,日拱一卒 在平时开发工作中join的使用频率是非常高的,很多SQL优化博文也让把子查询改为join从而提升性能,但部分公司的DBA又不让用,那么使用join到底有什么问题呢 ...

  7. 从零开始,开发一个 Web Office 套件(9):拖动鼠标选中文字 Edge Case

    这是一个系列博客,最终目的是要做一个基于 HTML Canvas 的.类似于微软 Office 的 Web Office 套件(包括:文档.表格.幻灯片--等等). 博客园:<从零开始, 开发一 ...

  8. 微信网页JSDK接口-wx.chooseImage问题

    wx.chooseImage({count: 1, // 默认9sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有sourceTy ...

  9. vue3-关于$props,$parents等引用元素和组件的注意事项

    同一个组件内可以使用,但是在不同的组件内,不要用$parents或$refs来访问另一个组件内的数据, 这会使代码的耦合性变高,同时也会让代码的可读性变差, 在不同组件访问数据时,使用props等来传 ...

  10. centos7升级openssh8.7&openssl1.1.1l脚本

    脚本下载地址或首页联系本人获取 https://files.cnblogs.com/files/blogs/705493/update_ssh.sh 需搭配openssh8.7和openssl1.1. ...