当前位置: 首页 > 知识库问答 >
问题:

有没有办法使用Web音频API对音频流重新采样?

强硕
2023-03-14

我目前正在使用Web音频API。我设法“读懂”了一个麦克风,并将它播放给我的扬声器,这非常无缝。

使用Web Audio API,我现在想重新取样传入的音频流(又名麦克风)从44.1kHz到16kHz。16kHz,因为我正在使用一些需要16kHz的工具。由于44.1kHz除以16kHz不是整数,我相信我不能简单地使用低通滤波器和“跳过样本”,对吗?

我还看到一些人建议使用。createScriptProcessor(),但由于它已被弃用,我觉得使用它有点不好,所以我现在正在寻找一种不同的方法。此外,我不一定需要音频上下文。目的地听到它!如果我得到重采样输出的“原始”html" target="_blank">数据,仍然可以。

  • 创建音频上下文({sampleRate:16000})--

主要的js公司

...
microphoneGranted: async function(stream){
    audioContext = new AudioContext();
    var microphone = audioContext.createMediaStreamSource(stream);
    await audioContext.audioWorklet.addModule('resample_proc.js');
    const resampleNode = new AudioWorkletNode(audioContext, 'resample_proc');
    microphone.connect(resampleNode).connect(audioContext.destination);
}
...

重新采样过程。js(假设只有一个输入和输出通道)

class ResampleProcesscor extends AudioWorkletProcessor {
    ...
    process(inputs, outputs, parameters) {
        const input = inputs[0];
        const output = outputs[0];
    
        if(input.length > 0){
            const inputChannel0 = input[0];
            const outputChannel0 = output[0];
    
            for (let i = 0; i < inputChannel0.length; ++i) {
                //do something with resample here?
            }
    
            return true;
        }
    }
}
registerProcessor('resample_proc', ResampleProcesscor);

非常感谢。

共有1个答案

周墨一
2023-03-14

您的总体想法看起来不错。虽然我无法提供进行重采样的代码,但我可以指出您可能希望从采样率转换开始。方法1在L/M=160/441时适用。设计过滤器需要一些工作,但只需要完成一次。您还可以搜索多相过滤以获取有关如何有效执行此操作的提示。

chrome在各个部分所做的是使用窗口化的sinc函数在任何一组费率之间重新取样。这是维基百科链接中的方法2。

 类似资料:
  • 我正在用ffmpeg从flac文件制作mp3。这对我来说通常是哼哼。 今晚,由于某种原因,当我使用我一直使用的相同命令时,转换后的音频会失真。_故障排除后,出现“采样率”标志。 我的命令: MP3中的音频然后被一个顶起的增益所扭曲,导致数字剪辑。 我尝试更新ffmpeg,然后问题仍然存在。我尝试过转换各种采样率(44.1k源文件,48k源文件,96k源文件)44.1k和48kmp3,问题仍然存在,

  • 我正在尝试用HLS格式录制rtsp流。我需要同时录制音频和视频。使用下面的命令,可以录制一些流的视频和音频,比如来自Internet rtsp://wowzaec2demo.streamlock.net/vod/mp4:bigbuckbunny_115k.mov的测试rtsp流。至于我的IP相机,它不工作,意味着视频被录制,但没有音频输出文件。 这是我的IP相机的命令行输出,同时开始录制上面的命令

  • 我有一个传递客户端PCM或ADPCM数据的服务器。 我最初决定使用PCM是因为我不想处理编码和解码。 我让PCM工作,但在每一个音频块之间,我听到毛刺。(有点像剪辑) 所以我想原因可能是延迟/高质量的音频和所有这些东西。 所以我决定使用ADPCM来减少数据量。我用JavaScript编写了一个adpcm到pcm解码器。这是个麻烦。我希望,由于数据计数减少了,也许这会阻止小故障(数据将赶上正在播放的

  • 这里有一个超级简单的例子,我正在尝试在Chrome的iphone上运行。其他的web音频API示例,比如这个http://alxgbsn.co.uk/wavepad/work,但不包括我的:( 知道怎么了吗? 编辑 总结一下答案: 启动音频以响应用户交互 检查静音开关是否关闭

  • 我有一个通过USB端口与Android连接的音频类设备(外部麦克风),我想记录来自USB外部麦克风的声音。 目前我正在使用AudioRecorder类,通过该类功能,我可以从外部麦克风录制音频。但它在下面列出的某些情况下失败。 当用户通过AUX端口连接任何有线耳机时,AudioRecorder将从AUX端口耳机开始录音 蓝牙耳机的情况也是如此 我无法禁用辅助端口 我已经尝试了以下解决方案 Audi

  • 我对编写Flask API真的很陌生。有没有办法将Android设备上录制的音频文件发送到我的flask服务器?我应该逐字节发送音频文件,还是有办法直接发送?