ビデオのシークについて


ds  2010-12-13 03:21:16  No: 72140

ビデオファイルを  連続シーク+表示  しようとしています。DirectShowのIMediaSeeking::SetPositionsのコマンドを使用しようと思いましたが時間がかかりすぎて使い物になりません。
シークに時間がかかっているのかシーク後の画像表示のPauseに時間がかかっているか確かめるため、Pauseをコメントアウトすると、シークにはそれほど時間がかかっていないように見えました。(ISampleGrabberCB::SampleCBにてフレームチェックしました。)
どなたか、この  『シーク+シーク先画像表示』  をすばやくする方法をご存じの方教えてください。

シーク→ISampleGrabberCB::BufferCB→表示  しかないのでしょうか。
VC++2008  Express  です。


gak  2010-12-16 03:05:20  No: 72141

大した意見は出せないが、簡単にできそうな事としては
・連続シークはPause状態で行う+Pause状態を維持する(Stop状態+StopWhenReady()でイメージ更新とかは高コスト)
・IMediaFilter::SetSyncSource(NULL) をして、連続シーク中は同期によるタイムロスをさせない
程度しか浮かばない。

これ以上を望むなら独自フィルタでも指し込んでシーク処理の最適化を試みるしかないかも。
シーク処理はボトルネックになって無さげ!という話だけど、ソースフィルタから無秩序に流されるストリームを解析して対象フレームを取り出す
ってのは軽い作業じゃ無い様に思う。ココがネックになっている可能性が低いとは思えないかなぁ。
i-frameだけで構成されている動画ならまだしも、前後イメージの差分だけ持つようにして軽量化を量っている様な動画の場合は更にシークが大変だろうし。

# 実際に動画ストリームを解析してフレーム単位に分けるのはパーサフィルタ辺りの仕事(IMediaSeeking を実装するのも大抵コイツなんで、シーク処理もコイツの担当)なんだけど、
# 既に高性能なパーサフィルタを使ってるのでシーク処理はボトルネックになっていないという可能性も無いわけでは無いです

本格的にシーク処理の高速化に取り組んだ経験は無いので…上記は実績に基づいて出された回答じゃ無いという前提で。

> シーク→ISampleGrabberCB::BufferCB→表示  しかないのでしょうか。
ちなみにコレで上手い事いきました?


ds  2010-12-17 06:30:39  No: 72142

gakさん、いつも適切なコメントありがとうございます。

>ちなみにコレで上手い事いきました?
いきませんでした。
>にはそれほど時間がかかっていないように見えました。
SampleCBにてフレームのチェック(SampleCBが呼ばれるたびにカウント)したつもりですが、その後何回やっても同じ結果が出ませんでした。(スレッドの非同期のせいでたまたまの症状がでたのかな〜〜)(シークのループもスレッドにて処理だし・・・)

パーサーフィルタの勉強を一からしてみます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加