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の問題もありませんので、正確にデコードしてくれます。

TrackBack URI : http://reharmonize.net/200607/177/trackback

One Response to “foobar2000のおはなし 第3話”

  1. wh0cd158512 phenergan

Leave a Reply