【问题标题】:Web Audio API: Start Multiple MediaElementAudioSourceNode's simultaneouslyWeb Audio API:同时启动多个 MediaElementAudioSourceNode
【发布时间】:2016-09-26 20:57:30
【问题描述】:

我正在尝试使用 Web Audio API 创建多轨音频播放器。目前我的播放按钮点击是这样处理的......

function playProject(){
    var p = $(".play-button");
    p.hide();
    p.siblings('.pause-button').show();
    for( var i=0 ; i<audio.length ; i++ ){
        audio[i].play();
    }
}

我的网络音频设置看起来像这样......

var audioCtx = new (window.AudioContext || window.webkitAudioContext)();

var audio = [];
var channelVolume = [];
var vol = audioCtx.createGain();

$(document).ready(function(){
var obj = JSON.parse('<?php echo $json ?>');

var audioPath = "../wp-content/themes/blankslate-child/projects/"+"<?php echo     $data->name ?>"+"/";

var sources = [];
var merger = audioCtx.createChannelMerger(2);

for(var i = 0; i<obj.length;i++){
    audio.push(new Audio());
    audio[i].src = audioPath+obj[i].name;
    audio[i].loop = true;
    sources.push(audioCtx.createMediaElementSource(audio[i]));
    channelVolume.push(audioCtx.createGain())
    sources[i].connect(channelVolume[i]);
    channelVolume[i].connect(merger,0,0);
}

merger.connect(vol);
vol.connect(audioCtx.destination);

})

基本上,我循环播放所有音频元素并播放它们。虽然这可行,但我觉得这可能不是最干净的方法。有没有办法通过一个函数调用同时播放所有音频源?

【问题讨论】:

  • 这不能回答您的问题,但您应该小心将数据回显到 JavaScript。您应该做的是使用json_encode() 使您的数据在脚本中安全使用。此外,如果将 JSON 正确回显到 JS 中,则 JS 中不需要 JSON.parse()
  • 我确实使用 json 编码来创建 $json 变量 @Brad
  • 对,但您在 audioPath 中遗漏了它。此外,您不需要 JSON.parse()... 您可以将 JSON 编码的对象直接回显到脚本中。
  • 我决定切换到音频缓冲区而不是 html 源节点,尽管警告说它们仅适用于短声音。它们具有更多功能,而且在时间方面它们更加精确。

标签: javascript api audio web


【解决方案1】:

这是不可能的,MediaElementAudioSourceNode 没有时间保证。

它可能适用于某些浏览器,例如 Firefox,在某些情况下,目前,因为我们内部设计事物的方式为您带来了这种同步,但它可能会从一个版本更改为下一个版本,所以我不会依赖它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    • 2021-10-27
    • 2014-08-17
    • 1970-01-01
    • 2014-10-02
    相关资源
    最近更新 更多