WebAudio API を使って video タグで再生されている dual mono な音声を切り替える

dual mono とは

WebAudio API を使って video タグで再生している動画の音を入れ替える

WebAudio API に知見が無くて出来るかどうか分からなかったんだけど、 video タグを指定して簡単に source を取得することができる。

var video = document.getElementById("video");
var audioCtx = new (window.AudioContext || window.webkitAudioContext)();
var audioSource = audioCtx.createMediaElementSource(video);

この取得した audioSource を使って色々やることで音声を加工することが出来る。 dual mono だと、主音声だと L の音のみを採用して L と R に出力すればよい。

これを行なうには ChannelSplitter で分離して ChannelMerger を繋ぎ直すというのをする。

Splitter 、 Merger で指定している番号の 0 は L 、 1 は R となっている。

function selectAudioChannel(type) {
  var splitter = audioCtx.createChannelSplitter(2);
  var merger = audioCtx.createChannelMerger(2);
  audioSource.disconnect();
  audioSource.connect(splitter);
  switch (type) {
    case "L":
      splitter.connect(merger, 0, 0);
      splitter.connect(merger, 0, 1);
      break;
    case "R":
      splitter.connect(merger, 1, 0);
      splitter.connect(merger, 1, 1);
      break;
    default:
      splitter.connect(merger, 0, 0);
      splitter.connect(merger, 1, 1);
      break;
  }
  merger.connect(audioCtx.destination);
}

ただし、この方法は現状 Chrome でしか動いていない。 Safari にもきてくれ…。

まとめ

追記 (9/2 19:33)

ChannelMerger 不要でした。

https://twitter.com/mohayonao/status/771656434618478592

https://twitter.com/mohayonao/status/771658856447434752

https://gist.github.com/896ceb6ef69160c033e002237b62f2a7

gist896ceb6ef69160c033e002237b62f2a7