foobar2000のおはなし 第3話
foo_input_matroskaの話。
flacやttaのmkaをfoobarでデコードすると1サンプル短くなってしまうファイルがある問題について。
まずflacのほうですが、これはmkvmergeがSegmentInfo::Durationを正確に入れてくれないのが原因です。Duration計算の段階で四捨五入しなければいけないところを切り捨て(キャスト任せ)ているため、1サンプル足りないDurationが格納されるファイルが出てきます。foo_input_matroskaは最後のChapterの終了時間をこのDurationから持ってくるので、デコード結果が1サンプル短くなります。mkvextractはこのDurationは見ないでBlockを1個ずつ足していくので、削れることはありません(格納段階でBlockに欠損は無し)。foo_input_matroska側での対処はちょっと難しい(いちいちBlock1個ずつ見てるとパースに時間かかってしまう)のでmkvmergeの修正待ちということになりますが、今まで直されていないところを見ると、こちらから報告しないと直らない予感もします...
ttaのほうは、正直よくわかりません。末尾手前のBlockをデコードすると1サンプル足りないPCMが出てくるという謎現象が発生したりしまして、これが恐らく、一般に言われる「mkaからttaを取り出すと1サンプル足りなくなる」問題の正体だと思います(mkvextractはデコードしないけど)。これに加えて上記のDurationが正確でない問題も起こるので、ttaの場合はfoobarでデコードすると2サンプル足りなくなることもあります。格納されているBlockは素のttaのフレームと同じ構造で、比較しても一緒のデータなので、mkaにする段階で欠損しているということはないようです。今のところデコーダ自体が怪しいんじゃないか(ttaファイルのデコーダとは別なので)と思っていますが、欠けるBlockが必ず最終Blockの1つか2つ前だったりして、さっぱり原因不明。foo_input_ttaの性能自体は結構優秀なので、この問題はさっさと解消したいところなんですけど、mkvextractでもダメなので先行きは厳しいです。
ちなみにWavPackはDurationの問題もありませんので、正確にデコードしてくれます。
Posted at 7月. 31, 2006 (月) 05:37 | computer ::foobar2000
wh0cd158512 phenergan
wh0cd293245 tetracycline