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 不要でした。
@shunirr ChannelMergerはなくても良いと思いますよ https://t.co/gw4vYyl75B
— モハヨナオ (@mohayonao) 2016年9月2日
@shunirr ウェブオーディオは適当に使うとチャネルを勝手に調整してくれるので、Splitterでステレオ→モノラルにして、そのあとステレオなdestinationがモノラル入力をステレオに変換してくれるといった具合です。
— モハヨナオ (@mohayonao) 2016年9月2日