标签: web-audio-api

网络音频 API 故障/失真问题

我是网络音频 API 的新手,并制作了一个简单的合成器来了解细节。问题是,在大量声音输入后,我的音频会失真很多。因此,如果我施加大量频率,它就会失真。任何了解 API 的人都可以快速浏览一下我的代码,看看是否存在任何重大错误/遗漏?可以在 Safari、chrome 和 Firefox 中重现问题。演示版本在这里感谢您的帮助!

//start new audio session.
var context = new (window.webkitAudioContext || window.AudioContext || window.mozAudioContext)



function playSound(note) {
    oscillator = context.createOscillator();

//create volume controller
var gainNode = context.createGain();

//connect signal to audio output(speakers by default)
oscillator.connect(gainNode);
gainNode.connect(context.destination);

//adjusts frequency played by 50%, 100% or 200% 
var octave = document.getElementById('octave').value;

//sets oscillator frequency
oscillator.frequency.value = frequencies[note] * octave;

//oscillator wave type
oscillator.type = document.getElementById('waveSelect').value;


//initialize gain at 0 and ramp up to …
Run Code Online (Sandbox Code Playgroud)

javascript web-audio-api

3
推荐指数
1
解决办法
2155
查看次数

如何使用 WebAudio 将多个立体声信号混合为一个?

我正在编写一个网络应用程序,需要将多个立体声声音组合成一个立体声输出,因此我想要一个相当于gstreamer 的 audiomixer element 的元素,但 WebAudio 中似乎没有。ChannelMerger 并不做完全相同的事情 - 它将多个单声道信号合并为一个多通道信号。

AudioNode.connect 的文档表示,您可以将一个输出连接到其他节点的多个输入,并且尝试将同一输出多次连接到同一输入将被忽略。但它并没有说明如果您尝试将多个不同的输出连接到同一输入会发生什么。它会像我想要的那样充当一个简单的混音器吗?我怀疑不是,因为 WebAudio 提供的分离/合并功能(请参阅上面的 ChannelMerger)似乎主要基于多个单声道信号和一个多声道信号之间的转换,以及一个声道到一个单声道信号映射。

我可以采用任意节点(我猜 GainNode 可以工作,并且我可以利用其增益功能)并将其通道解释模式设置为“扬声器”以实际混合通道,但它仅适用于 1、2、4 或 6输入。我不太可能需要超过 6 个,但我肯定需要能够处理 3 个,甚至可能是 5 个。这可以通过使用多个混音器来完成(例如,对于三个通道,在一个混音器中混合输入 1 和 2,然后在第二个混音器中将其输出与输入 3 混合),但我认为我必须添加更多增益节点才能正确平衡混音。混频器大概必须衰减每个输入,以防止重合峰值削波超出范围,因此使用没有补偿的链式混频器,我最终会得到 1/4,1/4,1/2 而不是 1/3,1/3 ,1/3?

web-audio-api

3
推荐指数
1
解决办法
2338
查看次数

WebAudio API:如何访问 AudioWorkletProcessor 中的时间/采样率?

我想实现一个能够感知时间的 AudioWorkletProcessor。例如:如何将DelayNode重新实现为Processor?

MDN 文档说:

根据规范,您的 process() 函数接收到的每个音频块包含 128 个帧(即每个通道 128 个样本),但计划该值将来会发生变化,并且实际上可能会根据情况而变化,因此您应该始终检查数组的长度而不是假设特定的大小。

我可以获取输入长度的帧数,但如何获取使用的采样率?这样我就可以知道这个输入有多长(以秒为单位)。

我的最终目标是能够计算特定时间窗口内信号的平均能量。

class EnergyProcessor extends AudioWorkletProcessor {
  process(inputs, outputs, parameters) {
    if (inputs.length !== 1) {
      throw 'invalid inputs'
    }

    // how much time is covered by inputs?

    inputs[0].forEach((channel, channelID) => {
      let sum = 0
      let count = 0

      channel.forEach((value, i) => {
        sum += value * value
        count += 1

        for (let o = 0; o < outputs.length; o++) {
          // skip when writing x channels to …
Run Code Online (Sandbox Code Playgroud)

html javascript web-audio-api

3
推荐指数
1
解决办法
1198
查看次数

使用HTML5 Web Audio Api录音

有谁知道Web Audio API是否能够保存使用WebAudioContext播放的音频?

web-audio-api

2
推荐指数
1
解决办法
5850
查看次数

在浏览器中以低延迟捕获声音输入

是否可以在浏览器中捕获低延迟声音输入?主要用于录制吉他.(我知道这也取决于硬件,但我们假设硬件足够好).我尝试使用Web Audio API,但它的延迟有些不好.是否有其他技术可以在浏览器中提供高性能的声音输入捕获?是否可以使用Unity3D?

谢谢.

javascript audio unity-game-engine html5-audio web-audio-api

2
推荐指数
1
解决办法
1126
查看次数

WebAudio scriptProcessorNodes*是否需要连接输出?

这是一个简单的jsFiddle链接,它使用网络音频测量实时输入的响度(它将值作为百分比输出到控制台).

http://jsfiddle.net/XSnsF/

我计划有一个输入而没有输出,因为没有必要延迟我的音频信号等待我的自定义节点完成音量.

但是,很明显,如果连接的话,scriptProcessor 只会记录值context.destination.难道我做错了什么?或者这是一个错误?或者这是预期的行为?

function gotStream(stream) {

    var mediaStreamSource = context.createMediaStreamSource(stream);

    var gainNode = context.createGain();
    gainNode.gain.value = 3;

    var levelChecker = context.createScriptProcessor(2048);

    mediaStreamSource.connect(gainNode);
    gainNode.connect(levelChecker);

    //Commenting out the line directly below stops the script processor from working!
    levelChecker.connect(context.destination);
    levelChecker.onaudioprocess = process;

}

function process(e) {
    var buffer = e.inputBuffer.getChannelData(0);

    var maxVal = 0;

    for (var i = 0; i < buffer.length; i++) {

        if (maxVal < buffer[i]) {
            maxVal = buffer[i];
        }
    }

    console.log(Math.round(maxVal * 100) + …
Run Code Online (Sandbox Code Playgroud)

nodes scriptprocessor web-audio-api

2
推荐指数
1
解决办法
399
查看次数

如何使用JavaScript应用基本音频过滤器

我正在努力让基本的音频过滤器工作.我想评估至少3-4个例子.

这是一个我正在评估并尝试工作的JS代码:

var QUAL_MUL = 30;

function FilterSample() {
  this.isPlaying = false;
  loadSounds(this, {buffer: 'techno.wav'});
};

FilterSample.prototype.play = function() {
  // Create the source.
  var source = context.createBufferSource();
  source.buffer = this.buffer;
  // Create the filter.
  var filter = context.createBiquadFilter();
  filter.type = filter.LOWPASS;
  filter.frequency.value = 5000;
  // Connect source to filter, filter to destination.
  source.connect(filter);
  filter.connect(context.destination);
  // Play!
  source.start(0);
  source.loop = true;
  // Save source and filterNode for later access.
  this.source = source;
  this.filter = filter;
};

FilterSample.prototype.stop = function() { …
Run Code Online (Sandbox Code Playgroud)

javascript html5 html5-audio web-audio-api

2
推荐指数
1
解决办法
5438
查看次数

麦克风到扬声器流(JS)

我一直在玩HTML5,但我无法完成以下任务.javascript必须要求获得访问麦克风的权限,然后必须将麦克风输入流式传输到计算机扬声器.这是我的javascript:

navigator.getUserMedia = ( navigator.getUserMedia    || navigator.webkitGetUserMedia ||
                           navigator.mozGetUserMedia ||navigator.msGetUserMedia);
var aCtx;
var analyser;
var microphone;
if (navigator.getUserMedia) {
    navigator.getUserMedia({audio: true}, function(stream) {
        aCtx = new webkitAudioContext();
        analyser = aCtx.createAnalyser();
        microphone = aCtx.createMediaStreamSource(stream);
        microphone.connect(analyser);
        analyser.connect(aCtx.destination);
    });
};
Run Code Online (Sandbox Code Playgroud)

但Chrome(和Opera)说

Uncaught TypeError: Failed to execute 'webkitGetUserMedia' on 'Navigator': 3 arguments required, but only 2 present. 
Run Code Online (Sandbox Code Playgroud)

为什么需要更多的论点?任何人都可以帮我解决这个问题吗?

谢谢.

javascript html5 microphone html5-audio web-audio-api

2
推荐指数
1
解决办法
4765
查看次数

网络音频api发出哔哔声,哔哔声,...以不同的速度发出哔哔声

我试图根据浏览器窗口内的一些传感器读数以不同的速率播放"嘟嘟"声.

当传感器读数很高时,想法是"发出嘟嘟声,嘟嘟声,嘟嘟声,......嘟嘟声",当传感器读数很低时,它会发出"嘟嘟声,......嘟嘟"声,这些都是实时的.

传感器读数通过socket.io传送到浏览器.我已经可以控制进度条上下移动了.音频反馈是一项额外功能.

经过一些谷歌搜索,我正在考虑使用网络音频api,创建一个正弦波振荡器,并通过增益节点连接/断开打开/关闭它.

我的问题是如何以正确的方式控制时序,比如说我试图在1 Hz到20 Hz的频率范围内发出蜂鸣声,并且能够动态地改变频率.

html5-audio web-audio-api

2
推荐指数
1
解决办法
409
查看次数

WebAudio振荡器"点击"

每当我尝试一个简单的振荡器时(查看这个例子,不是我的,但它显示了同样的问题http://webaudioapi.com/samples/oscillator/)我听到一声"咔嗒"声,它开始时和结束时.

如何绕过这个问题?谢谢

javascript html5 web-audio-api

2
推荐指数
1
解决办法
397
查看次数