HTML5 audio API的研究与学习1

HTML5 audio

1.audio sprite

音频精灵的主要思想其实跟css精灵差不多,将一个音频合成到一个音频,然后通过currentTime获取当前播放时间进行区分,不过在这里执行以下代码之前需将audio

先加载到页面当中。当时怎么判断页面已经加载完声音呢,在移动端audio的很多属性支持的都不是很好,在尝试了很多也在网上找了很多资料之后,暂且发现可以使用AudioContext对象去管理与播放声音

<input type="button" value="加载声音" id="button" onclick="loadSound()" />
    <audio src="smbb.mp3" id="audio1"></audio>
    <br/><br/><br/>
    <input type="button" value="播放" id="play"/> 
var audioSprite = document.getElementById("audio1");
                    audioData = {
                        shake: {
                            start: 0,
                            length: 10
                        },
                        win: {
                            start: 15,
                            length: 15
                        }
                    }
                    document.getElementById("play").addEventListener("click", function () {
                        audioSprite.play()
                        audioSprite.currentTime = audioData.shake.start;
                        //audioSprite.play();
                    }, false);
                    var handler = function () {
                        if (this.currentTime >= audioData.shake.start + audioData.shake.length) {
                            this.pause();
                            setTimeout(function () {
                                audioSprite.removeEventListener("timeupdate", handler, false);
                                audioSprite.currentTime = audioData.win.start;
                                audioSprite.play();
                                audioSprite.addEventListener("timeupdate", handler2, false);
                            }, 1000);
                        }
                    }

                    var handler2 = function () {
                        if (this.currentTime >= audioData.win.start + audioData.win.length) {
                            this.pause();
                        }
                    }
                    audioSprite.addEventListener("timeupdate", handler, false);

2.利用AudioContext,为了生成一个声音,需要创建一个或多个声音源,并且通过AudioContext对象将这些声音源连接在一起,这些声音源并不是直接连接,而是通过多个用于对音频信号的各种模块进行处理的AudioNodes对象间接连接.

一个AudioContext对象可以支持多个音频输入,可以支持音频图的生成,所以在一个音频处理应用程序中我们只需创建一个AudioContext对象

<span style="white-space:pre">	</span>var context;
        if(webkitAudioContext){
            context = new webkitAudioContext();
        }else{
            context = new AudioContext();//标准
        }

2.1在创建了AudioContext对象之后,我们可以使用AudioBuffer对象加载音频数据。以上有个加载声音的按钮,我们通过点击该按钮后使用XMLHttpRequest对象获取服务器端的MP3文件中的音频数据。以下实例:

function loadSound() {
            var request = new XMLHttpRequest();
            request.open("GET", "smbb.mp3", true);
            request.responseType = "arraybuffer";
            request.onload = function () {
                context.decodeAudioData(request.response, function (buffer) {
                    console.log(buffer)
                }, onError);
            }
            request.send();
        }

        function onError(e) {
            console.log(e);
        }

在以上代码中用户点击“加载声音”按钮,执行javascript脚本代码中的loadSound函数,在该函数中,使用XMLHttpRequest对象获取服务器端的MP3文件中的音频数据,因为音频数据是二进制数据,所以讲XMLHttpRequest对象的responseType属性值设为“arraybuffer”。当接受到服务器的MP3文件中未解码的音频数据时,可以使用AudioContext对象的decodeAudioData方法将其解码。

AudioContext对象的decodeAudioData方法使用三个参数,其中第一个为一个加载了未解码的音频数据的ArrayBuffer对象,第2,3个参数都为一个函数,代表音频数据的解码处理执行成功时执行的回调函数与音频数据的解码处理执行失败时执行的回调函数.

2.2当音频加载完成之后我们就可以通过AudioBuffer对象的createBufferSource对象创建一个AudioBufferSourceNode对象(代表音频播放设备的声音源),并且将AudioBufferSourceNode对象的buffer属性值指定为AudioBuffer对象,代码如下

var source = context.createBufferSource();
    source.buffer = buffer;

该buffer为上面例子decodeAudioData返回的buffer。

接下来,我们需要使用AudioBufferSourceNode对象的connect方法将声音源连接到AudioContext对象的destination属性值(代表音频播放设备)。

source.connect(context.destination);

AudioBufferSourceNode对象的connect方法使用一个参数,参数值为AudioContext对象的destination属性值,该属性值为客户端计算机上的音频播放设备

最后使用AudioBufferSourceNode对象的start方法播放声音

source.start(0)//备注:之前网上跟书上很多位置都是说使用noteOn方法,当时,我测试该方法未定义。使用start()方法可以播放,当时测试在IOS系统中如果start方法不传参数,该方法也是未定义,后来发现必须得给一个默认得参数。

现阶段的整个代码

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
    <!--,minimal-ui-->
    <!--<meta name=”apple-mobile-web-app-capable” content=”yes” />
    <meta name=”apple-mobile-web-app-status-bar-style” content=”black-translucent” />-->
    <title>声音加载处理封装到一个类中</title>
</head>

<body style="height:600px">
    <input type="button" value="加载声音" id="button" onclick="loadSound()" />
    <audio src="smbb.mp3" id="audio1"></audio>
    <br/><br/><br/>
    <input type="button" value="播放" id="play"/>
    <script>
        var audioBuffer = null;
        var context;
        if(webkitAudioContext){
            context = new webkitAudioContext();
        }else{
            context = new AudioContext();
        }
         //加载音频数据
        function loadSound() {

            var request = new XMLHttpRequest();
            request.open("GET", "smbb.mp3", true);
            request.responseType = "arraybuffer";
            request.onload = function () {
                context.decodeAudioData(request.response, function (buffer) {
                    /*var audio = new Audio();
                         audio.src="smbb.mp3";
                         audio.play();*/
                    var audioSprite = document.getElementById("audio1");
                    audioData = {
                        shake: {
                            start: 0,
                            length: 10
                        },
                        win: {
                            start: 15,
                            length: 15
                        }
                    }
                    document.getElementById("play").addEventListener("click", function () {
                        audioSprite.play()
                        audioSprite.currentTime = audioData.shake.start;
                        //audioSprite.play();
                    }, false);
                    var handler = function () {
                        if (this.currentTime >= audioData.shake.start + audioData.shake.length) {
                            this.pause();
                            setTimeout(function () {
                                audioSprite.removeEventListener("timeupdate", handler, false);
                                audioSprite.currentTime = audioData.win.start;
                                audioSprite.play();
                                audioSprite.addEventListener("timeupdate", handler2, false);
                            }, 1000);
                        }
                    }

                    var handler2 = function () {
                        if (this.currentTime >= audioData.win.start + audioData.win.length) {
                            this.pause();
                        }
                    }
                    audioSprite.addEventListener("timeupdate", handler, false);
                }, onError);
            }
            request.send();
        }
        function onError(e) {
            console.log(e);
        }
    </script>
</body>

</html>

总结,HTML5的audioAPI功能确实很强大,研究起来也很有意思,不过暂且技术部到家,在琢磨的时候耗费的时间也不少,当然肯定也有漏洞,说的不对的地方还请见谅,下阶段还有更有意思的控制播放节奏,多个声音的交叉混合及多个声音文件之间的平滑过渡。。。

时间: 2024-10-13 12:36:30

HTML5 audio API的研究与学习1的相关文章

HTML5 audio API事件

audio API 事件 play() 视频播放 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>audio</title> <style> audio{ width:500px; } </style> </head> <body> <input ty

HTML5项目笔记4:使用Audio API设计绚丽的HTML5音乐播放器

HTML5 有两个很炫的元素,就是Audio和 Video,可以用他们在页面上创建音频播放器和视频播放器,制作一些效果很不错的应用. 无论是视屏还是音频,都是一个容器文件,包含了一些音频轨道,视频轨道和一些元数据,这些是和你的视频或者音频控件绑定到一块的,这样才形成了一个完整的播放组件. 浏览器支持情况: 浏览器 支持情况 编解码器 Chrome 3.0 Theora . Vorbis .Ogg H.264 . AAC .MPEG4 FireFox 3.5 Theora . Vorbis .Og

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

HTML5真是太多炫酷的东西了,其中Web Audio API算一个,琢磨着弄了个音乐可视化的demo,先上效果图: 项目演示:别说话,点我!  源码已经挂到github上了,有兴趣的同学也可以去star或者fork我,源码注释超清楚的哦~~之前看刘大神的文章和源码,感觉其他方面的内容太多了,对初学者来说可能一下子难以抓到Web Audio API的重点,所以我就从一个初学者的角度来给大家说说Web Audio API这些事吧. Web Audio API与HTML5提供的Audio标签并不是同

使用Audio API设计绚丽的HTML5音乐播放器

HTML5 有两个很炫的元素,就是Audio和 Video,可以用他们在页面上创建音频播放器和视频播放器,制作一些效果很不错的应用. 无论是视屏还是音频,都是一个容器文件,包含了一些音频轨道,视频轨道和一些元数据,这些是和你的视频或者音频控件绑定到一块的,这样才形成了一个完整的播放组件. 浏览器支持情况: 浏览器 支持情况 编解码器 Chrome 3.0 Theora . Vorbis .Ogg H.264 . AAC .MPEG4 FireFox 3.5 Theora . Vorbis .Og

Web Audio API DEMO

一转眼就已经有三个月没写博客了,毕业季事情确实多,现在也终于完全毕业了,博客还是不能落下.偶尔还是要写一下. 玩HTML5的Audio API是因为之前看到博客园里有关于这个的博客,觉得挺好玩的,所以就学习了一下.本文仅作为自己的学习记录.如有错误之处请指出.   最终的效果也就如右图,楼主只是简单的做了个demo,如果要有更复杂的效果,园友们可以自己去玩一下 DEMO链接:请戳我!!!   选择音频文件后即可播放 同时,这个API目前浏览器支持度不高,若要用于生产环境,请自行斟酌. 首先,要做

html5 audio总结

前言 html5中对音频,视频播放原生支持.最近做了一个音乐播放器,得益于快过年了,才能抽出一点时间来总结一下.总的来说,html5对audio的支持非常强大, 难怪flash要死.浏览器上装播放插件的时代已经接近尾声了.目前大多数浏览器都支持了大部分常用的api,ie8及其以前除外(万恶的ie啊). HTML5 音频虽然很健壮,但有其局限性,这主要取决于它的实现.对于音乐播放器(点唱机播放器)或简单的声音效果,它很有效,但是对于声音密集的应用程序如游戏,它的表现不是很理想.所以有了Web Au

HTML5 程序设计 - 使用HTML5 Canvas API

请你跟着本篇示例代码实现每个示例,30分钟后,你会高喊:“HTML5 Canvas?!在哥面前,那都不是事儿!” 呵呵.不要被滚动条吓到,很多都是代码和图片.我没有分开写,不过上面给大家提供了目录,方便查看. 学习笔记,纯手工码字,有错别字什么的请指出,觉得好的请点个赞小小的支持下.谢谢亲们. 本篇,我们将探索如何使用HTML5和Canvas API.Canvas API很酷,可以通过它来动态生成和展示图形.图表.图像以及动画. 本篇将使用渲染API(Rendering API)的基本功能来创建

ASP.NET Core环境Web Audio API+SingalR+微软语音服务实现web实时语音识别

处于项目需要,我研究了一下web端的语音识别实现.目前市场上语音服务已经非常成熟了,国内的科大讯飞或是国外的微软在这块都可以提供足够优质的服务,对于我们工程应用来说只需要花钱调用接口就行了,难点在于整体web应用的开发.最开始我实现了一个web端录好音然后上传服务端进行语音识别的简单demo,但是这种结构太过简单,对浏览器的负担太重,而且响应慢,交互差:后来经过调研,发现微软的语音服务接口是支持流输入的连续识别的,因此开发重点就在于实现前后端的流式传输.参考这位国外大牛写的博文Continuou

[转载]html5 audio音频播放全解析——html5系列

序 html5开启了一个新时代,因为它让浏览器本身变得不那么被动,audio api就是一个典型的列子,在html5还没确定之前,如果想要在听音乐看视频唯一的办法就是用flash意思是当你没有给浏览器装载Flash插件的话 那么音乐视频即是空谈,html5 audio的出现改变了这一格局,因为你可以不用Flash插件就可以听音乐看视频,当然这些能否实现还跟你用的浏览器有关. 这是demo地址 http://www.feman.cn/h5/audio.html 在手机上浏览效果会更好 文章结构 1