更改 AudioContext (getUserMedia) 的采样率

Posted

技术标签:

【中文标题】更改 AudioContext (getUserMedia) 的采样率【英文标题】:Change sample rate of AudioContext (getUserMedia) 【发布时间】:2015-07-13 22:09:29 【问题描述】:

我正在尝试通过 getUserMedia 录制 48000Hz 的录音。但没有运气。返回的音频 MediaStream 返回 44100Hz。如何将其设置为 48000Hz?

这是我的代码的 sn-ps:

var startUsermedia = this.startUsermedia;

            navigator.getUserMedia( 
                audio: true, 
                //sampleRate: 48000 
            , startUsermedia, function (e) 
                console.log('No live audio input: ' + e);
            );

startUsermedia 函数:

startUsermedia: function (stream) 
            var input = audio_context.createMediaStreamSource(stream);
            console.log('Media stream created.');
            // Uncomment if you want the audio to feedback directly
            //input.connect(audio_context.destination);
            //__log('Input connected to audio context destination.');

            recorder = new Recorder(input);
            console.log('Recorder initialised.');
        ,

我尝试更改 AudioContext 的属性 sampleRate,但没有成功。

如何将采样率更改为 48000Hz?

编辑:我们现在也可以使用可以录制和导出 48000Hz 的 wav 文件的闪存解决方案

【问题讨论】:

【参考方案1】:

据我所知,没有办法在音频上下文中更改采样率。采样率通常是您的录音设备的采样率,并将保持这种状态。所以你不能写这样的东西:

var input = audio_context.createMediaStreamSource(stream);
var resampler = new Resampler(44100, 48000);
input.connect(resampler);
resampler.connect(audio_context.destination);

但是,如果您想获取音频流,对其重新采样,然后将其发送到后端(或者在 Web 音频 API 之外使用它执行其他操作),您可以使用外部采样率转换器(例如 @ 987654321@)。

   var resampler = new Resampler(44100, 48000, 1, 2229);

   function startUsermedia(stream) 
        var input = audio_context.createMediaStreamSource(stream);
        console.log('Media stream created.');


        recorder = audio_context.createScriptProcessor(2048);
        recorder.onaudioprocess = recorderProcess;
        recorder.connect(audio_context.destination);
    

    function recorderProcess(e) 
        var buffer = e.inputBuffer.getChannelData(0);
        var resampled = resampler.resampler(buffer);
        //--> do sth with the resampled data for instance send to server
    

【讨论】:

谢谢你,但遗憾的是重新采样的录音版本不起作用。但这对于寻找转换 sampleRates 方法的其他人来说是一个很好的答案 好的,那么出于好奇:您想对音频流做什么?你想以某种方式保存它还是你的目标是什么? 很遗憾,由于公司政策,我无法告诉您这样做的目的。但是正确的采样率是必须的。 好的,我明白了。好吧,如果您可以控制使用应用程序的环境(浏览器、操作系统),那么也许您可以直接在那里更改音频设备的默认采样率。 音频上下文采用输出设备的采样率而不是输入设备的采样率。 source.【参考方案2】:

似乎有一个关于无法设置采样率的开放错误:

https://github.com/WebAudio/web-audio-api/issues/300

还有一个 Chrome 问题:

https://bugs.chromium.org/p/chromium/issues/detail?id=432248

我检查了最新的 Chromium 代码,其中没有任何内容可以让您设置采样率。

编辑: 似乎它已在 Chrome 中实现,但目前已损坏 - 请参阅 Chromium 问题中的 cmets。

【讨论】:

【参考方案3】:
audioContext = new AudioContext(sampleRate: 48000)

创建 AudioContext 对象时只需设置采样率,这对我有用

【讨论】:

【参考方案4】:

它已被添加到 chrome 中:

var ctx = new (window.AudioContext || window.webkitAudioContext)( sampleRate:16000);

https://developer.mozilla.org/en-US/docs/Web/API/AudioContext/AudioContext

【讨论】:

是的。但它不适用于 Firefox(2021 年夏季)【参考方案5】:

注意:此答案已过时。


你不能。 AudioContext 的采样率由浏览器/设备设置,您无法更改它。事实上,你会发现你机器上的 44.1kHz 可能是我机器上的 48kHz。它会因操作系统默认选择的内容而异。

还请记住,并非所有硬件都支持所有采样率。

【讨论】:

我明白了,谢谢。是否有支持 48kHz 的闪存解决方案? (有些硬件不支持也没关系) @f.lorenzo 也许吧。您应该为此发布一个不同的问题,因为 Flash 答案与 Web Audio API 完全不同。【参考方案6】:

您可以使用OfflineAudioContext 实质上将您的音频缓冲区渲染为不同的采样率(但这是批处理操作)。

因此,您将使用普通音频上下文录制您的录音,然后使用具有不同采样率的 OfflineAudioContext 来呈现您的缓冲区。 Mozilla 页面上有一个示例。

【讨论】:

【参考方案7】:

它现在在规范中,但尚未在 Chromium 中实现。 同样在 bugs.chromium.org 中,“状态:可用”并不意味着它已实现。这只是意味着没有人在处理它,并且任何想要处理它的人都可以使用它。所以“可用”意味着“未分配”。

【讨论】:

以上是关于更改 AudioContext (getUserMedia) 的采样率的主要内容,如果未能解决你的问题,请参考以下文章

使用 Jest、AudioContext 进行测试和模拟

如何控制(音频缓冲区)AudioContext() 的音量?

将audioContext转换回缓冲区

Safari 上的 AudioContext 问题

web技术分享| AudioContext 实现音频可视化

音频与 AudioContext