11

リアルタイムの音声通話アプリケーションを構築しようとしています。私の目標は、ネイティブ JS マイク API を使用し、websocket 経由で他のクライアントにデータを送信することです。次のコードを見つけました。

<script>
// Globals
var aCtx;
var analyser;
var microphone;

navigator.getUserMedia_ = (   navigator.getUserMedia
                           || navigator.webkitGetUserMedia 
                           || navigator.mozGetUserMedia 
                           || navigator.msGetUserMedia);

if (navigator.getUserMedia_) {
    navigator.getUserMedia_({audio: true}, function(stream) {
        aCtx = new webkitAudioContext();
        analyser = aCtx.createAnalyser();
        microphone = aCtx.createMediaStreamSource(stream);
        microphone.connect(analyser);
        process();
    });
};
function process(){
    console.log(analyser);
    setInterval(function(){
        FFTData = new Float32Array(analyser.frequencyBinCount);
        analyser.getFloatFrequencyData(FFTData);

        console.log(FFTData); // display
    },10);
}

</script>

10msごとにバッファを取得し、ノード経由で送信します。問題は、バッファを再生する方法を理解できなかったことと、バッファを正しい方法で取得しているかどうかさえわからないことです。私はもう試した:

var source = audioContext.createBufferSource();
var buffer; // the result printed in the code below
var audioBuffer = audioContext.createBuffer(1, buffer.length, 44100);
audioBuffer.getChannelData(0).set(buffer);
source.buffer = audioBuffer;
source.connect(audioContext.destination);

バッファを正しく取得していますか? どうすればプレイできますか?

4

1 に答える 1

6

バッファの再生を発行するには、インスタンスでstartメソッドAudioBufferSourceNodeを呼び出す必要があります。ここでの問題は、オーディオ ストリームを再生したいのですがAudioBuffer、このために設計されていないことです。AudioBufferオブジェクトを作成し、データを入力してインスタンスに提供し続けるAudioBufferSourceNodeと、サウンドに顕著な一時停止が確実に発生します。

代わりに、キャッシュ バッファーを保持し、データが到着したらすぐにいっぱいにし、通常の速度で空にする必要があります (すぐにではなく、十分なミリ秒のオーディオが含まれるまで待つ必要があります)。

これを行う最善の方法は、提供されている適切な API を使用することです: http://www.w3.org/TR/webaudio/#MediaStreamAudioDestinationNode-sectionhttp://www.w3.org/TR/webaudio/ #MediaStreamAudioSourceNode-section .

于 2013-11-28T02:09:14.670 に答える