我有一种情况,我使用Web Audio API(WAA)按顺序播放许多短MP3文件,在一个轨道中(通常长度为5 - 15秒),以及其他几个轨道,我将循环一个2 - 5分钟的音频文件。第一条路走得很好。我现在正在处理其他两个轨道,WAA规范说缓冲区限制在60秒的音频。所以我想找出最好的方法来处理其他样本更长的曲目。
我已经找到了一堆与这个主题相关的帖子,但大多数都很旧,并且是在WAA V1.0规范发布之前写的。他们中的很多人建议使用HTML5 <AUDIO>
元素来播放较长的文件,但他们似乎没有提供与我通过管理一系列具有较短音频样本的缓冲区所获得的相同的控制。但是,我没有找到任何适合我在这里尝试做的事情:将由许多短样本组成的轨道与一个或多个轨道组合,每个轨 prop 有一个较长的样本(> 60秒)--它们似乎处理一个或另一个,但不是两个。
我知道还有其他一些库可以让你处理更长的音频样本,比如Howler.js和Tone.js。它们应该是建立在WAA之上的,但是目前还不清楚它们是否可以用于管理连接到同一WAA音频上下文的单独曲目。
或者,*我可以将它们与一个单独的音频上下文一起使用,与第一个音频上下文并行运行吗? *(如果有效,这可能是最好的方法。)
我看到过关于将较长的文件分割成较短的文件的建议,但你不能只是在任意点分割MP3文件,对吗?我认为它需要加载到一个缓冲区,并解码成WAV或PCM格式的第一。如果有人能够在我的Web应用程序中说,“我想在这里播放这个MP3文件”,并且它有5分钟长,那么如果缓冲区不能容纳那么大的文件,该怎么做呢?(我知道有些浏览器可以,但我需要处理更广泛的情况,并坚持我知道所有浏览器都应该能够处理的限制。
- 我正在寻找有关管理单独曲目中较长音频样本的最佳方法的建议,这些曲目将与第一首曲目同步播放。**
请注意,* 轨道之间的定时并不重要 *。所有曲目将一起开始播放。他们会一直播放直到第一个播放完所有内容,然后他们就会停止。如果它比其他人走得更长,其他人就会循环。
如果有关系,我正在使用Delphi和TMS WEB Core平台,该平台将Delphi代码转换为JavaScript。有一个单位,让我访问WAA和它的工作很好。我还可以在需要的地方将javascript注入到代码中,这是我使用Howler或Tone所需要做的。
1条答案
按热度按时间6jjcrrmo1#
我不知道60秒的限制是从哪里来的,但它肯定只是一个建议,而不是一个硬性要求。真实的的限制由浏览器/操作系统/设备组合定义。创建一个新的
AudioBuffer
应该工作,只要有足够的可用内存,不管它有多长。但是您可以使用一些技巧来减少将文件保存在内存中所需的内存量。例如,您可以以较低的采样率解码它们。这将需要Web音频API对它们进行动态重新采样,但将解码的文件保存在内存中需要更少的内存。
或者你确实可以部分解码你的MP3。它应该有一天可以与WebCodecs一起工作,但在此之前,你可以使用类似的技术,如phonograph。它会扫描MP3中的帧边界,以便在这些点上准确地切割它们。