前言

  html5中对音频,视频播放原生支持.最近做了一个音乐播放器,得益于快过年了,才能抽出一点时间来总结一下.总的来说,html5对audio的支持非常强大, 难怪flash要死.浏览器上装播放插件的时代已经接近尾声了.目前大多数浏览器都支持了大部分常用的api,ie8及其以前除外(万恶的ie啊).

  HTML5 音频虽然很健壮,但有其局限性,这主要取决于它的实现。对于音乐播放器(点唱机播放器)或简单的声音效果,它很有效,但是对于声音密集的应用程序如游戏,它的表现不是很理想。所以有了Web Audio API (Chrome) 和 Audio Data API (Firefox) 无需任何浏览器插件即可进行合成和动态处理音频的能力来帮助人们解决特性缺失的问题.Web Audio与audio标签不同,它给了开发者对音频数据进行处理、分析的能力,例如混音、过滤等,类似于对音频数据进行PS。一般的网站应用应该是用不倒这些API中的,但是一些游戏引擎或者在线音乐编辑等类型的网站应该用得到。请参考文章最后的参考资料.

兼容情况

可见除了ie6,7,8 和opera,其他都支持了.其中安卓在2.1就已经支持了.audio的兼容性还是不错的,当然这只是audio标签.JavaScript接口的支持情况就各不相同了,可能会遇到坑.

API

本来想贴上audio的api,后来发现太多了,就放弃了.有很多都是不常用的.我们这里就讨论几个常用的api和属性.

详情请参考w3c http://www.w3school.com.cn/tags/html_ref_audio_video_dom.asp

总结的过程中也发现audio和video的api是一模一样的.这也方便了广大开发者的学习使用.

重要方法

  • 这3个方法是最基础的了,看方法名就知道是干嘛用的了.其中load方法,一般是在改变audio的一些属性后,需要重新加载的情况下使用.

重要属性

  • autoplay 设置是否自动播放音频/视频,ios的Safari下不能自动播放,需要和用户交互后才能播放,这是个坑,后面会详细说.
  • buffered 会返回一个TimeRanges对象,包含一个起点和终点时间,如果用户拖动音频/视频,则有多个buffer区间,可以通过index访问指定buffer区间.

  • currentTime 是非常重要的一个属性了,可以返回当前的播放位置(以秒计),同时也可以设置播放位置,跳跃播放音频.

  • played 返回已经播放部分的TimeRanges对象,可以用于做一些计算

  • seekable 表示用户当前可以跳跃观看的以缓冲部分区间
  • src 音频/视频资源地址

  • volume 控制音量

重要事件

  • 加载过程的事件流对我们做一些特殊处理是很有帮助的

  • canplay 加载ok,可以播放时触发,一般逻辑都从这里开始
  • canplaythrough 当全部加载完毕时触发

  • 正在下载时触发,配合buffered属性更新加载进度条的逻辑就可以放在这里

  • 用户跳跃播放时触发

  • 当前播放位置改变时触发,更新播放时间,同步歌词的逻辑都可以放在这里

封装audio

  从audio提供的api来说,已经非常强大和完善了.如果是在移动端,我们完全可以尽可能的使用原生api,没必要使用第三方库.我简单封装了一下audio,尽可能的保持原生api的最大灵活性前提下,减少我们的代码量.

js代码

;(function(){

    var _init = function(){
var audio = this.audio = document.createElement('audio');
for( var prop in this.audioProp ){
audio[prop] = this.audioProp[prop];
}
document.body.appendChild(audio);
}; var _bindEvt = function(){
var audio = this.audio,
audioEvt = this.audioEvt;
for( var func in audioEvt ){
audio.addEventListener(func,audioEvt[func].bind(this),false);
}
}; var _extend = function(o1,o2){
for(var attr in o2) {
o1[attr] = o2[attr];
}
return o1;
}; /*
* 构造函数
*/
function Constructor(opton){
opton = _extend({
audioProp : { },
audioEvt : { },
cssSelector : { } },opton); _extend(this,opton);
_init.call(this);
_bindEvt.call(this);
} _extend(Constructor.prototype,{
/*
* 播放
* second 指定当前的播放时间
*/
play : function(second){
second && (this.audio.currentTime = second);
this.audio.play();
}, /*
* 暂停
* second 指定当前的播放时间
*/
pause : function(second){
second && (this.audio.currentTime = second);
this.audio.pause();
}, /*
* 时间格式化
* 00:00
*/
timeFormat : function timeFormat(number) {
var minute = parseInt(number / 60);
var second = parseInt(number % 60);
minute = minute >= 10 ? minute : "0" + minute;
second = second >= 10 ? second : "0" + second;
return minute + ":" + second;
} }); //兼容amd,cmd,原生js接口
if(typeof module !== 'undefined' && typeof exports === 'object' && define.cmd){
module.exports = Constructor;
}else if(typeof define === 'function' && define.amd){
define(function(){
return Constructor;
});
}else{
window.APlayer = Constructor;
} })();

html代码

        var music = new APlayer({
audioProp : {
title : '给我一个理由忘记',
loop : true,
src : "https://ss1.baidu.com/8aQDcnSm2Q5IlBGlnYG/stat/ogg/xinsui.mp3",
},
audioEvt : {
canplay : function(){
},
timeupdate : function(){
$('.currentTime').html(this.timeFormat(this.audio.currentTime));
}
} }); $(".play").on("touchend",function(){
music.play();
});
$(".pause").on("touchend",function(){
music.pause(5);
});

详情可以看我的github   https://github.com/Alan110/desire/tree/master/APlayer

坑爹集锦

编程总不会这么一帆风顺,莫名其妙的问题总是不会少的.下面就罗列一下我遇到的坑吧.

  1.  安卓uc浏览器下,对timeupdate事件支持不好,只会很少的触发几次.这是什么概念,就是说我们基本上不能同步当前的播放时间和进度条了,还有歌词.

    解决方案:暂时没有

  2.  在ios,Safari下,不能自动播放,autoplay,preload属性无效. 或者audio.src='xx' , 加载完后手动调用audio.play()也是不行的.

    原因: 在ios,Safari下要求与用户交互后才加载歌曲,播放歌曲,如touchstart , touchend , click等事件.

    解决方案 : 在iphone4下touchstart无效, 目测是因为性能不够无法捕捉. 改用touchend就好了

  3.  ios,Safari同一时间只能播放但音频/视频

    解决方案 : 使用 audio sprite 是满足移动 Safari 中多音效需求的最佳解决方案。与 CSS image sprite 类似,audio sprite 可以将所有的音频综合到一个音频流.要注意的是更改 currentTime 并不是百分百正确的。

           将 currentTime 设为 6.5,而实际得到的却是 6.7 或 6.2。每个 A sprite 之间需要少量的空间,以避免寻找到另一个 sprite 的尾部。

// audioSprite has already been loaded using a user touch event
var audioSprite = document.getElementById('audio');
var spriteData = {
meow1: {
start: 0,
length: 1.1
},
meow2: {
start: 1.3,
length: 1.1
},
whine: {
start: 2.7,
length: 0.8
},
purr: {
start: 5,
length: 5
}
}; // play meow2 sprite
audioSprite.currentTime = spriteData.meow2.start;
audioSprite.play();

    记得播放完毕手,要手动停止

var handler = function() {
if (this.currentTime >= spriteData.meow2.start + spriteData.meow2.length) {
this.pause();
}
};
audioSprite.addEventListener('timeupdate', handler, false);

音频在低版本浏览器中的兼容

现代浏览器基本上都支持audio了,老版本的浏览器,如ie8及其以前的.兼容方案多是用flash来播放音频/视频.在页面中嵌入embed标签,或者object标签,来调用flash插件.

网上找了2段代码,手中无ie浏览器并不确定是否可用,看到的朋友慎重使用

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0" width="1" height="1">

  <param name="movie" value="flash/music.swf" />

  <param name="quality" value="high" />

  <embed src="flash/music.swf" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="1" height="1"></embed>

</object>
if(navigator.userAgent.indexOf("Chrome") > -1){
如果是Chrome:
<audio src="" type="audio/mp3" autoplay=”autoplay” hidden="true"></audio>
}else if(navigator.userAgent.indexOf("Firefox")!=-1){
如果是Firefox:
<embed src="" type="audio/mp3" hidden="true" loop="false" mastersound></embed>
}else if(navigator.appName.indexOf("Microsoft Internet Explorer")!=-1 && document.all){
如果是IE(6,7,8):
<object classid="clsid:22D6F312-B0F6-11D0-94AB-0080C74C7E95"><param name="AutoStart" value="1" /><param name="Src" value="" /></object>
}else if(navigator.appName.indexOf("Opera")!=-1){
如果是Oprea:
<embed src="" type="audio/mpeg" loop="false"></embed>
}else{
<embed src="" type="audio/mp3" hidden="true" loop="false" mastersound></embed>
}

window.HTMLAudioElement  可以通过这个属性来判断是否支持audio

另外一个解决方案就是使用第三方库了,这里推荐一个库jplayer,据说是支持ie7+和其他的浏览器

jplayer中文文档

总结

过年啦,祝大家新年快乐!  2016年希望我能成长得更多.

参考资料

    

html5 audio总结的更多相关文章

  1. Three.js + HTML5 Audio API 打造3D音乐频谱,Let’s ROCK!

    继续玩味之前写的音乐频谱作品,将原来在Canvas标签上的 作图利用Three.js让它通过WebGL呈现,这样就打造出了一个全立体感的频谱效果了. 项目详情及源码 项目GitHub地址:https: ...

  2. HTML5 Audio/Video 标签,属性,方法,事件汇总

    HTML5 Audio/Video 标签,属性,方法,事件汇总 (转) 2011-06-28 13:16:48   <audio> 标签属性:src:音乐的URLpreload:预加载au ...

  3. 开大你的音响,感受HTML5 Audio API带来的视听盛宴

    话说HTML5的炫酷真的是让我爱不释手,即使在这个提到IE就伤心不完的年代.但话又说回来,追求卓越Web创造更美世界这样高的追求什么时候又与IE沾过边儿呢?所以当你在看本文并且我们开始讨论HTML5等 ...

  4. HTML5 Audio and Video 的新属性简介

    前言:HTML5 中 Audio and Video的使用方法比较简单,但就是比较复杂,方法属性多.如果不常用的几乎难以记住,甚至有些人难以区分不同属性和方法的作用,更别说应用了.以下对Audio a ...

  5. HTML5 Audio and JavaScript Control

    IE8 以下无效 <!DOCTYPE html> <html> <head> <meta content="text/html; charset=u ...

  6. [jPlayer] HTML5 Audio & Video for jQuery

    ---------------------------------------------------------------------------------------------------- ...

  7. html5 audio音频播放全解析

    序 html5开启了一个新时代,因为它让浏览器本身变得不那么被动,audio api就是一个典型的列子,在html5还没确定之前,如果想要在网页上听音乐看视频唯一的办法就是用flash意思是当你没有给 ...

  8. Html5 audio stop

    //html5 stop audio play function stopPlay(el){ el.pause(); el.currentTime = 0; } 使用: var el = docume ...

  9. HTML5 <Audio/>标签Api整理(二)

    1.实例2: 相对较完整 Html代码: <style> #volumeSlider .slider-selection { background:#bababa; } </styl ...

  10. Using HTML5 audio and video

    From:https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Using_HTML5_audio_and_video Using HTML5 ...

随机推荐

  1. [C#] async 的三大返回类型

    async 的三大返回类型 序 博主简单数了下自己发布过的异步文章,已经断断续续 8 篇了,这次我想以 async 的返回类型为例,单独谈谈. 异步方法具有三个可让开发人员选择的返回类型:Task&l ...

  2. 隐马尔科夫模型python实现简单拼音输入法

    在网上看到一篇关于隐马尔科夫模型的介绍,觉得简直不能再神奇,又在网上找到大神的一篇关于如何用隐马尔可夫模型实现中文拼音输入的博客,无奈大神没给可以运行的代码,只能纯手动网上找到了结巴分词的词库,根据此 ...

  3. Angular2开发笔记

    Problem 使用依赖注入应该注意些什么 服务一般用来做什么 指令一般用来做什么 angular2如何提取公共组件 angular2为什么不需要提公共组件 父组件与子组件之间如何通讯 什么时候应该使 ...

  4. UE4新手引导之下载和安装虚幻4游戏引擎

    1) 进入虚幻4的官方主页(https://www.unrealengine.com/) 这里你可以获得关于虚幻4的最新资讯,包括版本更新.博客更新.新闻和商城等.自2015年起,该引擎已经提供免费下 ...

  5. Kooboo CMS技术文档之二:Kooboo CMS的安装步骤

    在IIS上安装Kooboo CMS Kooboo CMS安装之后 安装的常见问题 1. 在IIS上安装Kooboo CMS Kooboo CMS部署到正式环境相当简单,安装过程是一个普通MVC站点在I ...

  6. SDWebImage源码解读 之 NSData+ImageContentType

    第一篇 前言 从今天开始,我将开启一段源码解读的旅途了.在这里先暂时不透露具体解读的源码到底是哪些?因为也可能随着解读的进行会更改计划.但能够肯定的是,这一系列之中肯定会有Swift版本的代码. 说说 ...

  7. Mysql基础代码(不断完善中)

    Mysql基础代码,不断完善中~ /* 启动MySQL */ net start mysql /* 连接与断开服务器 */ mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权限 ...

  8. 体验报告:微信小程序在安卓机和苹果机上的区别

    很多人可能会问:微信小程序和在微信里面浏览一个网页有什么区别? 首先,小程序的运行是全屏的,界面跟进入了一个APP很像,更为沉浸跟在微信里面访问h5不一样:其次,它的浏览体验更为稳定. 不过,这还不够 ...

  9. Android之SAX解析XML

    一.SAX解析方法介绍 SAX(Simple API for XML)是一个解析速度快并且占用内存少的XML解析器,非常适合用于Android等移动设备. SAX解析器是一种基于事件的解析器,事件驱动 ...

  10. Linux-Rhel6 恢复误删文件

    需要工具extundelete(可通过xshell上传下载到linux)知识点:ifconifig eth0             查看ipfdisk /dev/sda          管理磁盘m ...