更改 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) 的采样率的主要内容,如果未能解决你的问题,请参考以下文章