29

我试图通过 getUserMedia 录制 48000Hz 的录音。但没有运气。返回的音频 MediaStream 返回 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,但没有运气。

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

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

4

7 回答 7

16

据我所知,没有办法在音频上下文中更改采样率。采样率通常是您的录音设备的采样率,并将保持这种状态。因此,您将无法编写如下内容:

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

但是,如果您想获取音频流,对其重新采样,然后将其发送到后端(或者在 Web 音频 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
    }
于 2015-05-04T14:01:17.740 回答
5

看起来有一个关于无法设置采样率的开放错误:

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

还有一个 Chrome 问题:

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

我检查了最新的 Chromium 代码,里面没有任何东西可以让你设置采样率。

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

于 2016-04-13T08:17:19.413 回答
4
audioContext = new AudioContext({sampleRate: 48000})

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

于 2019-12-17T10:43:33.187 回答
3

注意:此答案已过时。


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

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

于 2015-05-04T13:58:45.963 回答
3

它已被添加到 chrome 中:

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

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

于 2019-06-08T06:48:07.273 回答
2

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

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

于 2016-07-19T14:26:30.333 回答
0

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

于 2017-07-13T15:18:34.607 回答