更改AudioContext(getUserMedia)的采样率

34

我试图通过getUserMedia录制一段48000Hz的音频,但是没有成功。返回的音频媒体流是44100Hz。我该如何将其设置为48000Hz?

以下是我的代码片段:

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,但没有成功。

我如何将sampleRate更改为48000Hz?

编辑:现在我们也可以使用Flash解决方案来记录和导出48000Hz的wav文件。

7个回答

19
据我所知,在音频上下文中没有改变采样率的方法。采样率通常是您录制设备的采样率,并将保持不变。因此,您将无法编写类似以下内容的代码:

据我所知,在音频上下文中没有改变采样率的方法。采样率通常是您录制设备的采样率,并将保持不变。因此,您将无法编写类似以下内容的代码:

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

然而,如果您想要获取音频流,并将其重新采样后发送到后端(或在Web Audio API之外执行其他操作),则可以使用外部采样率转换器(例如https://github.com/taisel/XAudioJS/blob/master/resampler.js)。

   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
    }

1
谢谢你的回复,但是重新采样录音的版本不可行。不过这对于其他寻找转换采样率方法的人来说是一个好答案。 - f.lorenzo
好的,纯属出于好奇:你想用你的音频流做什么?你想要以某种方式保存它还是有其他目标? - basilikum
很遗憾,由于公司政策的原因,我无法告诉您它的用途。但正确的采样率是必须的。 - f.lorenzo
1
好的,我明白了。如果您可以控制应用程序使用的环境(浏览器、操作系统),那么也许您可以直接更改音频设备的默认采样率。 - basilikum
1
音频上下文采用输出设备的采样率而不是输入设备的采样率。来源 - octavn
@basilikum 很好的观点。我有类似的需求。在我的情况下,我向服务器发送音频记录(应用程序是语音机器人)。在我的测试中,我正在经历输入音频设备“供应”32位/ 48KHz,并且我想将其减少到8/16 8/16Khz(足够用于语音消息),以减少客户端/服务器音频数据交换中无用的网络带宽(通过socketio)。我正在经历的奇怪行为是getUserMedia似乎不接受任何音频位/速率约束:https://dev59.com/j7voa4cB1Zd3GeqP7aBO - Giorgio Robino

5

4

注意:此答案已过时。


你无法更改AudioContext的采样率,因为它是由浏览器/设备设置的。实际上,你会发现在你的机器上44.1kHz可能在我的机器上是48kHz。这取决于操作系统的默认设置。

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


我明白了,谢谢你。可能有一种闪存解决方案支持48kHz吗?(如果某些硬件不支持也无所谓) - f.lorenzo
@f.lorenzo 或许吧。你应该发布一个不同的问题,因为Flash的答案与Web Audio API完全不同。 - Brad

4

2
是的。但它在Firefox上不起作用(在2021年夏季)。 - Oto Brglez

4
audioContext = new AudioContext({sampleRate: 48000})

创建AudioContext对象时仅设置采样率,这对我起作用了。


2
仅在sampleRate已经是参数中的值时工作。 - Galigator
这对我有用;但是,如果您正在使用 recorderjs,则需要修改 encodeWAV 函数。它的字节速率标头是硬编码的。我将其更改为(sampleRate * numChannels * 2)。 - bitbytten

2
您可以使用离线音频上下文来将您的音频缓冲区基本上渲染为不同的采样率(但这是批量操作)。

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


0
现在它已经在规范中了,但在Chromium中尚未实现。 同样在bugs.chromium.org上,“状态:可用”并不意味着它已经被实现。它只是意味着没有人在处理它,而且对于任何想要处理它的人都是可用的。因此,“可用”表示“未被分配”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接