如何从手动创建的音频流流音频?(客户端)



一切都在前端完成。

我的目标是能够创建一个音频轨道,在实时,并立即播放它的用户。文件大概需要10分钟。然而,这些文件非常简单,大部分都是无声的,只有一些声音片段(声音片段是2kb)散布在周围。所以生成数据(原始字节)的过程非常简单,它要么写入2kb的声音片段,要么放置一个00作为沉默。就那么十分钟。但我不想生成完整的文件,然后播放它,我想流式传输音频,理想情况下,我可以在播放音频时生成越来越多的文件。它可以防止用户点击播放和音频开始播放之间的任何明显延迟。创建文件的过程可能需要20毫秒到500毫秒,根据用户输入创建不同的文件。

唯一的问题是:我不知道该怎么做。我读过关于使用web套接字的想法,但似乎数据将来自服务器,当JavaScript可以轻松地生成自己的音频数据时,我看不出为什么要麻烦服务器。

在过去的几个小时里,我一直在研究和试验Web Audio API和Media Streams API,我一直在兜圈子,我完全被它弄糊涂了。我开始认为这些API是用来从用户的麦克风或网络摄像头收集数据,而不是直接从可读流提供数据。

我想做的是可能的吗?可以使用MediaStreamAudioSourceNode之类的东西来实现吗?还是有另一种我没有注意到的更简单的方法?

任何关于这个话题的帮助都会非常感激。一个简单的工作版本的例子将更受欢迎。谢谢!

我将遵循这个问题,因为一个真正的流解决方案将是非常好的了解。我的经验仅限于使用WebAudio API来播放两种声音,并在它们之间给定暂停。数据实际上是在服务器上生成的,并使用Thymeleaf下载到两个javascript变量中,其中包含要播放的PCM数据。但是这些数据可以很容易地在客户端本身通过Javascript生成。

下面的不是很好,但几乎是可行的,因为有大量的沉默。我在想,管理一个有序的FIFO队列与变量名称和某种定时值,当你想要相关的音频播放,并有一个功能,定期轮询队列和加载命令到javascriptsetTimeout方法的延迟量基于队列中给定的定时值计算。

对于我拥有的一个有限的应用程序,按钮调用以下内容(我在其中编写了一个方法来播放javascript变量中保存的声音)

playTone(pcmData1);
setTimeout(() => playTone(pcmData2), 3500);

我有幸知道pcmData1的长度为2秒,并且两个声音之间有固定的暂停间隔。我也不指望显著的定时准确性。对于您的连续播放工具,它将只具有setTimeout部分,其中包含pcmData变量的值和从调度FIFO队列获得的时序。

这是否有帮助并触发一个有用的想法,IDK。希望有更有经验的人能告诉我们如何在飞行中传输数据。这当然是可以很容易地用Java完成的事情,使用它的SourceDataLine类,它具有有用的阻塞队列方面,但我还没有找到一个等效的Javascript。

相关内容

最新更新