音楽ライブラリを移行する その2

matroska と cuesheet の話

matroska は今ではDivXプレイヤーでサポートされたりとポストAVIとして動画サイトで利用されるFLV、MP4やP2P上で流れる大型動画ファイルで利用される事も大きくなったOGG形式(拡張子ogmやogv)と並んで存在しています。

matroskaはその中でcuesheetと音声ファイルを内蔵することで音楽CDを丸ごと1つのファイルにまとめることができます。

matroska は現状国際化に対応して文字コードの扱いは全てUTF8で処理するのがDefaultとなっています。
しかしmkvextractで取り出したcuesheetの文字コードはUTF8であるにもかかわらずBOMと呼ばれる文字がファイルの頭4バイトに存在します。これはUTF16などのエンディアン問題を解決するのに必須なのですが、UTF8においては扱いが不明瞭です。

今回はfoobar2000flac+内部cuesheetで再生できることを目標にしていますが、foobar2000ではBOM付きUTF8を認識しません。
そのため以下の処理で無理やりな方法ですがBOMを切り落としています。

tail -c +4 input.cue > output.cue

これは先頭4bytesを切り落として出力するという処理になります。
必ず頭にBOMが存在するという前提なので気を付けてください。

mkvextract が出力する cuesheet のファイル名が不定になる問題

cuesheet には参照する音楽ファイルを指定する FILE "ファイル名" WAVE という行が存在します。
ファイル名が空白で出力される事があり、その時はfoobar2000で cuesheet を認識しないという問題が発生します。
そこで sed コマンドを使用してファイル名を audio.flac と固定しておく事にします。
実際に内部cuesheet を利用するときはファイル名は空白でなければ任意のファイル名で大丈夫でした。

sed -e "s/^FILE .* WAVE$/FILE \"audio.flac\" WAVE/" input.cue > output.cue

flacにcuesheetを組み込む

前回にも書いたようにfoobar2000においてflacにcuesheetを組み込む時にはflac標準の内部cuesheetとコメントとして組み込むfoobar2000独自仕様の内部cueesheetを利用するの二つがあります。
今回はfoobar2000で曲名などの表示を行うためイに後者を選択します。

すでにflacを用意している場合

metaflac --set-tag-from-file="cuesheet=input.cue" input.flac

flacエンコードするときに組み込む場合

flac --tag-from-file="cuesheet=input.cue" input.wav -o output.flac