メッセージ

2013年01月02日の記事

2013/01/02(水)CDexで作成したflacファイルの演奏時間(Duration)がおかしい

PC::Memo

CDexで作成したflacファイルの演奏時間(Duration)がおかしい

CDex*1でExternal Encoderにflac.exeを指定したときに、うまくflacファイルが作れなかったので対策とかをメモ。

現象と原因

  • 現象: 作成したflacファイルのDuration(演奏時間)が3:22:53.943 (536870902 samples)になってしまう。
    • metaflac --list の出力
      METADATA block #0
        type: 0 (STREAMINFO)
        is last: false
        length: 34
        minimum blocksize: 4096 samples
        maximum blocksize: 4096 samples
        minimum framesize: 0 bytes
        maximum framesize: 0 bytes
        sample_rate: 44100 Hz
        channels: 2
        bits-per-sample: 16
        total samples: 536870902
        MD5 signature: 00000000000000000000000000000000
      
  • 発生条件: CDexのオプション>設定>エンコーダを以下のように設定していると発生
    • エンコーダ: External Encoder
    • WAVヘッダーを標準出力へ送る: チェック
    • オンザフライエンコード: チェック
    • エンコーダパス: flac.exe
    • パラメータ配列
      -T "Artist=%a" -T "Title=%t" -T "Album=%b" -T "Date=%y" -T "Tracknumber=%tn" -T "Genre=%g" -V -8 -o "%2" -
      
  • 原因: CDexが送るWAVヘッダー内のサンプル数情報がおかしいため。

対策

対策は、「オンザフライエンコード」をやめるか、「WAVヘッダーを標準出力へ送る」をやめるか。今回は後者で対策。

  • 対策: CDexのオプション>設定>エンコーダを以下のように設定
    • エンコーダ: External Encoder
    • WAVヘッダーを標準出力へ送る: チェックしない
    • オンザフライエンコード: チェック
    • エンコーダパス: flac.exe
    • パラメータ配列(WAVEヘッダーに載っていたフォーマット情報を追加する)
      --force-raw-format --endian=little --channels=2 --sign=signed --sample-rate=44100 --bps=16 -T "Artist=%a" -T "Title=%t" -T "Album=%b" -T "Date=%y" -T "Tracknumber=%tn" -T "Genre=%g" -V -8 -o "%2" -
      
  • 対策後のmetaflac --list の出力
    METADATA block #0
      type: 0 (STREAMINFO)
      is last: false
      length: 34
      minimum blocksize: 4096 samples
      maximum blocksize: 4096 samples
      minimum framesize: 14 bytes
      maximum framesize: 14586 bytes
      sample_rate: 44100 Hz
      channels: 2
      bits-per-sample: 16
      total samples: 9064448
      MD5 signature: b39e15237a351fd155da06ee8d7a4e3c
    

すでに作成してしまったflacファイルの修正

STREAMINFOだけ書き換えられると再エンコード不要で早そうなのですが、方法が見つからなかったので再エンコードすることにしました。再エンコードするとタグ情報が消えるので、metaflacを使って元ファイルからコピーします。

  • flac2flac.bat
    flac -d -F -c %1 | flac -V -8 -o %2 -
    metaflac --export-tags-to - %1 | metaflac --import-tags-from - %2
    
    • 使い方
      flac2flac.bat 元ファイル.flac 再エンコード後.flac
      

*1 : 本当はEACを使うつもりだったのですが、なぜかEACが起動しないPCがあったので、CDexも使ってみることに。