WebAudio API を使って video タグで再生されている dual mono な音声を切り替える
dual mono とは
- https://ja.wikipedia.org/wiki/%E9%9F%B3%E5%A3%B0%E5%A4%9A%E9%87%8D%E6%94%BE%E9%80%81
- 日本のデジタル放送で、主音声と副音声をそれぞれステレオの 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 不要でした。
https://twitter.com/mohayonao/status/771656434618478592
https://twitter.com/mohayonao/status/771658856447434752