我有一个离子应用程序,是一个节拍器。使用网络音频API我已经使一切工作使用振荡器功能,但当切换到使用WAV文件没有音频播放在真正的设备(iPhone)。
在使用Ionic Serve(chrome)的浏览器中测试时,音频播放正常。
这是我的想法:
function snare(e) {
var audioSource = 'assets/audio/snare1.wav';
var request = new XMLHttpRequest();
request.open('GET', audioSource, true);
request.responseType = 'arraybuffer';
// Decode asynchronously
request.onload = function() {
audioContext.decodeAudioData(request.response, function(theBuffer) {
buffer = theBuffer;
playSound(buffer);
});
}
request.send();
}
function playSound(buffer) {
var source = audioContext.createBufferSource();
source.buffer = buffer;
source.connect(audioContext.destination);
source.start(0);
}
音频样本位于www/assets/audio。
你知道哪里出了问题吗?
3条答案
按热度按时间jtw3ybtb1#
我相信iOS设备需要某种用户手势才能播放音频。
flvlnr442#
现在是2017年7月,iOS 10.3.2,我们仍然在iPhone上的Safari上发现这个问题。有趣的是,MacBook上的Safari是好的。@Raymond Toy的一般观察似乎仍然是正确的。但@padenot的方法(通过https://gist.github.com/laziel/7aefabe99ee57b16081c)在我想播放声音以响应一些外部事件/触发器的情况下不起作用。
使用原始发布者的代码,我在这方面取得了一些成功
现在调用
triggerSound()
将在Android上立即产生声音,并在iOS上触摸浏览器页面后产生声音。还是不理想,但总比完全没有声音好...
2exbekwf3#
我在当前的iOS(15)中也遇到了类似的问题。我试图播放Base64编码的二进制数据,它在所有浏览器中都有效,但在iOS上无效。
最后,对语句重新排序解决了我的问题:
另请参见此commit in my project。
我认为在
play()
方法中调用audioSource.start(0)
有点太晚了,因为它在context.decodeAudioData()
之后的回调中,因此对于iOS的标准来说,可能离用户交互“太远了”。