aacが厄介

(2011/07/13 追記)

下記だと音声がぶっ飛ぶケースがあり、調査したところ

FF F8 4C A0

というヘッダも存在しているみたいです。なので

FF F8

だけみるようにする必要があるきがします。
うまくいったらまた書きます。

(2011/07/13 追記2)

スクリプトを修正しました。
aacが厄介(2) - looselife diary

直接fsusb2の話題ではないんですが一応。


録画した番組を自動的にmp4にするスクリプトを作って運用しているんですが、うまくいかない場合があります。
しかもかなり頻繁にある、というか成功するほうが少ない印象です。


いろいろな方法を試してみているんですが、どの方法もダメ。
ダメな場合に出てくるのは決まってAAC関連のエラーメッセージっぽいです。


んで、今現在たどり着いたのが以下のページ。

これは、放送波上の AAC データには、 raw data の前に ADTS ヘッダが付加されていることが多いのですが、この「ヘッダ・データ」の構造が正常に維持されず、ファイルがデータ部の途中から開始していると、ファイルの先頭に ADTS ヘッダが来ず、いきなりデータ部から始まるということになってしまい、 ADTS ヘッダのパースが正常にできないためにエラーが出力される、ということです。

http://d.hatena.ne.jp/RobinEgg/20090420/p1


うーん。ぽいなあ。これっぽい。うん、これに違いない。


id:RobinEggさんはaacの構造を修復するツールをpythonで作ってくださっています。
んですが、せっかくなので自分でも作ってみました。rubyで。


まだ全部がうまくいっているわけではないので、ちゃんと動いているのかはよくわかりません。
とりあえず、このプログラムを通すと先頭4バイトが「FF F8 XX 80」となることは確認してます。
再生も可能っぽいです。


使用は自己責任で。無保証。

#!ruby
#
# fixaac.rb
#
# usage:
#  ruby fixaac.rb INFILE OUTFILE
#

ifn = ARGV[0]
ofn = ARGV[1]
open(ifn) do |fi|
  found = false
  until fi.eof?
    byte1 = fi.read(1)
    if byte1[0] == 0xff
      byte2 = fi.read(3)
      if byte2[0] == 0xf8 && byte2[2] == 0x80
        found = true
        break
      end
    end
  end
  if found
    puts "Header is found. Processing..."
    fi.seek fi.pos - 4
    open(ofn, "w") do |fo|
      until fi.eof?
        fo.write fi.read(1024 * 1024)
      end
    end
  else
    puts "Invalid AAC file."
  end
end

今後

とりあえず、こんな計画。うまくいくかは不明。


元TS -> aac分離(ffmpeg) -> fixaac.rb -> [音声のみaac]
元TS -> mpeg2分離(ffmpeg) -> HandbrakeCLI -> [音声なしmp4]


[音声なしmp4], [音声のみaac] -> MP4Box -> [音声ありmp4]