- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
每当我使用如下代码播放声音时
// binaryData = a wave file from a websocket
let ctx = new AudioContext();
ctx.decodeAudioData(binaryData, function(audioData){
let source = ctx.createBufferSource();
source.buffer = audioData;
source.connect(ctx.destination);
source.start(0);
});
播放的每个剪辑之间都有非常明显的咔哒声或爆裂声。忘记我正在尝试使用该系统播放实时音频这一事实;为什么在播放的每个声音片段的开头和结尾都有杂音?我不明白这是 2017 年音频播放设备可接受的行为......有什么办法可以减轻或消除这种情况吗?
回答
下面的答案后面是一组很好的 #s,可用于将点击次数减少到基本为零。我并不是说这对音调非常有用,但它对声音来说是完美无缺的。
// start of clip
// clipPlayTime may be 0 or your scheduled play time
gain.setValueAtTime(0.01, clipPlayTime);
gain.exponentialRampToValueAtTime(1, clipPlayTime + 0.001);
// end of clip
gain.setValueAtTime(1, clipPlayTime + clipLength - 0.001);
gain.exponentialRampToValueAtTime(0.01, clipPlayTime + clipLength);
这会产生上升和下降。
最佳答案
使用 exponentialRampToValueAtTime()
消除(或至少减少)咔嗒声。
这是一个很好的解释:Web Audio, the ugly click and the human ear
完整示例
基本示例取自:https://developer.mozilla.org/en-US/docs/Web/API/BaseAudioContext/decodeAudioData
<button class="play">Play</button>
<button class="stop">Stop</button>
<script type="text/javascript">
var audioCtx = new(window.AudioContext || window.webkitAudioContext)();
var source;
var play = document.querySelector('.play');
var stop = document.querySelector('.stop');
var gainNode = audioCtx.createGain();
function getData() {
source = audioCtx.createBufferSource();
var request = new XMLHttpRequest();
request.open('GET', './sample.wav', true);
request.responseType = 'arraybuffer';
request.onload = function() {
var audioData = request.response;
audioCtx.decodeAudioData(audioData, function(buffer) {
source.buffer = buffer;
source.connect(gainNode);
gainNode.connect(audioCtx.destination);
gainNode.gain.setValueAtTime(1, audioCtx.currentTime);
},
function(e) {
console.log("Error with decoding audio data" + e.err);
});
}
request.send();
}
play.onclick = function() {
getData();
source.start(0);
play.setAttribute('disabled', 'disabled');
}
stop.onclick = function() {
gainNode.gain.setValueAtTime(gainNode.gain.value, audioCtx.currentTime);
gainNode.gain.exponentialRampToValueAtTime(0.0001, audioCtx.currentTime + 1);
setTimeout(function() {
source.stop();
}, 1000)
play.removeAttribute('disabled');
}
</script>
关于javascript - WebAudio 在开始和结束时播放声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47996114/
我想使用webAudio制作一个简单的VU表来指示的音量元素,其中包含来自网络摄像头的实时流(使用 Janus 进行流式传输)。我从其他示例创建了以下函数。它在流初始化后调用,但 analyser.g
我从 WebRTC 获得包含音频数据的 MediaStream。我们将此流称为 srcStream。 如果我有 HTML 然后我就跑了 audioEl = document.querySelecto
我正在尝试使用 WebAudio,并使用以下 javascript 代码加载声音。 function playAudio(){ var audio = document.getElementB
这是我的代码: var ac = new webkitAudioContext(); 按下播放按钮时: var source = ac.createBufferSource(); source.buf
我正在尝试用来自慢速振荡器 sine 的脉冲调制 saw 频率。我究竟做错了什么? jsFiddle 在这里:https://jsfiddle.net/06ua9zLo/ window.AudioCo
每当我使用如下代码播放声音时 // binaryData = a wave file from a websocket let ctx = new AudioContext(); ctx.decode
我正在尝试将 webaudio 节点的输出记录到 .wav。 以前,我一直在使用 recorderjs - 它使用 scriptProcessorNode 来捕获音频数据,但现在似乎已经停止工作了。
一段时间以来,我一直遇到一个问题,在某些 iOS 设备上,我的网络音频系统似乎只能与耳机一起使用,而与其他设备(完全相同的操作系统、型号等)一样,音频通过扬声器播放得非常好或耳机。我已经搜索了解决方案
我正在尝试使用通过 WebRTC 获得的音频进行声音平移,但使用下面的代码它根本不输出任何声音。但是,当我对本地音频 MediaStream 执行相同的操作时,它会起作用。 可能是什么问题? var
我想将AudioBuffer导出到带有StereoPanner节点的wav文件中,即我向左平移声音并向左平移输出声音。我想知道是否可以导出与AudioContext关联的StereoPanner数据?
无法通过createAnalyser处理音频数据。将远程音频流连接到分析仪时,声音将静音或无法播放。这会变得固定,令人沮丧吗 最佳答案 您可以在此处看到带有远程音频和createAnalyser的完整
Byte-beats是制作低保真音乐的一种有趣方式。我想使用 WebAudio API 自己制作一些音乐。这是我当前的代码: const sampleRate = 8000; const frameC
如果我在以下 2D 排列中有一个监听器和一个平移器节点 panner ----> listener | |
我正在尝试构建一些代码,通过将一些 JavaScript 注入(inject)到页面中来处理其他页面中找到的音频。我的印象是我可以创建一个 AudioContext,然后创建一个 onaudiopro
假设我制作一个像这样的简单 Canvas 绘图应用程序: 我现在有一系列的观点。我如何将它们提供给一些 WebAudio 对象(振荡器或由字节数组或其他东西发出的声音)以实际生成并播放它们的波形(在本
如何使用 webaudio API 对振荡器停止播放后发生的事件进行编程?我试图通过更新我的 Vue 组件,在播放音符时 react 性地让数据显示在 DOM 中。我的代码如下所示:
因此,我使用 WebAudio API 显示来自麦克风的声音流的波形和 FFT。 我的问题是,在特定时刻每个数据数组有多大?例如,查看 getByteTimeDomainData来自 Analyser
我有一个合成声音的振荡器,我在不同的时间在音序器中启动它。下面的代码在我的声音开始之前运行(这段代码可以在音频开始之前运行很多次,其中时间是一个变量)。 osc.start(time); osc.st
我想使用 ScriptProcessorNode 接口(interface)处理音频,但无法写入输出缓冲区。 var node = context.createScriptProcessor(256,
每当我尝试一个简单的振荡器(检查 this example 。它不是我的,但它显示同样的问题)我在开始和结束时听到“咔哒”声。 我怎样才能绕过这个问题? 最佳答案 要停止咔嗒声,您需要平滑地斜升振荡器
我是一名优秀的程序员,十分优秀!