Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/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 AudioContext.decodeAudioData似乎会产生噼啪作响的噪音_Javascript_Typescript_Web Audio Api - Fatal编程技术网

Javascript AudioContext.decodeAudioData似乎会产生噼啪作响的噪音

Javascript AudioContext.decodeAudioData似乎会产生噼啪作响的噪音,javascript,typescript,web-audio-api,Javascript,Typescript,Web Audio Api,我正在创建一个电子应用程序,它允许用户剪切和重新排列多个音频样本,并且可以毫无表情地播放它们。样本的总持续时间可能比小时长,因此我无法将它们全部解码并存储为pcm数据。下面是我实现的: -第一次解码音频ArrayBuffers,这是创建第一段AudioBufferSourceNode所需的 -播放第一个AudioBufferSourceNode时,以相同的方式创建下一个缓冲区,并在第一个缓冲区结束后立即播放 问题是,音频似乎偶尔会发出劈啪声。每个缓冲区都会一个接一个地播放,而且我在剪切音频的开始

我正在创建一个电子应用程序,它允许用户剪切和重新排列多个音频样本,并且可以毫无表情地播放它们。样本的总持续时间可能比小时长,因此我无法将它们全部解码并存储为pcm数据。下面是我实现的:
-第一次解码音频
ArrayBuffers
,这是创建第一段
AudioBufferSourceNode
所需的
-播放第一个
AudioBufferSourceNode
时,以相同的方式创建下一个缓冲区,并在第一个缓冲区结束后立即播放

问题是,音频似乎偶尔会发出劈啪声。每个缓冲区都会一个接一个地播放,而且我在剪切音频的开始和结束时都应用了几毫秒的衰减,所以我确信这不是因为音频的突然启动/停止。
奇怪的是,只有当音频解码异步运行时,才会出现破裂噪声。我已经实现了这个功能来存储最近解码的pcm,当从缓存播放时,并没有这样的破裂噪音。另外,当我在后台运行无限循环的音频解码时,音频中显然有更多的裂缝

我在谷歌上搜索过这类问题,但找不到有同样问题的人。所以我的问题是,
解码音频数据
真的会引起破裂噪声吗?如果是的话,我该如何修复它

这在每台计算机上都会发生,但低性能计算机似乎有更多的裂缝

这是我用来解码的代码,它是
AudioContext
的单例

类音频解码器{
//音频上下文的数量有限,
//使用单例来防止达到极限
私有audioCtx:AudioContext;
私有静态实例:音频解码器;
私有构造函数(){
const AudioContextClass=
(如有窗口)。AudioContext | |(如有窗口)。webkitAudioContext;
this.audioCtx=新的AudioContextClass();
}
公共静态解码=(arrayBuffer:arrayBuffer)=>{
if(!AudioDecoder.instance){
AudioDecoder.instance=新的AudioDecoder();
}
返回新承诺((解决、拒绝)=>{
AudioDecoder.instance.audioCtx.decodeAudioData(
arrayBuffer,
缓冲区=>{
解析(缓冲);
},
错误=>拒绝(错误),
);
});
};
}

原则上
解码音频数据
不应产生破裂噪声,除非原始源有破裂噪声

但是,如果压缩音频文件的采样率与
音频上下文
的采样率不同,则解码音频将重新采样以匹配上下文。一般来说,这是不明显的,但你连接的缓冲区播放,可能有一个中断,没有在原来的。您应该检查音频文件的采样率是否与上下文的采样率不同。如果它们不同,请使用与上下文匹配的采样率的音频文件重试。或者使用与文件匹配的采样率构造上下文。(尚未在所有浏览器上提供。)

最后,如果这不能解决问题,请在浏览器中提交一个问题,并确保包含一个简短但完整的测试用例