Audio在移动端的兼容性问题(1)

一直想开通一个blog,但是由于工作太忙(此处写给领导看),还有自己的有三个原因,一是懒,二是懒,三是懒,把这个事情耽搁了,然后直到今天。

那我们直接进入今天的主题。因为最近广告项目里面有个需求,要在移动端用web的HTML5中的Audio来实现音频播放。之前做过PC端的音频播放器,移动端的接触的不是很深入。然后我跌入了一个接一个的坑,在这里我做个记录,种棵树给后面的人乘凉~

需求

做一个SPA的web互动测试游戏。题目是自动切换播放的音频,根据音频内容选择正确选项。

兼容移动端的微信,APP,浏览器和PC端的主流浏览器。

准备

第一步,我们先查看兼容性,打开Can I Use,CanIUse提供了各种浏览器所能支持的桌面和移动端网络前端Web技术,可以提高网站开发人员的工作效率(官方解释哈,不过这个工具确实不错,建议收藏)。

下面是关于audio兼容性图表:

compatibility

可以看到,在移动端上用Audio是完全可行的(理论上是这样,实际操作你们懂的)。

第二步,我们查看下的开发文档关于Audio标签的描述。

event
function
property

入坑

基础的就不多说了,前端采用zepto.js框架,实现的一个单页面测试,后端用了thinkphp框架,调用了微信获取用户信息接口等,数据库采用的是MySql。

问题

1.音频自动播放问题;2.音频预加载的问题;3.多个音频文件切换问题;4音频文件暂停和播放操作间隔时间问题;

audio-property

今天我们只说音频控件,对于视频控件后面整理。上面的图片展示了音频标签的属性,pc端主流浏览器下,这些属于都是支持的,BUT!移动端有的就扯蛋了~

1.音频自动播放问题;

这是我在PC端的谷歌模拟器下调试成功后,移动端调试遇到的第一个问题。PC端耍的好好的,到手机上突然没了声音,这尼玛好蛋疼,好想骂娘,突然感觉到人生好艰难~~~但是再难也要走下去,平复心情,解决问题~~在网上查了资料后,这个问题能够解决,但是无法完美。

关于音频自动播放属性autoplay的问题,目前分为三大类:

一,支持audio的autoplay,大部分安卓手机的自带浏览器和微信(无需特殊处理);

二,不支持audio的autoplay,部分的IOS手机的微信(解决方案下面提供);

三,不支持audio的autoplay,部分的安卓手机的自带浏览器(比如小米)和全部的IOS safari浏览器(这种只能做用户触屏时触发播放了)。

以前的IOS是支持音频自动播放的,但是在IOS4.2.1版本之后,苹果不支持自动播放,网上查了下发现IOS上禁止了Audio的Autoplay属性,原因如下:

User Control of Downloads Over Cellular Networks

In Safari on iOS (for all devices, including iPad), where the user may be on a cellular network and be charged per data unit, preload and autoplay are disabled. No data is loaded until the user initiates it. This means the JavaScript play() and load() methods are also inactive until the user initiates playback, unless the play() or load() method is triggered by user action. In other words, a user-initiated Play button works, but an onLoad="play()" event does not.

OK,找到问题根源了,我们开始入手解决,安卓端主流手机都支持,所以不需要处理;IOS微信里面不能自动播放,微信做了很好的支持,调用微信的“WeixinJSBridgeReady”方法;IOS的safari浏览器下,只有用触屏播放的变通方法处理了。代码如下:

functionaudioAutoPlay(id){

varaudio = document.getElementById(id),

play =function(){

audio.play();

document.removeEventListener("touchstart",play,false);

};

audio.play();

document.addEventListener("WeixinJSBridgeReady",function() {

play();

},false);

document.addEventListener('YixinJSBridgeReady',function() {

play();

},false);

document.addEventListener("touchstart",play,false);

}

audioAutoPlay('myAudio');

2.音频预加载的问题;

IOS Safari 中和微信是不支持preload属性的,和autoplay一样。我靠!要你们有啥用~

即便是 HTML markup中使用了preload属性,IOS仍会忽视此属性,并且不会加载此文件,除非由用户触摸事件触发(这样很low)。

3.多个音频文件切换问题;

因为测试的每到题目都涉及到一个音频文件播放,IOS下面音频切换出现了播放不了的问题。

一开始我的页面结构如下:

音频切换问题代码

我把整个Audio进行了循环,PC和安卓上,这种方式是都可以播放的,IOS下不能播放。后来我把页面结构改成只放一个Audio,然后把所有的音频地址放进数组,循环播放。就OK了...后来我查了些资料,分析了原因可能如下(以后有时间等我做更多测试):

var audio1 = document.getElementById('audio1');

var audio2 = document.getElementById('audio2');

audio1.play();

// at a later time

audio2.play();

// there will be a few-seconds delay as iOS is instantiating a new audio object.

// at an even later time

audio1.play(); // there will also be a few-seconds delay, as the audio object

// for audio1 in iOS was destroyed when we played audio2.

在切换音频对象时的 HTML5 音频延时,调用play()在默认情况下会失败,如果在将要加载但尚未载入其元数据的音频流上尝试设置currentTime,则会抛出一个致命错误。音频文件不能缓存在 iOS 上的移动版 manifest 中。只有在对某个离线应用程序使用清单 (manifest) 时,这才适用。如果一个音频文件包含在此清单中,iOS 将会忽略它,并且不会缓存此文件。每当此 Web 应用程序需要访问此音频文件时,都需要从该网络访问此文件。

用 JavaScript 以编程方式进行相关设置时,移动版 Safari 并不会尊重此音量和playbackRate属性。更改属性也不会实际调整这些值。音量总是在用户控制下,并且playbackRate在移动版 Safari 中仍然不受支持。音量总是保持设置为 1,playbackRate则会设置为希望设置的新值,但是音频流回放的实际速度不会发生改变。这会为onratechange事件带来某些复杂性,我们将在不受支持的事件部分对此进行讨论。

在 iOS 5 之前,循环属性是不受支持的。为了解决缺乏支持的问题,可以向onended事件添加了一个事件侦听程序,并在该函数中调用play()。

4音频文件暂停和播放操作间隔时间问题;


谷歌模拟器截图


问题图样

上面三个问题解决了,测试基本没有问题。但是打开谷歌的模拟器看到了一个报错,“The play() request was interrupted by a call to pause()”,虽然不影响程序功能,但是身为处女座的我,这个红色的一栏我不能忍,于是我找到如下方法解决:

var isPlaying = myaudio.currentTime > 0 && !myaudio.paused && !myaudio.ended && myaudio.readyState > 2;

if (!isPlaying) {

setTimeout(function () {

myaudio.play().catch(function (e) {

console.log("", e.message);

console.log("", e.description);

});

}, 150);

} else {

alert("网络缓慢,正在加载音频...");

}

先判断音频加载状态等,然后用setTimeout延时处理播放,把抛出的异常接收~然后整个测试就几乎完美~

问题三还有种更优雅的解决办法,那就是用Audio sprite,它的原理类似于CSS sprite,就是把所有音频放入一个音频文件里,根据不同的判断,播放不同的片段~~ 这个是国外的DEMO。有兴趣的同学可以尝试下~

未完待续,今天暂时就这样吧~  下班了~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容