如何在 Web Audio API 中将 SoundManager2 定义为媒体元素源

Posted

技术标签:

【中文标题】如何在 Web Audio API 中将 SoundManager2 定义为媒体元素源【英文标题】:How can I define SoundManager2 as a Media Element Source in Web Audio API 【发布时间】:2013-12-31 07:35:03 【问题描述】:

我知道网络音频 api 可以采用 <audio> 元素作为它的媒体源(用于频率数据等),但是 SoundManager2 似乎没有创建 <audio> 标签,因此我不确定我将提供什么作为源,以便使用 SoundManager2 播放声音,并将其用作使用网络音频提供可视化的源。

拆分的原因是因为 SoundManager2 有很好的文档记录,可以中继诸如加载的字节数、在音频中的特定时间安排事件以及其他尚不存在或很难找到的信息在网络音频 api 中。不过,我想避免在 SoundManager 中使用 Flash 进行可视化,并使用 Web Audop API 来处理这方面的事情。

任何帮助将不胜感激,谢谢。

【问题讨论】:

【参考方案1】:

<audio> 元素确实隐藏在 SoundManager2 中,但您可以像这样找到它:

soundManager.onready = function() 
    audioElement = soundManager.sounds[soundManager.soundIDs[0]]._a;
    webAudiosource = audioContext.createMediaElementSource(audioElement);

就像在@MarijnS95 的示例中一样,您需要将媒体元素源节点连接到音频上下文目标节点才能听到它。这是因为 Web Audio 劫持了元素的音频输出。但 SoundManager 仍将能够控制播放/暂停/定时功能,现在您可以使用网络音频进行可视化/处理声音。

【讨论】:

哇,感谢您迟来的答复。现在不再使用这个库,但是当我接下来这样做时,它可能会派上用场。谢谢! @talkscheap 我正在尝试设置它,因为您建议知道为什么这首歌会停止播放,当我强制它播放时,它播放时没有音量或似乎没有播放...... :( 获取_a属性,这样做更简洁:audioElement = soundManager.getSoundById("YourSoundId")._a【参考方案2】:

我不知道这在 soundmanager2 中是如何工作的,但在纯 javascript 中它非常简单。您只需创建一个MediaElementNode 并为其分配一个audiovideo 标签。所以我的猜测是你必须将 html 对象指定给 soundmanager2。 (您可以通过在 javascript 中创建音频元素来做到这一点:player = new Audio(); 或通过将 <audio id="player"></audio> 标签添加到您的 html 并使用 document.getElementById('player'); 获取它们

基本示例:

function init() 
    player = new Audio();
    window.context = new webkitAudioContext()||AudioContext();
    audioSource = context.createMediaElementSource(player);
    audioSource.connect(context.destination);

Source jsfiddle with example

我希望这能让你朝着正确的方向迈出一步,在 soundmanager2 中找到如何做到这一点。

【讨论】:

遗憾的是,经过检查,在 soundmanager2 中抽象的东西使得这在 api 在那里实现之前是不可能的。现在等待游戏。 检查 soundmanager2 js 文件后,我注意到它可以通过 flash 对象工作。所以你不能不使用 soundmanger2 的 flash。您可以与音频 api 连接的唯一媒体元素是 <audio><video> 标签。我的问题是,你到底想用 soundmanager2 做什么?如果你只想用它播放音乐并且像这个例子一样有一个时间滑块](imgur.com/1LFJULt),你最好使用网络音频api来处理所有事情。您是否已经为可视化器准备了一些东西? 您不能使用 Flash,并强制它进入仅 html5 模式。例如,目前我根本不给它任何 swf 文件的 url,它们甚至不存在于我的服务器上,但仍然有效。可悲的是,Web 音频 Api 目前缺少事件之类的东西,而且我有一个围绕 sm2 构建的整个东西 你是对的!经过一番搜索,我找到了一些音频元素:audioClone = new Audio(s._iO.url);s._a = new Audio(instanceOptions.url); 和这个:var a = (Audio !== _undefined ? (isOpera && opera.version() < 10 ? new Audio(null) : new Audio()) : null),,所以你要么需要 spaudioObject)`。 我发现 SoundManager2 的创建者在一个实验分支中有这个,因此我将等待稳定性并走那条路,因为我可以没有这些数据。不过,感谢您的帮助。

以上是关于如何在 Web Audio API 中将 SoundManager2 定义为媒体元素源的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Web Audio API 中更改音频缓冲源的时间?

Web Audio API 如何命名声音

如何下载我刚刚使用 Web Audio API 创建的声音?

如何使用 Web Audio API 移动/调制音频缓冲频率

如何将一个或两个乐器连接到 Web Audio API 并拆分立体声信号?

WEB AUDIO API 产生雨水噼啪声