Ogg Vorbisフォーマットの音源をAAC-LCに変換する話
iPod Touch購入
去年の暮れのこと。
古いiPodにRockboxを入れて、Ogg Vorbis(以下、ogg)フォーマットの音楽ファイルで運用していた。
しかし、既に6年位前のiPodだし、そろそろHDDも古く、限界を感じ、iPod Touchに鞍替えした。
膨大な変換
6000個以上のファイルを扱うとなるとそれに適したWindows用アプリケーションはまずない。あるかも知れないが探すのも億劫だ。となると必然的にコマンドラインを通じてのファイル変換しかなくなる。
とりあえず試したのが、有名なffmpeg。ただ、これ単体ではoggのタグを引き継ぐことが出来なかったため、perlとMusic::TagというCPANモジュールを利用した。正直、自分がプログラマで良かったと思える瞬間だった。
http://www.ffmpeg.org/
http://strawberryperl.com/
http://search.cpan.org/~ealleniii/Music-Tag-OGG-0.4101/lib/Music/Tag/OGG.pm
とある問題
何日間か音楽を聴き続けて、ある違和感を感じる。特に重厚なコーラスや、深いリバーブがかかった曲に顕著にみられる、ある傾向があった。文字だと表現が難しいが音がシュワシュワしている。
少し調べるとffmpegのデフォルトのaacエンコーダはFAACと呼ばれるもので、これがまた低品質だということだ。
幸いffmpegはオープンソースのプロジェクトなため、自前のライブラリを組み込むことができる。Fraunhoferというドイツの研究機関が開発しているaacライブラリ、libfdk_aacの品質が良いということが分かり、組み込んでコンパイル。
ちなみに、以下でダウンロードできるスクリプトを使えば、半自動でコンパイルすることができる。
http://com.nicovideo.jp/community/co1482853
そして、再び変換。
とある問題、再び
今度は音質も問題ない。正直、oggで聴いていたころと区別がつかない。ああ、これで問題ない。良かった良かった、と思っていたのも束の間、別の問題が浮かび上がる。
曲の途中で次のトラックにスキップしてしまうのだ。
明らかにおかしいのでiTunesやWinampでその曲を再生してみると、同じく再生に不備が出る。libfdk_aacのバグだかffmpegのバグだか分からないが、再変換してみると再生に不備が出ないこともある。どうやら、ffmpeg上でのlibfdk_aacを用いた大量の音楽ファイル変換は不安定だという結論に達する。
仕方がないので次の方法を模索する。
解決策
qaacというものがあった。
https://sites.google.com/site/qaacpage/home
AppleのQuickTimeが使用しているエンコーダを無理やり使ってしまうツールだ。QuickTime由来ということはiTunesが使うものと同じ。いけるだろう、これならば。
幸いにもqaacはパイプを利用して、標準出力から得られるデータをエンコードすることもできる。となれば、oggをwavにデコードして、なおかつ標準出力に吐き出すことのできるものがあればいいわけだ。
あった。oggdecというのものが。
http://www.rarewares.org/ogg-oggdec.php
こうなったら後は簡単だ。
perlで組んだタグを引き継ぐプログラムと組み合わせる。
以下、ソースコード。
https://gist.github.com/hisashisatake/4950718
ちなみに、コマンドライン上であれば、このように組み合わせて使う。
C:\> oggdec.exe -o src.ogg | qaac.exe -V 100 --ignorelength - -o dst.m4a
oggdec.exeの部分を、例えばFLACのデコーダに変えたりすると、(wavとして標準出力にストリームできるのであれば)どんなフォーマットでもqaac.exeがaacにしてくれるわけだ。