【发布时间】:2015-10-20 14:39:18
【问题描述】:
此代码适用于 Windows 7 的 Firefox。它在扬声器上播放转换后的麦克风。它由 javascript 代码转换为音频幅度从 -1 到 1 的数字,每秒多次。它有 1/3 秒的延迟,但相同的硬件在 java 中运行得更快,我的https://sourceforge.net/projects/jsoundcard 软件通过时序统计调整缓冲区使用。当 OS 进程线程优先级提高时,它们都会变得更快,但 java 仍然快得多。没有理由 Firefox 或 Web Audio API 应该有更多的延迟,即使它已成为浏览器中无法正常运行的规范,但随着 HTML5(这是一个正在开发的开放标准)的变化。 Web Audio API 中是否有调整麦克风缓冲区大小的地方?
var volume = .7;
var maxMicrophoneAmplitude = 1;
var soundFunc = function(ins, outs){
var microphoneAmplitude = ins[0];
var estimatedFramesPerSecond = 44100;
var decaySeconds = .1;
var decay = 1/(estimatedFramesPerSecond*decaySeconds);
maxMicrophoneAmplitude = Math.max(maxMicrophoneAmplitude, microphoneAmplitude)*(1-decay);
microphoneAmplitude/maxMicrophoneAmplitude * volume
outs[0] = microphoneAmplitude/maxMicrophoneAmplitude * volume;
};
soundFunc.inSize = 1;
soundFunc.outSize = 1;
var inputNodes = {};
window.onload = function(){
var context = new AudioContext();
if(!navigator.getUserMedia && navigator['mozGetUserMedia']){
navigator.getUserMedia = navigator['mozGetUserMedia'];
}
if(!navigator.getUserMedia && navigator['webkitGetUserMedia']){
navigator.getUserMedia = navigator['webkitGetUserMedia'];
}
if(!navigator.getUserMedia && navigator['msGetUserMedia']){
navigator.getUserMedia = navigator['msGetUserMedia'];
}
var framesPerBuffer = 1024;
var scriptNode = context.createScriptProcessor(framesPerBuffer, 1, 1);
scriptNode.onaudioprocess = function(audioProcessingEvent){
var inputBuffer = audioProcessingEvent.inputBuffer;
var outputBuffer = audioProcessingEvent.outputBuffer;
var chansIn = [];
var chansOut = [];
for(var c=0; c<inputBuffer.numberOfChannels; c++){
chansIn[c] = inputBuffer.getChannelData(c);
}
for(var c=0; c<outputBuffer.numberOfChannels; c++){
chansOut[c] = outputBuffer.getChannelData(c);
}
var ins = new Float32Array(inputBuffer.numberOfChannels);
var outs = new Float32Array(outputBuffer.numberOfChannels);
for(var f=0; f<framesPerBuffer; f++){
for(var c=0; c<inputBuffer.numberOfChannels; c++){
ins[c] = chansIn[c][f];
}
soundFunc(ins, outs);
for(var c=0; c<outputBuffer.numberOfChannels; c++){
chansOut[c][f] = outs[c];
}
}
}
if(navigator.getUserMedia){
navigator.getUserMedia(
{'audio':true},
function(stream){
var input = context.createMediaStreamSource(stream);
//http://stackoverflow.com/questions/22860468/html5-microphone-capture-stops-after-5-seconds-in-firefox says to save a reference to avoid sound ending after 5 seconds
inputNodes.mic = input;
input.connect(scriptNode);
scriptNode.connect(context.destination);
input.start();
},
function(e){ alert('Error capturing audio. e='+e); }
);
}else alert('getUserMedia not supported in this browser.');
};
【问题讨论】:
标签: buffer delay web-audio-api microphone