Alalf / SCFF-DirectShow-Filter

"ScreenCapture for FFmpeg" DirectShow Filter
GNU Lesser General Public License v3.0
53 stars 22 forks source link

フレームのタイムスタンプのオフセットをSCFF-APPから変更できるようにする方法を調査する #79

Closed Alalf closed 12 years ago

Alalf commented 12 years ago

映像に比べて音声が先行するフレーム遅延が発生した場合音声に遅延をはさむ必要があるが、 これをフレームのタイムスタンプのオフセットを設定するだけで解決できないだろうか?

いちおうIAMPushSourceにはタイムスタンプのオフセットを変えたり最大値を設定するメソッドがある。 http://msdn.microsoft.com/ja-jp/library/cc355052.aspx ただし、これはあくまでDirectShowが遅延の異なる複数のソースフィルタの間で同期を取るためのもので、 ユーザが呼び出すためのものではない。

遅延時間を補正するためにフィルタ グラフは、IAMPushSource インターフェイスを公開している各出力ピンにおいて IAMLatency::GetLatency を呼び出し、グラフ内の最大の遅延時間を調べる。 次に、最大遅延時間よりも遅延時間が短いフィルタにおいて IAMPushSource::SetStreamOffset を呼び出し、各自が生成するタイム スタンプを正しいオフセットで調整する。

動作自体はこんな感じ。

Alalf commented 12 years ago

現状GetLatency()の計算部分がいい加減なので、offsetの値をタイムスタンプへ反映はしていない。

Alalf commented 12 years ago

ぱっと考える限りタイムスタンプが動作中に巻き戻るのはまずい気がしている。(タイムスタンプの単調増加が崩れる)

つまりオフセットを指定するのはスレッド開始前でなければならない・・・。設定する場所がないような気がしてきた。

Alalf commented 12 years ago

なお、IAMPushSourceの上記機能が使えるのは一部のエンコーダだけのように見える。 (WMEだとGetLatency()がそもそも呼ばれない) これはQCTMのときといっしょか。

Alalf commented 12 years ago

わざわざグラフクロックを取得しに行っているのはこういう理由があったわけか・・・

Alalf commented 12 years ago

AppDataとレジストリに設定が分散して気持ち悪いなー まあSCFHもレジストリ使ってたのでいいか…

Alalf commented 12 years ago

APPから設定できる=エンコード途中に変更できるようにする、なので、ここでフレームのタイムスタンプをずらせてしまうのは間違い。別Issueに移動します。