之前写过一篇同样关于Cocos2d-JS H5的音频播放相关的文章: DOMException: play() can only be initiated by a user gesture(Cocos2d-JS HTML5),其中提到了移动端上H5的声音播放需要在用户操作后且必须在操作后一定时间内的问题,这次记录的问题也与此问题有关,直接现象为Cocos2d-JS(我用的3.13 lite版,通过js-builder获取:http://www.cocos2d-x.org/filecenter/jsbuilder,本文所描述问题可能仅与此版本相关!)的H5游戏在

会话类型

说明

是否要求输入

是否要求输出

是否遵从静音键

AVAudioSessionCategoryAmbient

混音播放,可以与其他音频应用同时播放

AVAudioSessionCategorySoloAmbient

独占播放

AVAudioSessionCategoryPlayback

后台播放,独占

AVAudioSessionCategoryRecord

录音模式

AVAudioSessionCategoryPlayAndRecord

播放和录音,此时可以录音也可以播放

AVAudioSessionCategoryAudioProcessing

硬件解码音频,此时不能播放和录制

AVAudioSessionCategoryMultiRoute

多种输入输出,例如可以耳机、USB设备同时播放

而实际上

Respect the physical mute switch on Mobile devices. We recommend using the

而实际测试发现通过cc.audioEngine.playMusic播放的BGM并不会响应静音键,而且仔细观察后发现,这种方式播放的游戏背景音乐会被当做音乐播放器播放的音乐处理,在iOS的下拉菜单中能看到有音乐在播放,如下图:

显然,这样的话就不属于响应静音键的AVAudioSessionCategory了,查询

playEffect: function(url, loop){

...

audio = cc.loader.getRes(url);

if (audio && SWA && audio._AUDIO_TYPE === 'AUDIO') {

cc.loader.release(url);

audio = null;

}

if (audio) {

if (SWA && audio._AUDIO_TYPE === 'AUDIO') {

loader.loadBuffer(url, function (error, buffer) {

audio.setBuffer(buffer);

audio.setVolume(cc.audioEngine._effectVolume);

if (!audio.getPlaying())

audio.play(0, loop || false);

});

} else {

audio = audio.cloneNode();

audio.setVolume(this._effectVolume);

audio.play(0, loop || false);

effectList.push(audio);

return audio;

}

}

loader.useWebAudio = true;

cc.loader.load(url, function (audio) {

audio = cc.loader.getRes(url);

audio = audio.cloneNode();

audio.setVolume(cc.audioEngine._effectVolume);

audio.play(0, loop || false);

effectList.push(audio);

});

loader.useWebAudio = false;

return audio;

},

可以看到,这个playEffect的逻辑为cc.loader.getRes取不到已加载的audio,且WebAudio启用,audio类型不是’AUDIO’(这应该是现在不响应静音键的HTML AUDIO播放方式)的情况下,开启loader的useWebAudio来以WebAudio方式加载指定audio。这段WebAudio加载为关键逻辑,如果使用cc.LoaderScene或者直接cc.loader进行音频preload,甚至是通过playMusic内的load代码,如下:

playMusic: function(url, loop){

var bgMusic = this._currMusic;

if (bgMusic && bgMusic.getPlaying()) {

bgMusic.stop();

}

var audio = cc.loader.getRes(url);

if (!audio) {

cc.loader.load(url);

audio = cc.loader.getRes(url);

}

audio.setVolume(this._musicVolume);

audio.play(0, loop || false);

this._currMusic = audio;

},

均不会以WebAudio方式生成audio,因此,现在的bgm并不会响应静音键!暂时的解决方法是去掉所有音频的preload,并且所有bgm类音频与音效一样使用playEffect播放,修改后测试音频已可以正常响应静音键。

PS: 开头提到本文记录的问题和之前写过的移动端用户操作后才能播音频的问题有关,这部分情况是这样,在检查WebAudio的过程中,发现Cocos2d-JS引擎实际上是处理了这个问题的,具体可参考cc.Audio.play:

play: function (offset, loop) {

if (!this._element) return;

this._element.loop = loop;

this._element.play();

if (this._AUDIO_TYPE === 'AUDIO' && this._element.paused) {

this.stop();

cc.Audio.touchPlayList.push({ loop: loop, offset: offset, audio: this._element });

}

if (cc.Audio.bindTouch === false) {

cc.Audio.bindTouch = true;

cc.game.canvas.addEventListener('touchstart', cc.Audio.touchStart);

}

},

可以看到,引擎通过加入touchPlayList以及监听canvas的触摸事件来延迟到下一次触摸操作后自动播放touchPlayList里的音频,从而绕开移动端上的这个限制的,所以也可以直接把这个问题交给引擎处理,但貌似仅限于通过playEffect播放。

文字加密小工具v3

请输入要加密的内容

博主友情提示:

如您在评论中需要提及如QQ号、电子邮件地址或其他隐私敏感信息,欢迎使用

html5 ios 音乐加载失败,Cocos2d-JS HTML5的cc.audioEngine音乐音效在iOS设备上不响应静音键的问题...相关推荐

  1. cocos html5 一直在加载失败,项目进行中的小问题-0426-【Cocos2d-html5】初识Cocos2d-html5-一些移动端浏览器的兼容性Bug_169IT.COM...

    背景与前言 现在什么技术火?Android,ios,HTML5,人工智能,云计算--如此多的技术,而且发展非常快,大家都很迷茫,到底要学什么呢?我也很迷茫,只能走一步算一步. 但是人总是有理想的是吧. ...

  2. ios html图片相对路径,iOS 下加载本地HTML/js/css/image 等路径问题

    今天在项目中遇到一个问题:我将H5的文件拖入项目中,在webView上添加H5,运行时发现H5的样式与图片等都没 屏幕快照 2016-07-06 11.33.22.png 有了.经过多种测试后发现:是 ...

  3. 扣丁音乐(四)——本地音乐加载

    本文出自:http://blog.csdn.net/dt235201314/article/details/51341078 一丶本地音乐加载相当于就是listVIew应用 扣丁音乐1.0前部分(gi ...

  4. 计算机中丢失swr.dll,win10电脑中模块initpki.dll加载失败提示0x80004005错误代码如何解决...

    有不少win10系统用户反映说碰到这样一个故障,就是模块initpki.dll加载失败,并提示0x80004005错误代码,该怎么解决呢,接下来就随系统城小编一起来看看具体的操作步骤吧. 1.打开搜索 ...

  5. win10 电脑中模块initpki.dll加载失败提示0x80004005错误代码如何解决

    win10 电脑中模块initpki.dll加载失败提示0x80004005错误代码如何解决 有不少win10系统用户反映说碰到这样一个故障,就是模块initpki.dll加载失败,并提示0x8000 ...

  6. flutter嵌入HTML5页面,Flutter加载Html并实现与JS 的双向调用

    2019-07-20 16:01:01 早起的年轻人 阅读数 2025 收藏更多 可以用来加载 Html 页面,以实现 Android 中 WebView 或者 是 iOS 中的 UIWebView ...

  7. ios+打开本地html乱码,IOS 使用 WKWebView 加载本地的JS和CSS文件出现乱码问题

    ####发现问题 最近项目中使用到HTML5和原生的混合开发,项目在IOS10上面运行正常,在IOS8下遇到了兼容性的问题,HTML5页面可以加载出来,只是页面样式丢失,并且JS脚本执行不了,所以只能 ...

  8. js img图片加载失败,重新加载+断网检查

    我们常常会遇到img加载图片的时候因为网络问题或者图片过大导致图片加载失败的问题,页面就因为这张蹦掉的图变得不美观.所以我们需要图片加载失败的时候重新加载图片 //js方法定义 function re ...

  9. iframe js 加载失败_如何提高Vue项目首页的加载速度

    为何当一个VUE项目过大时,打包之后初次访问首页加载速度会异常的缓慢,是什么原因导致以及如何解决这些问题? 首页打开速度慢的原因 其实浏览器加载一个页面的过程就是通过http协议从服务器端下载项目所需 ...

  10. 微信分享功能问题-描述内容换行,导致js加载失败

    jsContent内容存在换行符,导致js处理失败, 解决办法,在后台接口中替换'/r/n'为空,并截取前30位 weiXinJsSdk.setSharcontent(StringUtils.isNo ...

最新文章

  1. 核苷酸pi值计算方法
  2. 博客园里有多少人对企业信息化感兴趣
  3. 斜率小于0的连线数量 51Nod - 1107 (树状数组+离散化)
  4. MATLAB 2018a软件安装教程
  5. android开发模式,Android开发中无处不在的设计模式
  6. Web API 实现JSONP或者安装配置Cors跨域
  7. echo count(“abc”); 输出什么?
  8. 最全银行IT核心系统:研究框架(165页)
  9. 女生在施工单位项目部上工作,是怎样一种体验?
  10. Linux的c编程-文件节点的打开与读写操作
  11. Library Monkey Pro for Mac(专业的音频控制整理工具)
  12. 在韩家炜老师的实验室和家里作客 — 旅美散记之二
  13. linux命令查看系统日期,Linux系统查看当前时间的命令
  14. 微软笔试题三道(略微偏向竞赛题)
  15. java猜拳小游戏心得体会_java实现猜拳小游戏
  16. 【渝粤题库】陕西师范大学165210 国际人力资源管理 作业(专升本)
  17. 【VUE】vue3学习笔记(异步组件,包含defineAsyncComponent、Suspense的使用)
  18. ASP.NET WEBAPI 跨域请求 405错误
  19. python 声音基频f0_ASR中常用的语音特征之FBank和MFCC(原理 + Python实现)
  20. Java可视化动态画图

热门文章

  1. 小程序如何发布体验版本
  2. 2014年9月16日----暴风影音笔试题
  3. Cadence PSpice 仿真1: 三极管传输特性曲线直流仿真图文教程
  4. 201万年薪,华为天才少年路径可以复制吗
  5. Windows10系统迁移-同一PC硬盘之间
  6. 英雄联盟一直连接服务器win10,win10上玩英雄联盟无法连接服务器是怎么回事
  7. python牛顿迭代公式_牛顿迭代法Python实现
  8. 单维度量表验证性因子分析_验证性因子分析.ppt
  9. RUST开服教程、常用指令及心得
  10. pdf怎么提取图片?职场达人都在用的两个方法分享给你。