如果麦克风样本丢失,我需要一个计数器来记录麦克风丢失的帧或事件。我需要这些信息来完善定时麦克风信号和音频输出信号。
我有代码:
$micStream=await navigator.mediaDevices.getUserMedia(
{
audio:
{
echoCancellation: false,
noiseSuppression: false,
autoGainControl: false,
}
}
);
$micAudioCtx=new AudioContext();
$micMS=$micAudioCtx.createMediaStreamSource($micStream);
if($micAudioCtx.audioWorklet && $micAudioCtx.audioWorklet.addModule)
{
var $data=`
class RecorderProcessor extends AudioWorkletProcessor
{
bufferSize=17640;
written=0;
buffer=new Float32Array(this.bufferSize);
frame=0;
process($inputs)
{
var $cd=$inputs[0][0];
var $cf=currentFrame;
if(!$cd) return true;
if(this.frame<$cf && $cf-this.frame<500000)
{
for(var $i=this.frame; $i<$cf; $i++)
{
this.buffer[this.written++]=0;
if(this.written===this.bufferSize)
{
this.port.postMessage(this.buffer.slice(0, this.bufferSize));
this.written=0;
}
}
}
this.frame=$cf+$cd.length;
for(var $i=0, $c=$cd.length; $i<$c; $i++)
{
this.buffer[this.written++]=$cd[$i];
if(this.written===this.bufferSize)
{
this.port.postMessage(this.buffer.slice(0, this.bufferSize));
this.written=0;
}
}
return true;
}
}
registerProcessor('VAProcessor', RecorderProcessor);
`;
$data='data:text/javascript;base64,'+btoa($data);
await $micAudioCtx.audioWorklet.addModule($data);
$micRec=new AudioWorkletNode($micAudioCtx, 'VAProcessor');
$micRec.port.onmessage=function($e){anyFunctionToProcessSamples($e.data);};
Firefox 会随机丢失麦克风中的一个(或少量)样本。例如在较高负载或启动其他应用程序期间。我需要有关样本丢失的信息以及丢失样本的数量。
顺便说一句。我将无法回答你的问题。我向 Stack Overflow 支持人员报告了该问题,但没有任何反应...
我也将不胜感激任何建议。
由于所涉及过程的异步性质,在实时音频处理中检测丢失的样本或丢帧可能具有挑战性。在 Web 环境中处理麦克风输入时,由于各种原因(例如系统负载、浏览器资源分配或硬件限制),可能会出现样本丢失的情况。 您共享的代码似乎实现了用于处理麦克风输入的
AudioWorkletProcessor
,但它缺乏用于检测或计数丢失样本的显式处理。为了解决这个问题,采用一种机制来检测和计算丢失的样本可能有助于监控音频输入的稳定性。
潜在检测丢失样本的一种方法是实施基于时间戳的系统。您可以利用与从麦克风接收的每个样本缓冲区关联的时间戳信息来跟踪是否有任何丢失的样本。时间戳的差异可能表明丢帧或丢失样本。以下是如何修改代码以纳入检测和计算丢失样本的基本机制的示例:
// Inside RecorderProcessor class
class RecorderProcessor extends AudioWorkletProcessor {
// ...
constructor() {
super();
this.expectedFrame = 0;
this.lostSamplesCount = 0;
}
process($inputs, $outputs, $parameters) {
// ...
const $cd = $inputs[0][0];
const currentFrame = this.getTimestamp(); // Implement getTimestamp function
if (!$cd) return true;
// Check for missing frames
if (currentFrame > this.expectedFrame) {
const lostSamples = currentFrame - this.expectedFrame;
this.lostSamplesCount += lostSamples;
console.log(`Lost ${lostSamples} samples at frame ${this.expectedFrame}`);
}
// Update expected frame
this.expectedFrame = currentFrame + $cd.length;
// Process samples as before
// ...
return true;
}
// ...
}
实现
getTimestamp()
将涉及检索或计算与从麦克风接收的样本的每个缓冲区相关的时间戳。该时间戳可以基于音频上下文的时间或自定义时间戳机制。
值得注意的是,这种方法提供了如何通过比较预期时间戳与接收时间戳来检测丢失样本的基本说明。实际的实现可能会根据时间戳的精度、系统行为和浏览器的具体情况而有所不同。对于Firefox中偶尔出现的样本丢失,可能与浏览器资源分配或系统负载有关。优化代码并考虑浏览器特定的怪癖可能会缓解此类问题。
请记住,此建议只是一个起点,可能需要根据您的具体用例、系统行为以及设置中样本丢失的实际原因进行调整。
始终参考最新的浏览器文档并考虑跨多个浏览器进行测试,以确保检测丢失样本时的交叉兼容性和可靠性。