更改AudioContext的采样率(getUserMedia)

时间:2015-05-04 13:35:54

标签: javascript getusermedia sample-rate audiocontext

我试图通过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,但没有运气。

如何将sampleRate更改为48000Hz?

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

7 个答案:

答案 0 :(得分:14)

据我所知,无法在音频上下文中更改采样率。采样率通常是您的录音设备的采样率,并将保持这种方式。所以你将无法写出这样的东西:

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

但是,如果您想要获取音频流,重新取样然后将其发送到后端(或者在Web Audio API之外用它做其他事情),您可以使用外部采样率转换器(例如{ {3}})。

   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 :(得分:4)

看起来有一个关于无法设置采样率的漏洞:

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

还有Chrome问题:

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

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

答案 2 :(得分:3)

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

另外请记住,并非所有硬件都具备所有采样率。

答案 3 :(得分:2)

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

它已添加到chrome:

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

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

答案 6 :(得分:0)

audioContext = new AudioContext({sampleRate: 48000})

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