网络音频 API 演示不适用于 iOS
Web Audio API demo doesn't work on iOS
我目前正在为我正在进行的项目调整这个 web audio API demo,但是当我在 iPhone 上测试时没有声音。它在 iPad.
上运行良好
我搜索了解决方案并在 Whosebug 上找到了这个 thread,其中包含以下答案之一:
Safari on iOS 6 effectively starts with the Web Audio API muted. It
will not unmute until you attempt to play a sound in a user input
event (create a buffer source, connect it to destination, and call
noteOn()). After this, it unmutes and audio plays unrestricted and as
it ought to. This is an undocumented aspect of how the Web Audio API
works on iOS 6 (Apple's doc is here, hopefully they update it with a
mention of this soon!)
用户输入事件应该是播放按钮上的 onclick 事件,但更改为使用 noteOn()
而不是 start()
仍然无法解决问题。
更新: 我也尝试过将播放按钮与 touchend
事件绑定,但无济于事。
这里是使用 noteOn() 的函数:
function playNote(buffer, pan, x, y, z, sendGain, mainGain, playbackRate, noteTime) {
// Create the note
var voice = context.createBufferSource();
voice.buffer = buffer;
voice.playbackRate.value = playbackRate;
// Optionally, connect to a panner
var finalNode;
if (pan) {
var panner = context.createPanner();
panner.panningModel = "HRTF";
panner.setPosition(x, y, z);
voice.connect(panner);
finalNode = panner;
} else {
finalNode = voice;
}
// Connect to dry mix
var dryGainNode = context.createGain();
dryGainNode.gain.value = mainGain * effectDryMix;
finalNode.connect(dryGainNode);
dryGainNode.connect(masterGainNode);
// Connect to wet mix
var wetGainNode = context.createGain();
wetGainNode.gain.value = sendGain;
finalNode.connect(wetGainNode);
wetGainNode.connect(convolver);
if (iOS) {
voice.noteOn(noteTime);
}
else {
voice.start(noteTime);
}
}
如有任何建议,我们将不胜感激。谢谢。
只要您使用用户交互事件调用该函数,start() 方法在 iOS 上没有 if else 语句的情况下应该可以正常工作。还要翻转将 y 和 z 传递给平移器的顺序,因为某些奇怪的原因导致 z 排在第二位。
这是一个工作示例,更改其中的内容以满足您的需要,大多数不需要,我在其他地方使用 dom 添加事件侦听器
<script>
var audioCtx = new (window.AudioContext || window.webkitAudioContext)();
var oscillator = audioCtx.createOscillator();
var gainNode = audioCtx.createGain();
oscillator.connect(gainNode);
gainNode.connect(audioCtx.destination);
oscillator.type = 'sine';
oscillator.frequency.value = 440;
gainNode.gain.value = 1;
</script>
<button onclick="oscillator.start();">play</button>
我自己的经验是,网络音频 API 有时可以在 iPhone 上运行,有时则不能。这是 5 分钟前在我的 iPhone 6s 上运行的页面; 1分钟前没用;现在又出现了!
http://www.stephenandrewtaylor.net/dna-sonification/
这是另一个间歇性工作的;它在 2 分钟前有效,现在无效(动画有效,只是没有音频)。
http://www.stephenandrewtaylor.net/lie-sonification/
这可能与 Safari 中打开的标签页数量有关;您可以尝试关闭一些打开的选项卡(现在我有 5 个选项卡,包括 2 分钟前有效但现在无效的 lie-sonificaton 页面)。我也是一名新手程序员,我确信有更好的方法可以编写代码。
我觉得真的很傻。显然,如果您 iPhone 处于振动模式,则不会播放声音。
我目前正在为我正在进行的项目调整这个 web audio API demo,但是当我在 iPhone 上测试时没有声音。它在 iPad.
上运行良好我搜索了解决方案并在 Whosebug 上找到了这个 thread,其中包含以下答案之一:
Safari on iOS 6 effectively starts with the Web Audio API muted. It will not unmute until you attempt to play a sound in a user input event (create a buffer source, connect it to destination, and call noteOn()). After this, it unmutes and audio plays unrestricted and as it ought to. This is an undocumented aspect of how the Web Audio API works on iOS 6 (Apple's doc is here, hopefully they update it with a mention of this soon!)
用户输入事件应该是播放按钮上的 onclick 事件,但更改为使用 noteOn()
而不是 start()
仍然无法解决问题。
更新: 我也尝试过将播放按钮与 touchend
事件绑定,但无济于事。
这里是使用 noteOn() 的函数:
function playNote(buffer, pan, x, y, z, sendGain, mainGain, playbackRate, noteTime) {
// Create the note
var voice = context.createBufferSource();
voice.buffer = buffer;
voice.playbackRate.value = playbackRate;
// Optionally, connect to a panner
var finalNode;
if (pan) {
var panner = context.createPanner();
panner.panningModel = "HRTF";
panner.setPosition(x, y, z);
voice.connect(panner);
finalNode = panner;
} else {
finalNode = voice;
}
// Connect to dry mix
var dryGainNode = context.createGain();
dryGainNode.gain.value = mainGain * effectDryMix;
finalNode.connect(dryGainNode);
dryGainNode.connect(masterGainNode);
// Connect to wet mix
var wetGainNode = context.createGain();
wetGainNode.gain.value = sendGain;
finalNode.connect(wetGainNode);
wetGainNode.connect(convolver);
if (iOS) {
voice.noteOn(noteTime);
}
else {
voice.start(noteTime);
}
}
如有任何建议,我们将不胜感激。谢谢。
只要您使用用户交互事件调用该函数,start() 方法在 iOS 上没有 if else 语句的情况下应该可以正常工作。还要翻转将 y 和 z 传递给平移器的顺序,因为某些奇怪的原因导致 z 排在第二位。 这是一个工作示例,更改其中的内容以满足您的需要,大多数不需要,我在其他地方使用 dom 添加事件侦听器
<script>
var audioCtx = new (window.AudioContext || window.webkitAudioContext)();
var oscillator = audioCtx.createOscillator();
var gainNode = audioCtx.createGain();
oscillator.connect(gainNode);
gainNode.connect(audioCtx.destination);
oscillator.type = 'sine';
oscillator.frequency.value = 440;
gainNode.gain.value = 1;
</script>
<button onclick="oscillator.start();">play</button>
我自己的经验是,网络音频 API 有时可以在 iPhone 上运行,有时则不能。这是 5 分钟前在我的 iPhone 6s 上运行的页面; 1分钟前没用;现在又出现了!
http://www.stephenandrewtaylor.net/dna-sonification/
这是另一个间歇性工作的;它在 2 分钟前有效,现在无效(动画有效,只是没有音频)。
http://www.stephenandrewtaylor.net/lie-sonification/
这可能与 Safari 中打开的标签页数量有关;您可以尝试关闭一些打开的选项卡(现在我有 5 个选项卡,包括 2 分钟前有效但现在无效的 lie-sonificaton 页面)。我也是一名新手程序员,我确信有更好的方法可以编写代码。
我觉得真的很傻。显然,如果您 iPhone 处于振动模式,则不会播放声音。