web-dev-qa-db-ja.com

AudioContext(getUserMedia)のサンプルレートを変更する

GetUserMediaを介して48000Hzの記録を記録しようとしています。しかし、運がなければ。返されるオーディオMe​​diaStreamは、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に変更するにはどうすればよいですか?

[〜#〜] edit [〜#〜]:48000Hzでwavファイルを記録およびエクスポートできるフラッシュソリューションでも大丈夫です

22
f.lorenzo

私の知る限り、オーディオコンテキスト内でサンプルレートを変更する方法はありません。サンプルレートは通常、録音デバイスのサンプルレートであり、そのままです。したがって、次のような記述はできません。

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

ただし、オーディオストリームを取得してリサンプリングし、バックエンドに送信する(またはWeb Audio 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
    }
15
basilikum

サンプリングレートを設定できないことに関する未解決のバグがあるようです。

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

Chromeの問題:

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

最新のChromiumコードを確認しましたが、サンプリングレートを設定できるものは何もありません。

編集:Chromeに実装されているようですが、現在破損しています-Chromiumの問題のコメントを参照してください。

5
Timmmm

できません。 AudioContextのサンプルレートはブラウザ/デバイスによって設定され、変更するためにできることは何もありません。実際、あなたのマシンの44.1kHzは私のマシンでは48kHzであるかもしれません。 OSがデフォルトで選択するものによって異なります。

また、すべてのハードウェアがすべてのサンプルレートに対応しているわけではないことに注意してください。

3
Brad

OfflineAudioContext を使用して、基本的にオーディオバッファーを異なるサンプルレートにレンダリングできます(ただし、これはバッチ操作です)。

したがって、通常のオーディオコンテキストを使用して録音を記録し、その後、異なるサンプルレートでOfflineAudioContextを使用してバッファーをレンダリングします。 Mozillaページに例があります。

2

クロムに追加されました:

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

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

1
Sean

現在仕様に含まれていますが、Chromiumにはまだ実装されていません。また、bugs.chromium.orgでは、「Status:Available」は実装されているという意味ではありません。誰も作業しておらず、作業をしたい人なら誰でも利用できるということです。したがって、「使用可能」は「割り当てられていない」という意味です。

0
Julien