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