mp3 in mka

なんか調べていたときのメモが出てきたのでコピペ。

起動直後の foobar2000 が 20 分ぐらい操作出来ないという現象がかなり前から発生していたんで、なんとかしなきゃと思っていた。んで、いつのまにか Matroska コンテナに添付した画像を表示できる foo_uie_albumart が出ていたので、これを機にfoobar2000 0.9系列に移行した。やっと理想の1アルバム1ファイルが実現出来る!

がしかし、今までに作ってきた mka ファイルの Matroska タグを一部しか読んでくれない。新たにタグを打つと問題無いので、どこか仕様が変わったらしい。調べた結果、mkvextract でチャプターのXMLを抽出し、EditionIDとやらを削除して再muxすると問題無くなった。(後でfoo_input_matroskaのソースをみたらEditionID関係のとこがコメントアウトされてた)

どっちみちジャケット画像を添付するためには再muxが必要なので古いファイルとジャケ画像のURLを指定してやると自動的に再muxしてくれるプログラムをPythonで作って移行完了。ネビュラスレイとサイヴァリアのサントラのジャケ画像が見つからなかった。

tta を使いだす前にリップしたやつはトラックごとの mp3 だとか vorbis になってて、無圧縮ZIPでアーカイブしてある。だが、展開しておかないとタグが変更できないだとか、再生時に一旦メモリ上にファイルを展開するので遅いとかメモリバカ喰いだとかで不満があった。これをなんとか mka にまとめられないかと思い調べた。

複数のソースを直列に繋いで1つのトラックにすることは可能。CUEシートがないのでチャプター情報を作成しないといかんが、これはfoo_cuesheet_creatorで可能。vorbisについては上記2つを考慮して mka に変換するプログラムをPythonで書いた。

しかし、mp3がくせもの。mp3ってのは仕様上、トラックの先頭と末尾にソースには存在しない無音サンプルが水増しされてしまう。これがgapless再生が出来ない原因(のはず)。だがlameなんかでエンコードすると、この水増しサンプルの量を拡張ヘッダに書いてくれる。foobar2000は拡張ヘッダを読んで水増しサンプルを削ってくれるからgapless再生が出来る。でも、mkaにしたmp3からは拡張ヘッダを読んでくれないから、水増しされたサンプルも再生されてしまう。

ついでに、foo_cuesheet_creatorは真の再生時間を元にCUEシートを作成するが、mkvmergeは水増しサンプル込みでmp3を結合するので、トラックの頭がズレる。gapless再生不可は我慢出来なくもないが、頭出しがズレるのは致命的。

対策

1. 他のフォーマットに変換する
→時間が掛かる、lossy→lossy変換は気持ち悪い

2. 偽再生時間をもとにしたチャプター情報と、mp3を単純にmuxしたmkaを使う
→gapless再生不可

3. まずmp3を1づつmkaでラップする。そのとき、--splitで先頭と末尾の水増し部分を別ファイルに分ける
真再生時間をもとにしたチャプター情報と、必要な部分のみのmp3 in mkaをmuxする
→mkvmergeが想定していない使いかたのような気がするんで、エラーが出るかも
→試したらさすがに無理だった

4. mp3を単純にmuxしたmkaと、偽再生時間と真再生時間をもとにしたチャプター情報をXMLで作成して使う(水増しサンプル分はチャプターに含めない)。
XMLチャプターならチャプター終了時間が指定でき、foo_input_matroskaはちゃんとそれを読んでくれるのでgapless再生になる(はず)
→DirectShow経由で再生するとき(僕はしないけど)gapless再生不可?それともアプリ依存?

方式4を行なうプログラムを作ってみたところ上手くいっている模様。ただ使いづらいのでPyQt4でインターフェースを整えてる最中。