どんな現象?
getUserMediaを使ってブラウザから音声を取得する際に、
元の音声はステレオなのに、取得後の音声がモノラルに合成されてしまう。
具体的には、以下の図のように、
ステレオの入力音声(Input)をgetUserMediaで取得した音声(streamData)は、
入力音声のLRがモノラル合成された音声が2chで出てくるという、
なんとも残念な結果になる。
WebChatのようにヘッドセットからモノラルで音声入力する場合は問題にならないが、
音楽データをステレオ入力する場合などは、モノラル合成されてしまうと困ることがある。
理由
getUserMediaにはエコーキャンセラ機能が備わっているらしい。
これがデフォルトでオンになっており、
エコーキャンセラ動作の前段でステレオ入力がモノラルに変換されてしまうそうだ。
回避方法
getUserMediaのconstraintsに、
エコーキャンセラを無効化する設定を追加すればOK。
sample.js
// constraints
var constraints = {
video: false,
audio: { echoCancellation: false } // エコーキャンセラ無効化
};
// constraints (Chrome)
if (window.chrome) {
var constraints = {
video: false,
audio: {mandatory: {echoCancellation : false, googEchoCancellation: false}}
};
}
// Initialize getUserMedia
navigator.getUserMedia = ( navigator.getUserMedia ||
navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia ||
navigator.msGetUserMedia);
if (navigator.getUserMedia) {
navigator.getUserMedia (
constraints,
// successCallback
function(stream) {
var source = context.createMediaStreamSource(stream);
},
// errorCallback
function(err) {
alert('The following error occurred: ' + err);
}
);
} else {
alert('getUserMedia not supported');
}
参考