加载音频缓冲区并使用音频标签播放它

问题描述 投票:3回答:2

我正在尝试从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()

但是那没有用。

那里有任何信息吗?

javascript html5 html5-audio
2个回答
2
投票

[如果只想播放音频文件,为简单起见,可能要使用<audio>标签。 (并且不限于Webkit浏览器)。

在您的示例中,您没有设置buffer-source节点的缓冲区:如果要保留整体结构,只需添加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设置为音频文件的URL


0
投票

要回答真正的问题而不是“不使用音频元素”,我想提供另一种解决方案。我想向用户显示音频控件,因此我需要一个解决问题的方法。

实际上,您只需要将ArrayBuffer转换为Blob,获取它的URL并将其映射到<audio>元素的src属性:

const blob = new Blob([arrayBuffer], { type: "audio/wav" });
const url = window.URL.createObjectURL(blob);
audioElement.src = url;

请不要忘记相应地更改哑剧类型,也不要忘记拨打电话

window.URL.revokeObjectUrl(url);

卸载页面/组件时。

© www.soinside.com 2019 - 2024. All rights reserved.