HTML5 Audio 在 iOS Safari 上的问题

最近接触一个移动短项目,做摇一摇的功能,然后摇的时候要有声音,摇中奖的时候也有声音,问题来了,iOS 5 不能用代码去触发播放声音,其实 Android 4.0+ 也有一样的问题,因为目前只折腾了 iOS,所以这里就以 iOS Safari 的情况为例,其他应该是类似的,大家可以自己验证。以下的 Safari 都是指 iOS 下的。

iOS Safari 中的 HTML5 媒体元素都是单例的,所以一次只能播放一个 HTML5 音频(和 HTML5 视频)流(估计是为了减少数据费用)。音频文件只能从用户触发的触摸(单击)事件加载,如果在 HTML 标记中使用了 autoplay 属性,那么 Safari 将会忽略这个属性,并且不会在加载页面时播放此文件,对于 preload 属性,Safari 同样会忽略。唯一能解决的就是用户进入页面是,让用户触发 touch 事件:

var shakeAudio = $('#shakeAudio')[0],

winAudio = $('#winAudio')[0]

$(document).on('touchstart', function() {

shakeAudio.load()

})

触发 load 事件后,当用户再摇一摇的时候边可以用 ShakeAudio.play() 播放声音。

咦,摇中奖的声音呢?如果在上面 ontouchstart 事件中加多个 winAudio.load(),那么 shakeAudio 播放不能,上面说了,他是一个单例,后面的会覆盖前面的。怎么办?最好的方法是使用 audio

sprite,将所有的音频综合到一个单音频流中,然后播放此流的各个部分。

当然,同样需要让用户先有一次 touch 事件触发,以加载该 audioSprite 音频:

var audioSprite = $('#audioSprite')[0],

audioData = {

shake: {

start: 0,

length: 1

},

win: {

start: 1.3,

length: 1.5

}

}

当播放 shake 的声音时:

audioSprite.currentTime = audioData.shake.start;

audioSprite.play();

// 添加当到达 sprite 的结尾时停止音频流的逻辑

var handler = function() {

if (this.currentTime >= audioData.shake.start + audioData.shake.length) {

this.pause()

}

}

audioSprite.addEventListener('timeupdate', handler, false);

播放 winAudio 同理。需要注意的是,更改 currentTime 并不是百分百正确的。假设 currentTime 设为 6.5,而实际得到的却是 6.7。每个 audio sprite 之间需要少量的空间,以避免寻找到另一个 sprite 的头部。

在访问任何 audio sprite 之前,务必确保整个音频流已加载,因为如果音频流没有完全加载,那么在想要访问已加载的流的任何一个部分时,那么这个流需要进行缓冲,而且还会在流加载过程中发生延时。

FYI: HTML5 Audio Behaviour and Support in iOS and Android

ios html5 录音功能,HTML5 Audio 在 iOS Safari 上的有关问题相关推荐

  1. php 返回mp3,当从PHP提供mp3时,audio.duration在Safari上返回Infinity

    所以,我有一个PHP脚本将我的mp3文件发送到html5的音频标签.问题是在Safari中,audio.duration标签不起作用并返回无穷大.如果我将音频的src直接设置到文件,一切正常.但我不希 ...

  2. 解决IOS微信中 HTML5 中audio的自动播放问题。

    2019独角兽企业重金招聘Python工程师标准>>> <!DOCTYPE html> <html lang="en"> <head ...

  3. ios html5不显示图片,为什么iOS上的Safari不显示我的HTML5视频海报?

    我有这个网页: http://healthpad.net/dashboard/ 它具有10< video>元素就可以了. 由于某些原因,当我在iPad上加载页面时,它不显示视频海报. 尝试 ...

  4. 用HTML5/CSS3/JS开发Android/IOS应用

    现在人人都想成为安卓/IOS应用开发工程师.其实,安卓/IOS应用可以用很多种语言来实现.由于我们前端开发工程师,对HTML5/CSS/JavaScript的网络编程已经相当熟悉了.所以,今天大家将会 ...

  5. html能播放wav,html – 在iOS Safari上播放WAV文件

    我很难将HTML页面上的WAV文件作为HTML5音频标签或通过移动Safari(iPad / iPhone)中的常规可下载链接播放: audio HTML5音频对象只显示无法播放音频文件,当我点击下载 ...

  6. HTML5 JS录音功能,简单介绍recorder.js 基于Html5录音功能的实现

    这篇文章主要介绍了recorder.js 基于Html5录音功能的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 recor ...

  7. iOS 录音功能的实现

    这两天也调了一下ios的录音,原文链接:http://www.iphoneam.com/blog/index.php?title=using-the-iphone-to-record-audio-a- ...

  8. ios开发跳转safari_阻止iOS Web APP中点击链接跳转到Safari 浏览器新标签页

    最近为了更好地接触移动Web 开发狠心购买了一台ipad mini(之前一直都是借同学的,借多了就不好意思了).拿来调试DeveMobile 与EaseMobile 主题 时候发现了不少问题,现在在一 ...

  9. ios运行html游戏,Html游戏 - IOS的​​Safari浏览器崩溃

    我正在运行一个HTML应用程序开发使用打字稿,pixi.js webgl,网络音频.Html游戏 - IOS的​​Safari浏览器崩溃 游戏在各种设备和浏览器上的windows和android上运行 ...

最新文章

  1. 核心动画的接触点滴(五)
  2. 开源项目_可能使用到的开源项目集合
  3. 关于火狐中ashx中输出javascript一闪而过的问题
  4. python预处理c语言_详解C语言编程中预处理器的用法
  5. 【KVM系列01】KVM简介及安装
  6. windows-vscode编写c/c++(适用日期2020-5月的vscode)--简洁版(下载gdb.exe)
  7. jquery ajax跨域访问webservice配置
  8. 前端学习(1034):jquery插件-全屏滚动
  9. java单元测试面试,Java必备!JUnit面试题和答案汇总
  10. beginnersbook C 语言教程·翻译完成 | ApacheCN
  11. 【熵】熵,KL散度,交叉熵,最大熵模型
  12. 服务器的svnserver修改密码
  13. 100道MySQL数据库经典面试题解析(收藏版)
  14. Flask 与 Django 框架对比
  15. 新的Steam控制器,ScummVM上的Sherlock Holmes以及更多开放游戏新闻
  16. mr.baidu.com百度官方缩短网址接口网站调用生成制作方法解析
  17. 用java在画布上画心形线_Java画心形线
  18. SAP 银企直连交易明细查询的分页与FTP读取
  19. python爬虫之scrapy初试与抓取链家成交房产记录
  20. LikeLib区块链底层公链技术应用

热门文章

  1. 即将毕业的大四学生感言
  2. 扫码比价APP隐私政策
  3. 如何在微信内外部唤起微信小程序相关说明
  4. UG11.0-8.5压铸模具流道设计视频教程 包渣设计教程
  5. NL-Mean和BM3D去噪原理
  6. 压滤机入料泵的安装以及试运行要领
  7. gRPC 快速体验 (2):Streaming RPC
  8. Unity2D入门(九):敌人的移动、消灭敌人(包括动画的触发)
  9. 用C++ 封装linux下的互斥锁MutexLock和条件变量Condition
  10. 学习日志day69(2021-11-09)(1、hosts文件修改主机域名 2、安装Nginx 3、nginx的应用场景)