【问题标题】:Using <audio> element for playback of raw audio使用 <audio> 元素播放原始音频
【发布时间】:2013-06-21 22:22:18
【问题描述】:

我正在开发一个使用 Web Audio API 解密(使用 openpgp.js)和解码服务器端音频文件的小项目。解密的文件作为原始音频到达客户端。目前我可以使用source.start(0) 播放音频文件,但似乎没有一种简单的方法可以将音频转储到 GUI 中,以便用户执行诸如调整音量和搜索音频之类的操作。

我有一个使用createBufferSource 解码和缓冲的AudioContext 对象

function playSound(decodedAudio) {
  var source = context.createBufferSource();
  source.buffer = decodedAudio;
  source.connect(context.destination);
  source.start(0);
}

因为接收到的是原始音频,所以我不能简单地将 audio.src = ... 之类的东西与音频元素一起使用。或者也许我忽略了一些明显的东西?
有没有办法让 Web Audio API 中的解码音频与目标 &lt;audio&gt; 元素很好地播放?

理想的流程应该是……
1) 用户点击播放音频剪辑
2) 音频在服务器端解密并作为原始音频发送到客户端
3) 音频解码后可播放、可搜索……等

我喜欢思考的可能解决方案
- 因为音频文件的范围从 1 分钟到 60 分钟不等,所以使用 FileSystem API 将音频写入文件,然后使用&lt;audio&gt; 元素进行实际播放
- 在 Web Audio API 之上编写我自己的暂停、擦洗和音量控制系统

【问题讨论】:

    标签: javascript html5-audio web-audio-api


    【解决方案1】:

    好问题!最简单的解决方案是将解码后的内容存储在 Blob 中。

    这将允许您设置src 属性。

    var blob = new Blob(decodedData, {type: "correct-mimetype/here"});
    var url = URL.createObjectURL(blob);
    audio.src = url;
    

    【讨论】:

    • 为每个数据包或整个剪辑创建一个 blob 会更有效吗?
    • 这取决于目标,或者数据是如何从客户端发送的(什么协议?HTTP?WS?WebRTC?这取决于 OP 真正想要什么,以及部分数据是否有帮助。跨度>
    • 也许是 WebSockets(这都是理论上的,我只是在考虑做一个 VoIP 打字的事情,但我觉得 blob 的开销很大......)
    • 在这些情况下,Blob 确实有很大的开销,尤其是考虑到替代方案。老实说,我可能只是使用 HTTPS 的内置安全性而不是rolling out my own crypto。这将允许我自己使用设置 .src,或者使用众所周知且经过测试的质询-响应机制为客户端生成 .src 属性的 url,并在客户端通过身份验证后从服务器发送。
    猜你喜欢
    • 2014-10-11
    • 1970-01-01
    • 2018-08-21
    • 2012-09-20
    • 1970-01-01
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多