アニメのエンコに賭ける青春って幸せ!

このエントリーをはてなブックマークに追加
270 ◆47o/marumo
B 関連のデコード遅延は AVI の問題に含めるべきかどうか微妙なんですよね。
現状、AVI の再生環境は完全に DirectShow のみになっている (VLC Player
のように自前で全部面倒を見てるプレイヤーは除いて) わけで、DirectShow
環境では VFW の single in, single out に縛られる必要は本来ないはずなん
ですよ。

 AVI Splitter -> Dec(ffdshow) -> Render

上のフィルタグラフで再生するときに、デコーダ内部でバッファして、表示
順どおりに正しいタイムスタンプを付けてレンダラーに渡してやればいいだけ
なんですから。(A/V 同期はレンダラーがタイムスタンプを見て勝手にやって
くれる)

例えば、

 I0 -> I0 として出力
 P4 -> デコードだけしてまだ出力しない
 B2 -> デコードだけでまだ出力しない
 b1 -> b1 として出力
 b3 -> ここで B2 を出力
 P8 -> b3 を出力
 …途中略…
 EoS 通知 -> バッファ分を順次出力

ということが DirectShow ではできるはずなんですね。

この場合、AVI 段階で VFW を救おうと下手に対策する (拡張 AVI 出力での
β対策とかが例として適切です) と DirectShow 環境ではかえってズレが
発生することになります。
271 ◆47o/marumo :2007/12/06(木) 20:19:38 ID:fzu2DUGa
実際のところ ffdshow はどーゆー処理をしているのだろうと映像フレームに
タイムスタンプを焼き込むフィルタを作って実際の数値を確認してみようかと
したのですが……。

FLV 出力とか STD-B25 とかに浮気を始めて途中放置になっちゃってます。
272 ◆MakKi3ZtD. :2007/12/07(金) 05:25:02 ID:zulOrVGy
>270の点は認識してます。

ディレイすること前提なAVIが浸透している現状、
理想論だけを書くのもどうかなとちょっとだけ躊躇してます。
AVIの記事であってVFWの記事では無いのだから良いとは思いますが。
少なくとも、ピラミッドでないBフレームだけなら、一定のディレイとして対処できますし、
実際に対処している例もあるということで。まだ書いてませんが。

Dshowの例は、デコーダによるタイムスタンプ書き換えを許容するかどうかな気もします。
個人的な考えでは、タイムスタンプを付加するのはスプリッタの仕事であって、
デコーダは触るべきでないと思います。
ストリーム間の同期情報がコンテナにあるはずですし、
デコーダが他ストリームを意識することは普通は無いでしょう。

そう考えると、AVIではフレームの並び替えをしないほうが良いのかもしれません。
タイムコードがフレーム番号で静的に決まってしまうので。

I0 -> I0出力
b1 -> バッファ,出力無し
B2 -> バッファ
b3 -> バッファ
P4 -> b1出力、以降順にB2,b3,P4を出力

ということも可能ですよね。バッファするフレームが増えてしまいますが。