html5 ios 音乐加载失败,Cocos2d-JS HTML5的cc.audioEngine音乐音效在iOS设备上不响应静音键的问题...
之前写过一篇同样关于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设备上不响应静音键的问题...相关推荐
- cocos html5 一直在加载失败,项目进行中的小问题-0426-【Cocos2d-html5】初识Cocos2d-html5-一些移动端浏览器的兼容性Bug_169IT.COM...
背景与前言 现在什么技术火?Android,ios,HTML5,人工智能,云计算--如此多的技术,而且发展非常快,大家都很迷茫,到底要学什么呢?我也很迷茫,只能走一步算一步. 但是人总是有理想的是吧. ...
- ios html图片相对路径,iOS 下加载本地HTML/js/css/image 等路径问题
今天在项目中遇到一个问题:我将H5的文件拖入项目中,在webView上添加H5,运行时发现H5的样式与图片等都没 屏幕快照 2016-07-06 11.33.22.png 有了.经过多种测试后发现:是 ...
- 扣丁音乐(四)——本地音乐加载
本文出自:http://blog.csdn.net/dt235201314/article/details/51341078 一丶本地音乐加载相当于就是listVIew应用 扣丁音乐1.0前部分(gi ...
- 计算机中丢失swr.dll,win10电脑中模块initpki.dll加载失败提示0x80004005错误代码如何解决...
有不少win10系统用户反映说碰到这样一个故障,就是模块initpki.dll加载失败,并提示0x80004005错误代码,该怎么解决呢,接下来就随系统城小编一起来看看具体的操作步骤吧. 1.打开搜索 ...
- win10 电脑中模块initpki.dll加载失败提示0x80004005错误代码如何解决
win10 电脑中模块initpki.dll加载失败提示0x80004005错误代码如何解决 有不少win10系统用户反映说碰到这样一个故障,就是模块initpki.dll加载失败,并提示0x8000 ...
- flutter嵌入HTML5页面,Flutter加载Html并实现与JS 的双向调用
2019-07-20 16:01:01 早起的年轻人 阅读数 2025 收藏更多 可以用来加载 Html 页面,以实现 Android 中 WebView 或者 是 iOS 中的 UIWebView ...
- ios+打开本地html乱码,IOS 使用 WKWebView 加载本地的JS和CSS文件出现乱码问题
####发现问题 最近项目中使用到HTML5和原生的混合开发,项目在IOS10上面运行正常,在IOS8下遇到了兼容性的问题,HTML5页面可以加载出来,只是页面样式丢失,并且JS脚本执行不了,所以只能 ...
- js img图片加载失败,重新加载+断网检查
我们常常会遇到img加载图片的时候因为网络问题或者图片过大导致图片加载失败的问题,页面就因为这张蹦掉的图变得不美观.所以我们需要图片加载失败的时候重新加载图片 //js方法定义 function re ...
- iframe js 加载失败_如何提高Vue项目首页的加载速度
为何当一个VUE项目过大时,打包之后初次访问首页加载速度会异常的缓慢,是什么原因导致以及如何解决这些问题? 首页打开速度慢的原因 其实浏览器加载一个页面的过程就是通过http协议从服务器端下载项目所需 ...
- 微信分享功能问题-描述内容换行,导致js加载失败
jsContent内容存在换行符,导致js处理失败, 解决办法,在后台接口中替换'/r/n'为空,并截取前30位 weiXinJsSdk.setSharcontent(StringUtils.isNo ...
最新文章
- 核苷酸pi值计算方法
- 博客园里有多少人对企业信息化感兴趣
- 斜率小于0的连线数量 51Nod - 1107 (树状数组+离散化)
- MATLAB 2018a软件安装教程
- android开发模式,Android开发中无处不在的设计模式
- Web API 实现JSONP或者安装配置Cors跨域
- echo count(“abc”); 输出什么?
- 最全银行IT核心系统:研究框架(165页)
- 女生在施工单位项目部上工作,是怎样一种体验?
- Linux的c编程-文件节点的打开与读写操作
- Library Monkey Pro for Mac(专业的音频控制整理工具)
- 在韩家炜老师的实验室和家里作客 — 旅美散记之二
- linux命令查看系统日期,Linux系统查看当前时间的命令
- 微软笔试题三道(略微偏向竞赛题)
- java猜拳小游戏心得体会_java实现猜拳小游戏
- 【渝粤题库】陕西师范大学165210 国际人力资源管理 作业(专升本)
- 【VUE】vue3学习笔记(异步组件,包含defineAsyncComponent、Suspense的使用)
- ASP.NET WEBAPI 跨域请求 405错误
- python 声音基频f0_ASR中常用的语音特征之FBank和MFCC(原理 + Python实现)
- Java可视化动态画图