我正在尝试从URL加载音频缓冲区,然后播放它。我从HTML5 Rocks Tutorial获得了大部分代码。
var request = new XMLHttpRequest();
request.open('GET', $(this).attr('data-url'), true);
request.responseType = 'arraybuffer';
request.onload = function() {
console.log(request);
context.decodeAudioData(request.response, function(buffer) {
console.log(buffer);
$('#play').click(function() {
var source = context.createBufferSource();
source.connect(context.destination);
source.noteOn(0);
}).removeAttr('disabled');
}, function(err) { console.log(err); });
};
request.send();
然而,我按下#play
按钮,没有任何反应。调用source.noteOn(0)
,我使用调试器检查它。并且所有对象都已正确加载和创建,但我听不到声音。
另外,看起来,当我使用这种方法时,我需要重建一个包含所有控件的完整播放器。我想做的是,为了保存工作并确保更好地工作,我要将buffer
放入<audio/>
,以便在那里播放。
我知道有audio.src
将文件名放在那里,但我需要使用音频缓冲区。我试过了
audio.src = buffer;
audio.load()
但那没用。
那里有任何信息吗?
答案 0 :(得分:2)
如果您只想播放音频文件,可能需要使用<audio>
标签以简化操作。 (并且不限于webkit浏览器)。
在您的示例中,您没有设置缓冲区 - 源节点的缓冲区:
如果你想保持整体结构,你可以简单地添加一行source.buffer = buffer
,如:
context.decodeAudioData(request.response, function(buffer) {
$('#play').click(function() {
var source = context.createBufferSource();
source.buffer = buffer;
source.connect(context.destination);
source.noteOn(0);
}).removeAttr('disabled');
}, function(err) { console.log(err); })
(通过将音频解码与事件处理分开,可以提高代码的可读性。)
关于audio.src
的另一个问题:
您应该将audio.src
设置为音频文件的网址。
答案 1 :(得分:2)
要回答真正的问题,而不是“不使用音频元素”,我想提供另一种解决方案。我想向用户展示音频控件,因此我需要一个解决问题的方法。
实际上,您只需要将ArrayBuffer
转换为Blob
,获取其URL并将其映射到<audio>
元素的src
属性:
const blob = new Blob([arrayBuffer], { type: "audio/wav" });
const url = window.URL.createObjectURL(blob);
audioElement.src = url;
请不要忘记相应地更改mime类型,也不要忘记拨打电话
window.URL.revokeObjectUrl(url);
在卸载页面/组件时。