metaflac.exe とコマンドラインオプション
2010年02月28日(日)23時22分
FLAC のデコード
今回は、前回作った CUE シートや画像を埋め込んだ FLAC ファイルのデコード、つまり元の「wav + cue + jpg」に戻すためにはどうするのか、というお話です。
FLAC ファイルを WAVE ファイルに戻す(デコード)のは、「-d」を使って「flac.exe -d -f "FileName.flac"」とすればいいわけですが、これで生成されるのは WAVE ファイルのみであり、一緒に埋め込んだCUEシートや画像ファイルは取り出せません。
つまり「flac.exe -d -f --delete-input-file "FileName.flac"」とでもしようものなら、「--delete-input-file」でCUEシートや画像ファイルが FLAC ファイルごと消えてしまって、また CD からリッピングし直し、ジャケットをスキャンし直し、となります。
metaflac.exe
そこで、それらの付属情報(メタ情報)を取り出すためにあるのが「metaflac.exe」で、これは公式サイトからダウンロードしたアーカイブに「flac.exe」と一緒に入ってます。
微妙に癖があって使いづらいところがあったりするんですが、純正?品ということでこれを使ってみます。
CUE ファイルの取り出し その一
CUE シートは「metaflac.exe --export-cuesheet-to="FileName.cue" "FileName.flac"」とすればファイルとして取り出すことができますが、この方法で取り出せるのは「--cuesheet="FileName.cue"」で埋め込んだもので、つまり曲名やアーティスト名といった付加情報がばっさり削除された状態になりますから、あまり使わないと思います。
CUE ファイルの取り出し その二
これは CUE ファイルというより、文字列タグ領域に共通するものなので、他に埋め込んだ歌詞ファイルもログファイルも同じです。
で、この領域の情報を取り出すコマンドは「--export-tags-to="FileName.txt"」となるんですが、これは「tags」と複数形であることからわかるように、領域内の文字列情報全てを一ファイルとして出力します。
「--show-tag」
では単数形、タグを個別に出力するコマンドはというと、「--export-tag-to」というのはなぜか存在せず、使えそうなのは「--show-tag」になります。
ただし、これは「show」つまり「表示」で、標準出力(いわゆる DOS 画面)に表示するものであって、ファイルに出力するものではありません。
しかしながら DOS(というより UNIX 由来らしいですが)にはリダイレクトという機能があり、標準出力の内容をそのままファイルに記録することができますので、それを使って「--show-tag="CUESHEET" "FileName.flac" > "FileName.cue"」というふうにすれば、「CUESHEET」タグの内容を「FileName.cue」に出力することができます。
…できるんですが問題が二つ。
「CUESHEET=」
まず出力されたファイルの先頭には「CUESHEET=」というタグ名がついていますので、これを削除しないと CUE ファイルとしては使えません。
もちろん「--show-tag="LYRICS" "FileName.flac" > "FileName.txt"」として出力した歌詞ファイルの先頭には「LYRICS=」がつきます。
なお同じタグ名で複数の文字列を埋め込んでいた場合、例えば「LYRICS」タグで「一曲目の歌詞.txt」「二曲目の歌詞.txt」と二つのテキストファイルを埋め込んだ FLAC ファイルから、「LYRICS」タグを取り出した場合、同じファイルにまとめて出力されますが、それぞれの開始位置に「LYRICS=」が付加されます。
改行記号
もう一つが改行記号の問題で、通常 Windows では、改行を「\r」と「\n」の二個の制御文字(表示はされない)を使って表現しており、これらの文字コードは「\r=0D」「\n=0A」となりますので、改行部分をバイナリエディタで見ると「0D 0A」となっているはずです。
ところが、「metaflac.exe」で出力したテキストは、これがなぜか「0D 0D 0A」というふうになり、「0D」が一つ余分に付きます。
これは目に見えないので問題がわかりづらいのですが、例えば「metaflac.exe」で抽出した CUE ファイルを使って、再度 FLAC ファイルを作り、それをまた取り出すと、さらに「0D」が追加されて「0D 0D 0D 0A」となり、今度はメモ帳で見ても各行末におかしな記号が付いて見えるようになります。
最初、リダイレクトとのからみで起こっているのかと、つまり「metaflac.exe」は改行を「0D」として出力(この時点であまり一般的ではないんですが)、その後「cmd.exe(コマンドプロンプト本体)」がリダイレクト処理時にサービスで「0D 0A」を付けてくれるために発生するのかと思ったんですが、リダイレクトと関係ない「-export-tags-to」でも「0D 0D 0A」でしたので、「metaflac.exe」(かFLACの文字列格納領域)のバグか仕様のようです。
ちなみに「--export-cuesheet-to」では、正常な改行コード(0D 0A)のCUEファイルが出力されます。
画像ファイルの取り出し
「--export-picture-to="FileName.jpg"」とすればいいんですが、ここでも問題が二つ。
どの画像か
まず、画像は複数埋め込めますが「--export-picture-to」で出力できるのは一つだけですので、どの画像を出力するかを選ぶ必要があります。
これは「--export-picture-to」に先立って「--block-number」で出力する画像の番号を指定します。
一つしか埋め込んでいなければそれが選ばれますので、通常のジャケット表紙画像(番号3)しか使用していなければ、わざわざ「--block-number=3」と指定する必要はありません。
拡張子
もう一つは指定するファイル名の拡張子で、取り出す画像のフォーマットに応じた拡張子をつける必要がありますが、これを調べる方法が、メタ情報の全てを標準出力に書き出す「--list」というオプションを使って取得した情報を解析する、という方法しか(多分)ありません。
ところが、この「--list」は、(本来ならバイナリデータである)画像本体の内容も文字情報で表現して出力してくれますので、非常に大きくなります。
拡張子だけを調べるには高コストなので、埋め込む画像は JPEG に固定して、拡張子を「.jpg」決めうちで出力する、というような「運用でカバー」方式がいいかなと思います。
ちなみに、「--block-number」で出力する画像の番号を指定する際に、何番に画像が入っているのかを調べるのにも、この「--list」を使います。
まとめ
というわけで、少し癖があるんですが、まとめると以下のように。
metaflac.exe --show-tag="CUESHEET" "FileName.flac" > "FileName.cue"
metaflac.exe --show-tag="LYRICS" "FileName.flac" > "FileName.txt"
metaflac.exe --show-tag="LOG" "FileName.flac" > "FileName.log"
metaflac.exe --export-picture-to="FileName.jpg" "FileName.flac"
flac.exe -d -f "FileName.flac"
で、このあと出力された CUE ファイルや歌詞・ログファイル等の文頭に付いたタグ情報を取り除き、改行コードを「0D 0D 0A」から「0D 0A」に変更する必要があります。
- 関連記事
-
- 最近インターネットラジオを聴いています
- LAME 3.98.4
- mp3DirectCut を使う
- metaflac.exe とコマンドラインオプション
- flac.exe とコマンドラインオプション
- FLAC はメジャーだから…
- mp3gain.exe とコマンドラインオプション