7
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

getUserMediaでステレオ入力がモノラルに変換されてしまう現象の回避

Last updated at Posted at 2016-09-22

どんな現象?

getUserMediaを使ってブラウザから音声を取得する際に、
元の音声はステレオなのに、取得後の音声がモノラルに合成されてしまう。
具体的には、以下の図のように、
ステレオの入力音声(Input)をgetUserMediaで取得した音声(streamData)は、
入力音声のLRがモノラル合成された音声が2chで出てくるという、
なんとも残念な結果になる。

スクリーンショット 2016-09-23 0.39.56.png

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');
  }

参考

7
8
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?