【问题标题】:Change sample rate of AudioContext (getUserMedia)更改 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 文件的闪存解决方案

【问题讨论】:

    标签: javascript getusermedia sample-rate audiocontext


    【解决方案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 中,“状态:可用”并不意味着它已实现。这只是意味着没有人在处理它,并且任何想要处理它的人都可以使用它。所以“可用”意味着“未分配”。

          【讨论】:

            猜你喜欢
            • 2017-11-07
            • 2013-10-25
            • 1970-01-01
            • 1970-01-01
            • 2018-08-25
            • 1970-01-01
            • 1970-01-01
            • 2015-10-05
            • 1970-01-01
            相关资源
            最近更新 更多