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

dual mono とは

  • 音声多重放送 - Wikipedia
  • 日本のデジタル放送で、主音声と副音声をそれぞれステレオの L と R に入れる方法
  • 普通に動画エンコードをし、普通のプレイヤーで再生すると L と R から主音声と副音声がそれぞれ聞こえてしまう
  • ffmpeg では dual_mono_mode と言うオプションを指定することで、片方の音声を採用してエンコードすることができる

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 にもきてくれ…。

まとめ

  • dual mono はだるい
  • WebAudio API を使えば dual mono な音声を切り替えることができる
  • しかし Chrome でしか動かない

追記 (9/2 19:33)

ChannelMerger 不要でした。

gist896ceb6ef69160c033e002237b62f2a7