【发布时间】:2019-10-19 18:17:00
【问题描述】:
我们在会议室录制,在那里我们有多个演讲者的对话。每个扬声器都连接了一个个人麦克风,每个麦克风的语音都被录制为一个单独的通道(单独的音频文件)。
我们的目标是让用户一次播放所有音频(频道)。我们最多可以有 12 个单独的文件。 此外,我们需要用户能够控制每个流的音量(因此仅在后端合并文件不是解决方案)。
我们可以用什么来实现这一目标?一次播放所有这些内容的幼稚解决方案可能行不通,因此我们想知道现代 html5 API 是否解决了这种挑战。
--- 更新以回答@Amdadan 的评论 ---
为什么不呢?你试过了吗?您是否担心连接吞吐量,如果 你在流式传输它们吗?您是否担心 API 限制?
是的,我们试过了。 1)当我们对所有文件调用“播放”时 - 它不会同时启动(它开始全部加载,一个加载更快,一个加载更慢,等等)。 2)当它已经在播放并且文件到达“缓冲”时间的末尾时 - 它也会停止,而其他人继续播放。
我们尝试使用事件来处理这些情况,但我们没有成功 - 有很多情况需要处理。
如果在播放之前将它们全部加载,您是否担心大小?
是的,我们是。文件可能长达几个小时 - 不能全部缓冲。
如果您正在流式传输,您是否担心连接吞吐量 他们?您是否担心 API 限制?
不,我们使用连接到 s3 的 CloudFront - 吞吐量还可以,没有具体限制
提前谢谢你, - 杰克
【问题讨论】:
-
为什么不呢?你试过了吗?如果您在玩之前将它们全部加载,您是否担心大小?如果您正在流式传输它们,您是否担心连接吞吐量?您是否担心 API 限制?
-
@Amadan - 遍历音频文件数组并对其调用播放,可能会在第一个和第十二个之间产生一些延迟,即使这个延迟是 100 毫秒,听起来也很可怕。这就是为什么我们正在寻找可以处理一组音频文件的东西。
-
为什么会有 100 毫秒的延迟?此外,您可以手动同步文件。例如,看看this example:当每个文件播放时,它们会确定正确的偏移量以传递给
start,因此所有文件都是同步的(if (offset == 0) { trackSource.start(); offset = audioCtx.currentTime; } else { trackSource.start(0, audioCtx.currentTime - offset); })。 -
现在,在此示例中,您已经预加载了曲目,而您将对其进行流式传输;如果您的吞吐量不足以使轨道不滞后并开始缓冲,那么我想您必须决定要做什么(所有流都应该暂停吗?缓冲流是否应该尝试赶上其他流并保持静音直到它设法做到这一点,而所有其他人都继续?等)在询问如何做之前:)
-
我在之前的评论中确实解决了这个问题 - 同步多个流的 start 相当容易(使用
Audio,在所有源上等待canplay事件,当一切准备就绪时,全部启动);但是您需要决定如果来源之一stalls out) 会发生什么。正如 Oliver M Grech 所提到的,另一种可能的方法是使用多轨源(我相信,同步是自动为您完成的)。
标签: html html5-audio web-audio-api