Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AudioBuffer不可缓存/解码AudioData耗时太长_Javascript_Web Audio Api - Fatal编程技术网

Javascript AudioBuffer不可缓存/解码AudioData耗时太长

Javascript AudioBuffer不可缓存/解码AudioData耗时太长,javascript,web-audio-api,Javascript,Web Audio Api,我正在尝试使用web音频Api为音乐编写一个自定义web播放器,但在解码音频时遇到了问题 我正在从后端获取.mp3作为ArrayBuffer,并使用AudioContext.decodeAudioData函数对其进行解码 const resp = await fetch(url); const raw = await resp.arrayBuffer(); const audioBuffer = context.decodeAudioData(raw); 我试图将音频缓冲区缓存在I

我正在尝试使用web音频Api为音乐编写一个自定义web播放器,但在解码音频时遇到了问题

我正在从后端获取.mp3作为ArrayBuffer,并使用AudioContext.decodeAudioData函数对其进行解码

  const resp = await fetch(url);
  const raw = await resp.arrayBuffer();
  const audioBuffer = context.decodeAudioData(raw);
我试图将音频缓冲区缓存在IndexedDB中,但它不可关闭。在我的设备上,用一个普通的mp3解码大约需要10秒钟,这相当长。除了预取和预录制之外,我还有其他选择来防止歌曲之间的长时间等待吗?

音频缓冲区不适用于大块音频

此接口表示用于单发声音和其他短音频剪辑的内存驻留音频资源。其格式为非交错IEEE 32位线性PCM,标称范围为-1->+1。它可以包含一个或多个通道。通常,预计PCM数据的长度相当短,通常不到一分钟。对于较长的声音,如音乐配乐,流媒体应与audio元素和MediaElementAudioSourceNode一起使用

重点矿山

您可能想研究一下是否需要实时处理音频。否则,一个简单的音频元素就足够了。

音频缓冲区不适用于大块音频

此接口表示用于单发声音和其他短音频剪辑的内存驻留音频资源。其格式为非交错IEEE 32位线性PCM,标称范围为-1->+1。它可以包含一个或多个通道。通常,预计PCM数据的长度相当短,通常不到一分钟。对于较长的声音,如音乐配乐,流媒体应与audio元素和MediaElementAudioSourceNode一起使用

重点矿山


您可能想研究一下是否需要实时处理音频。否则,一个简单的音频元素就足够了。

难道你不能将数据作为一个流提取出来并对其进行部分解码吗?对其进行部分解码似乎相当复杂,因为javascript时钟非常不准确。我试过了,但我无法阻止音频片段之间的噼啪声。此外,文档还说明:异步解码ArrayBuffer中包含的音频文件数据。在这种情况下,通常在将responseType设置为ArrayBuffer后,从XMLHttpRequest的response属性加载ArrayBuffer。此方法仅适用于完整的文件,而不适用于音频文件的片段。你不能把数据作为一个流来提取,然后对它进行部分解码吗?对它进行部分解码似乎相当复杂,因为javascript时钟非常不准确。我试过了,但我无法阻止音频片段之间的噼啪声。此外,文档还说明:异步解码ArrayBuffer中包含的音频文件数据。在这种情况下,通常在将responseType设置为ArrayBuffer后,从XMLHttpRequest的response属性加载ArrayBuffer。此方法仅适用于完整的文件,而不适用于音频文件的片段。哦,该死,所以我完全滥用了decodeAudioBuffer方法。感谢您的澄清,我将尝试使用html元素实现播放器。@Prinzhorn,MediaElementAudioSourceNode似乎打算与HTML5结合使用。是否有一个Node.js模块用于播放较长的音频,我可以与Web audio Api模块一起使用以播放较短的声音?@WesModes您在节点进程中具体如何处理音频?根据用例的不同,这可能不是一个好主意,因为对decodeAudioData的调用将阻塞整个节点过程。但是,如果这不是您的问题,例如,您生成了第二个进程,那么即使对于大文件,也只需使用decodeAudioData。如果音频文件是本地的,你就不必处理网络延迟,而你必须在浏览器中处理。哦,该死,所以我完全滥用了decodeAudioBuffer方法。感谢您的澄清,我将尝试使用html元素实现播放器。@Prinzhorn,MediaElementAudioSourceNode似乎打算与HTML5结合使用。是否有一个Node.js模块用于播放较长的音频,我可以与Web audio Api模块一起使用以播放较短的声音?@WesModes您在节点进程中具体如何处理音频?根据用例的不同,这可能不是一个好主意,因为对decodeAudioData的调用将阻塞整个节点过程。但是,如果这不是您的问题,例如,您生成了第二个进程,那么即使对于大文件,也只需使用decodeAudioData。如果音频文件是本地的,则不必处理网络延迟,而必须在浏览器中处理。