IStreamBufferMediaSeeking
COM公式ドキュメント
IStreamBufferMediaSeeking インターフェイスは、stream buffer ソースグラフでのシークを制御します。このインターフェイスは Stream Buffer Source フィルターによって公開されます。
解説(Remarks)
Stream Buffer Source が Recording オブジェクトまたは RecComp オブジェクトで作成された録画を再生する場合、ファイル内の任意の位置にシークできます。Stream Buffer Sink からのライブストリームを再生する場合は、sink フィルターのバッファー内の任意の位置にシークできます。これには、録画されたコンテンツや一時的なバッキングファイルが含まれる場合があります。ファイル間の遷移はシームレスです。
Stream Buffer Sink からのライブコンテンツは、新しいコンテンツが録画されるにつれて一方の端で伸長し、古くなったバッキングファイルが削除されるにつれてもう一方の端で短縮します。そのため、このインターフェイスの位置情報は、通常の IMediaSeeking インターフェイスとは多少異なります。以下の定義が使用されます。
| 値 | 説明 |
|---|---|
| Content start |
利用可能な最も古いコンテンツの時刻です。ライブコンテンツの場合、値はゼロから始まり、Stream Buffer Engine が古いファイルを削除するたびに増加します。
たとえば、それぞれ 15 分のバッキングファイルが 6 つある場合、60 分後に最初のファイルが削除されると、content start は 15 分にジャンプします。 |
| Content stop | 利用可能な最も新しいコンテンツの時刻です。ライブコンテンツの場合、この値はゼロから始まり、継続的に増加します。 |
| Segment stop |
Stream Buffer Source フィルターが再生を停止する時刻です。この値は正の無限大から始まりますが、アプリケーションによって任意の時刻に設定できます。
segment stop 時刻は content stop 時刻よりも後になる場合があるため、この位置にシークできないことがあります。segment stop 時刻に達する前に再生がコンテンツの末尾に到達した場合、グラフは end-of-stream (EOS) イベントを送信します。 |
| Stream position |
content start を基準とした現在の再生位置です。
たとえば、ソースグラフが 15 秒間実行された後に 10 秒間一時停止した場合、stream position はソースグラフが再度実行されるまで 15 秒のままです。 |
これらの定義を踏まえると、以下の IStreamBufferMediaSeeking メソッドには特別な動作があります。
- GetAvailable: content start と content stop を返します。
- GetCurrentPosition: stream position を返します。
- GetDuration: (content start –content stop) を返します。
- GetPositions: stream position と segment stop を返します。
- GetStopPosition: segment stop を返します。
- SetPositions: stream position と segment stop を設定します。
レートの変更
レートを変更する場合、再生速度は 0.1 より大きいか、-0.1 より小さくなければなりません。負のレートは逆方向再生を示します。キャプチャソースが MPEG-2 ソースの場合、4 倍を超える速度での再生や逆方向再生をサポートするには MPEG-2 Video Analyzer フィルターが必要です。詳細については、Creating Stream Buffer Graphs を参照してください。IStreamBufferMediaSeeking::SetRate メソッドは、要求されたレートが非常に短いコンテンツに対して高すぎる場合、VFW_E_DVD_WRONG_SPEED を返すことがあります。このエラーは、Stream Buffer Engine が要求されたレートで利用可能なコンテンツの I フレームを取得できない場合に発生します。
SetRate メソッドは E_NOTIMPL を返すこともあります。このエラーコードは、ユーザーのシステムに複数のデコーダーが登録されている場合に発生することがあります。その場合は、再生レートを設定するために、ソースグラフ上で標準の IMediaSeeking::SetRate メソッドを使用してください。SetRate の IMediaSeeking 版は VFW_E_UNSUPPORTED_AUDIO を返すことがあり、これはオーディオデコーダーがトリックモードをサポートしていないことを示します。このエラーコードは無視しても問題ありません。
SetRate の IStreamBufferMediaSeeking 版は、デコーダーが 1 倍速以外のレートをサポートしていない場合にも失敗することがあります。
このインターフェイスのインターフェイス識別子 (IID) を宣言するには、__uuidof 演算子を使用します: __uuidof(IStreamBufferMediaSeeking)。
メソッド 0
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IStreamBufferMediaSeeking "{F61F5C26-863D-4AFA-B0BA-2F81DC978596}"
#usecom global IStreamBufferMediaSeeking IID_IStreamBufferMediaSeeking "{}"
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。