我试图通过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文件
答案 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对象时只需设置采样率,这对我有用