« Web IntentsでWebRTCを使って、WebCamからの画像を取得するChrome Extension作った | メイン | WebRTCとWeb Audio APIを使って「声が遅れて聞こえてくるよ」を実装しました。 »

getUserMediaで取得したMediaStreamをWeb Audio APIで処理してWebRTCに戻す方法を探る

Web Audio APIWebRTCChrome
使Google Chrome Canary
stableChromechrome:flagsgetUserMedia()  Web Audio API 使CanaryCanary

Working DraftEditor's Draft
CanaryEditor's Draft
WebRTCとWeb Audio APIの概要がわからないとこのエントリーに何が書いてあるのかさっぱりだと思うので、ほんの少しだけ説明。
WebRTCを使ったビデオチャットの大まかな流れ
navigator.getUserMediaを使ってMediaStreamを取得。
MediaStreamをvideo要素に設定(ローカルの映像と音声)。
別途取得した、RTCPeerConnectionにMediaStreamを設定(送信用)。
ICEやSDPを使って相手の接続情報を取得しリモートに接続(ここ、超適当な説明)。
リモートのMediaStreamを取得し、video要素に設定(リモートの映像と音声)。
Web Audio APIの概念
Web Audio APIAudioNode

Yahoo!PipesMac OSXQuartz Composer

AudioNode
JavaScriptAudioNode
getUserMediaで取得したMediaStreamをWeb Audio APIで処理してWebRTCに戻すには
Web Audio APIMediaStreamWebRTC
2

MediaStreamAudioSourceNode
MediaStreamAudioNode
AudioContext#createMediaStreamSource()
(Working Draft)

MediaStreamAudioDestinationNode
MediaStreamAudioNode
AudioContext#createMediaStreamDestination()
MediaStreamAudioDestinationNode#streamMediaStream
(Editor's Draft)

使

BiquadFilterNode
2AudioNode
AudioContext#createBiquadFilter()
使
getUserMediaから取得したMediaStreamをWeb Audio APIに渡す
まず、MediaStreamをWebAudio APIで処理してみます。
スピーカーに直接音を渡すAudioContext.destinationに接続すると、正常に音がWeb Audio APIに渡っているのが確認できます。
var audioContext = new webkitAudioContext();
var mediastreamsource;

var lowpassfilter = audioContext.createBiquadFilter();
lowpassfilter.type = 0;
lowpassfilter.frequency.value = 440;

function initialize() {
    navigator.webkitGetUserMedia(
        {audio : true},
        function(stream) {
            mediastreamsource = audioContext.createMediaStreamSource(stream);
            mediastreamsource.connect(lowpassfilter);
            lowpassfilter.connect(audioContext.destination);
        },
        function(e) {
            console.log(e);
        }
    );
}

window.addEventListener("load", initialize, false);
Web Audio APIからMediaStreamを取り出しaudio要素に設定


Canary
Web Audio APIMediaStream

var audioContext = new webkitAudioContext();
var mediastreamsource;
var mediastreamdestination = audioContext.createMediaStreamDestination();

var lowpassfilter = audioContext.createBiquadFilter();
lowpassfilter.type = 0;
lowpassfilter.frequency.value = 440;

var audioElement;

function initialize() {

    audioElement = document.getElementById("audio");

    navigator.webkitGetUserMedia(
        {audio : true},
        function(stream) {
            mediastreamsource = audioContext.createMediaStreamSource(stream);
            mediastreamsource.connect(lowpassfilter);
            lowpassfilter.connect(mediastreamdestination);
            audioElement.src = webkitURL.createObjectURL(mediastreamdestination.stream);
            audioElement.play();
        },
        function(e) {
            console.log(e);
        }
    );

}

window.addEventListener("load", initialize, false);
まとめと所感
MediaStreamWeb Audio APIWeb Audio APIMediaStream
Working DraftEditor's Draft使



調MediaStream Processing APIDraftHTMLCanvasElement#canvas
canvasstream調
MediaStream Processing APIについては、以下の記事で触れられていますが、使えるようになるにはまだまだ時間がかかりそうです。

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

Google

タグ クラウド