IMediaSeeking
COM公式ドキュメント
IMediaSeeking インターフェイスは、ストリーム内の位置へのシーク、および再生レートの設定を行うためのメソッドを提供します。
メソッド 17
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
GetCapabilities メソッドは、ストリームのすべてのシーク機能を取得します。
| pCapabilities | DWORD* | out | AM_SEEKING_SEEKING_CAPABILITIES フラグのビット単位の組み合わせを受け取る変数へのポインター。 |
戻り値
解説(Remarks)
このメソッドは、ストリームのすべてのシーク機能に関する情報を返します。pCapabilities を調べるには、関心のある各 AM_SEEKING_SEEKING_CAPABILITIES 値に対して個別にビット単位の AND 演算を実行します。
| C++ |
|---|
DWORD dwCaps = 0; pMediaSeeking->GetCapabilities(&dwCaps); |
CheckCapabilities メソッドは、ストリームが指定したシーク機能を備えているかどうかを問い合わせます。
| pCapabilities | DWORD* | inout | 入力時には、1 つ以上の AM_SEEKING_SEEKING_CAPABILITIES 属性をビット単位の OR で結合した値を格納する変数へのポインター。メソッドから戻ると、その値はそれらの属性のうちどれが利用可能かを示します。 |
戻り値
HRESULT 値を返します。とりうる値には次のものがあります。
| リターンコード | 説明 |
|---|---|
| pCapabilities の機能の一部は存在しますが、すべてではありません。 | |
| pCapabilities のすべての機能が存在します。 | |
| pCapabilities の機能はいずれも存在しません。 | |
| NULL ポインター引数。 |
解説(Remarks)
特定のいくつかの機能だけに関心がある場合は、ストリームのすべてのシーク機能を調べる IMediaSeeking::GetCapabilities を呼び出すよりも、このメソッドを呼び出す方が効率的です。
このメソッドを呼び出すには、DWORD 変数を宣言し、テストしたい AM_SEEKING_SEEKING_CAPABILITIES フラグをビット単位の OR で結合した値を設定します。この値のアドレスを pCapabilities パラメーターに渡します。メソッドから戻ると、pCapabilities には元のビットのサブセットが格納され、どの機能が存在するかを示します。戻り値は、要求した機能の一部・なし・すべてのいずれが存在するかを示します。
次のコード例は、ストリームが前方シーク、後方シーク、および絶対シークをサポートしているかどうかを調べる方法を示しています。
| C++ |
|---|
// 確認したい機能のフラグを設定する。 |
IsFormatSupported メソッドは、指定した時間形式がシーク操作でサポートされているかどうかを判定します。
| pFormat | GUID* | in | 時間形式を指定する GUID へのポインター。時間形式 GUID を参照してください。 |
戻り値
HRESULT 値を返します。とりうる値には次のものがあります。
| リターンコード | 説明 |
|---|---|
| この形式はサポートされていません。 | |
| この形式はサポートされています。 | |
| 実装されていません。 | |
| NULL ポインター引数。 |
QueryPreferredFormat メソッドは、シークに推奨される時間形式を取得します。
| pFormat | GUID* | out | 時間形式を指定する GUID を受け取る変数へのポインター。時間形式 GUID を参照してください。 |
戻り値
GetTimeFormat メソッドは、現在シーク操作に使用されている時間形式を取得します。
| pFormat | GUID* | out | 時間形式を指定する GUID を受け取る変数へのポインター。時間形式 GUID を参照してください。 |
戻り値
IsUsingTimeFormat メソッドは、シーク操作が現在指定した時間形式を使用しているかどうかを判定します。
| pFormat | GUID* | in | 時間形式を指定する GUID へのポインター。時間形式 GUID を参照してください。 |
戻り値
HRESULT 値を返します。とりうる値には次のものがあります。
| リターンコード | 説明 |
|---|---|
| 指定した形式は現在の形式ではありません。 | |
| 指定した形式が現在の形式です。 | |
| 実装されていません。 | |
| NULL ポインター引数。 |
解説(Remarks)
このメソッドは GUID をコピーする必要がないため、IMediaSeeking::GetTimeFormat メソッドよりもわずかに効率的です。
SetTimeFormat メソッドは、以降のシーク操作に使用する時間形式を設定します。
| pFormat | GUID* | in | 時間形式を指定する GUID へのポインター。時間形式 GUID を参照してください。 |
戻り値
HRESULT 値を返します。とりうる値には次のものがあります。
| リターンコード | 説明 |
|---|---|
| 成功。 | |
| 引数が無効です。 | |
| メソッドがサポートされていません。 | |
| NULL ポインター引数。 | |
| フィルターグラフが停止していません。 |
解説(Remarks)
このメソッドは、IMediaSeeking::GetPositions や IMediaSeeking::SetPositions など、他の IMediaSeeking メソッドで使用される時間の単位を指定します。これらの他のメソッドを呼び出す際、時間値を表すパラメーターはすべて現在の時間形式の単位で与えられます。
既定の時間形式は REFERENCE_TIME 単位 (100 ナノ秒) です。その他の時間形式には、フレーム、サンプル、バイトがあります。特定の形式がサポートされているかどうかを判定するには、IMediaSeeking::IsFormatSupported メソッドを呼び出します。ある形式がサポートされている場合、SetTimeFormat を呼び出すことでその形式に切り替えることができます。同時にアクティブにできる時間形式は 1 つだけです。
GetDuration メソッドは、ストリームの再生時間 (長さ) を取得します。
| pDuration | LONGLONG* | out | 現在の時間形式の単位で、再生時間を受け取ります。 |
戻り値
このメソッドが成功すると S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
このメソッドは、通常の再生速度でのストリームの再生時間を取得します。再生レートを変更しても再生時間は変わりません。
再生時間は現在の時間形式で表されます。既定の時間形式は REFERENCE_TIME 単位 (100 ナノ秒) です。時間形式を変更するには、IMediaSeeking::SetTimeFormat メソッドを使用します。
ソースの形式によっては、再生時間が正確でない場合があります。たとえば、ソースに可変ビットレート (VBR) ストリームが含まれている場合、このメソッドは推定された再生時間を返すことがあります。
GetStopPosition メソッドは、ストリームの再生時間を基準として、再生が停止する時刻を取得します。
| pStop | LONGLONG* | out | 現在の時間形式の単位で、停止時刻を受け取る変数へのポインター。 |
戻り値
HRESULT 値を返します。とりうる値には次のものがあります。
| リターンコード | 説明 |
|---|---|
| 成功。 | |
| メソッドがサポートされていません。 | |
| NULL ポインター引数。 |
解説(Remarks)
再生レートは、このメソッドが返す値に影響しません。
返される値は現在の時間形式で表されます。既定の時間形式は REFERENCE_TIME 単位 (100 ナノ秒) です。時間形式を変更するには、IMediaSeeking::SetTimeFormat メソッドを使用します。
GetCurrentPosition メソッドは、ストリーム全体の再生時間を基準として、現在位置を取得します。
| pCurrent | LONGLONG* | out | 現在の時間形式の単位で、現在位置を受け取る変数へのポインター。 |
戻り値
HRESULT 値を返します。とりうる値には次のものがあります。
| リターンコード | 説明 |
|---|---|
| 成功。 | |
| メソッドがサポートされていません。 | |
| NULL ポインター引数。 |
解説(Remarks)
このメソッドは、再生が到達した現在位置を返します。この値には、再生レートと開始時刻に対する調整が含まれます。たとえば、開始時刻が 5 秒、再生レートが 2.0 で、グラフを 4 秒間実行した場合、現在位置は 5 + (4 x 2.0) = 13.0 秒になります。
返される値は現在の時間形式の単位で表されます。現在の時間形式を確認するには、GetTimeFormat メソッドを呼び出します。
グラフが一時停止または停止している場合、現在位置は再生が再開される時点を表します。
Filter Graph Manager は、現在のストリーム時刻から位置を計算します。グラフ内のフィルターに問い合わせは行いません。ファイル再生の場合、再生はストリーム時刻に同期されるため、正確な結果が得られます。ファイル書き込みの場合、結果は正確ではありません。ファイル書き込みグラフで現在位置を取得するには、マルチプレクサーフィルターに問い合わせます。(ただし、ライブキャプチャでは位置は意味を持ちません。)
返される値は現在の時間形式で表されます。既定の時間形式は REFERENCE_TIME 単位 (100 ナノ秒) です。時間形式を変更するには、IMediaSeeking::SetTimeFormat メソッドを使用します。
ConvertTimeFormat メソッドは、ある時間形式から別の時間形式へ変換します。
| pTarget | LONGLONG* | out | 変換後の時間を受け取る変数へのポインター。 |
| pTargetFormat | GUID* | inoptional | 変換先の形式を指定する GUID へのポインター。NULL の場合は現在の形式が使用されます。時間形式 GUID を参照してください。 |
| Source | LONGLONG | in | 変換する時間値。 |
| pSourceFormat | GUID* | inoptional | 変換元の形式を指定する GUID へのポインター。NULL の場合は現在の形式が使用されます。時間形式 GUID を参照してください。 |
戻り値
HRESULT 値を返します。とりうる値には次のものがあります。
| リターンコード | 説明 |
|---|---|
| 成功。 | |
| これらの型の間の変換はサポートされていません。 | |
| メソッドがサポートされていません。 | |
| NULL ポインター引数。 |
SetPositions メソッドは、現在位置と停止位置を設定します。
| pCurrent | LONGLONG* | inoutoptional | [in,out] 現在の時間形式の単位で、現在位置を指定する変数へのポインター。 |
| dwCurrentFlags | DWORD | in | フラグのビット単位の組み合わせ。「解説」を参照してください。 |
| pStop | LONGLONG* | inoutoptional | [in,out] 現在の時間形式の単位で、停止時刻を指定する変数へのポインター。 |
| dwStopFlags | DWORD | in | フラグのビット単位の組み合わせ。「解説」を参照してください。 |
戻り値
HRESULT 値を返します。とりうる値には次のものがあります。
| リターンコード | 説明 |
|---|---|
| 位置の変更なし。(両方のフラグでシークなしが指定されています。) | |
| 成功。 | |
| 引数が無効です。 | |
| メソッドがサポートされていません。 | |
| NULL ポインター引数。 |
解説(Remarks)
dwCurrentFlags パラメーターと dwStopFlags パラメーターは、シークの種類を定義します。次のフラグが定義されています。
| 位置指定フラグ | 説明 |
|---|---|
| AM_SEEKING_NoPositioning | 位置を変更しません。(時間パラメーターは NULL でもかまいません。) |
| AM_SEEKING_AbsolutePositioning | 指定した位置は絶対位置です。 |
| AM_SEEKING_RelativePositioning | 指定した位置は前の値に対する相対位置です。 |
| AM_SEEKING_IncrementalPositioning | 停止位置 (pStop) は現在位置 (pCurrent) に対する相対位置です。 |
| 修飾フラグ | 説明 |
|---|---|
| AM_SEEKING_SeekToKeyFrame | 最も近いキーフレームへシークします。これは高速になる可能性がありますが、精度は低くなります。DirectShow に付属するフィルターはいずれもこのフラグをサポートしていません。これをサポートする可能性が最も高いフィルターはデコーダーです。 |
| AM_SEEKING_ReturnTime | 対応するリファレンスタイムを返します。 |
| AM_SEEKING_Segment | セグメントシークを使用します。 |
| AM_SEEKING_NoFlush | フラッシュを行いません。 |
各パラメーターには、位置指定フラグを 1 つ使用します。必要に応じて、1 つ以上の修飾フラグを含めることができます。
AM_SEEKING_ReturnTime フラグを指定すると、メソッドは位置の値をリファレンスタイムに変換し、それを pCurrent または pStop 変数に返します。このフラグは、フレームなど別の時間形式を使用している場合に便利です。
AM_SEEKING_Segment フラグと AM_SEEKING_NoFlush フラグは、シームレスなループ再生をサポートします。
- AM_SEEKING_Segment フラグが指定されている場合、ソースフィルターは停止位置に到達したときに IPin::EndOfStream を呼び出す代わりに EC_END_OF_SEGMENT イベントを送信します。アプリケーションはこのイベントを待機し、その後別のシークコマンドを発行できます。
- AM_SEEKING_NoFlush フラグが指定されている場合、グラフはシーク中にデータをフラッシュしません。このフラグは AM_SEEKING_Segment と併用します。
入力される pCurrent と pStop の値は現在の時間形式で表されます。既定の時間形式は REFERENCE_TIME 単位 (100 ナノ秒) です。時間形式を変更するには、IMediaSeeking::SetTimeFormat メソッドを使用します。AM_SEEKING_ReturnTime フラグが指定されている場合、メソッドは出力される値を REFERENCE_TIME 単位に変換します。
フィルター開発者向け
このメソッドを実装する場合、AM_SEEKING_PositioningBitsMask の値を使用して修飾フラグをマスクすることで、呼び出し元が現在位置と停止位置のどちらの変更を要求しているかを確認できます。次に例を示します。
DWORD dwCurrentPos = dwCurrentFlags & AM_SEEKING_PositioningBitsMask
if (dwCurrentPos == AM_SEEKING_AbsolutePositioning)
{
// 新しい位置を pCurrent に設定する。
m_rtStart = *pCurrent;
}
else if (dwCurrentPos == AM_SEEKING_RelativePositioning)
{
// 現在位置を pCurrent の分だけ加算する。
m_rtStart += *pCurrent;
}
|
GetPositions メソッドは、ストリーム全体の再生時間を基準として、現在位置と停止位置を取得します。
| pCurrent | LONGLONG* | outoptional | 現在の時間形式の単位で、現在位置を受け取る変数へのポインター。 |
| pStop | LONGLONG* | outoptional | 現在の時間形式の単位で、停止位置を受け取る変数へのポインター。 |
戻り値
HRESULT 値を返します。とりうる値には次のものがあります。
| リターンコード | 説明 |
|---|---|
| 成功。 | |
| メソッドがサポートされていません。 | |
| NULL ポインター引数。 |
解説(Remarks)
現在位置と停止位置はどちらも元のストリームを基準としており、再生レートには依存しません。
返される値は現在の時間形式で表されます。既定の時間形式は REFERENCE_TIME 単位 (100 ナノ秒) です。時間形式を変更するには、IMediaSeeking::SetTimeFormat メソッドを使用します。
GetAvailable メソッドは、シークが効率的に行える時間の範囲を取得します。
| pEarliest | LONGLONG* | outoptional | 効率的にシークできる最も早い時刻を受け取る変数へのポインター。 |
| pLatest | LONGLONG* | outoptional | 効率的にシークできる最も遅い時刻を受け取る変数へのポインター。 |
戻り値
HRESULT 値を返します。とりうる値には次のものがあります。
| リターンコード | 説明 |
|---|---|
| 成功。 | |
| メソッドがサポートされていません。 | |
| NULL ポインター引数。 |
解説(Remarks)
このメソッドは主に、ネットワーク経由で送信されるストリームなど、過度な遅延が発生する可能性のあるメディアストリームでのシークを対象としています。返される値は、すでに到着していて容易にシークできるキャッシュ済みデータを示します。これらの返されたパラメーターを超える値へシークすると、データの到着を待つ間、アプリケーションに遅延が発生すると想定されます。
すべての時間値は現在の時間形式で表されます。既定の時間形式は REFERENCE_TIME 単位 (100 ナノ秒) です。時間形式を変更するには、IMediaSeeking::SetTimeFormat メソッドを使用します。
SetRate メソッドは、再生レートを設定します。
| dRate | DOUBLE | in | 再生レート。ゼロにはできません。 |
戻り値
HRESULT 値を返します。とりうる値には次のものがあります。
| リターンコード | 説明 |
|---|---|
| 成功。 | |
| 指定したレートがゼロまたは負の値でした。(「解説」を参照してください。) | |
| 実装されていません。 | |
| NULL ポインター引数。 | |
| オーディオデバイスまたはフィルターがこのレートをサポートしていません。 |
解説(Remarks)
再生レートは、通常速度に対する比率として表されます。したがって、1.0 は通常の再生速度、0.5 は半分の速度、2.0 は 2 倍の速度を表します。オーディオストリームでは、レートを変更するとピッチも変化します。
負の値は逆方向再生を表します。ほとんどのフィルターは逆方向再生をサポートしておらず、dRate パラメーターが負の場合はエラーコードを返します。
アプリケーションが Filter Graph Manager に対してこのメソッドを呼び出すと、Filter Graph Manager は次の処理を行います。
- IMediaSeeking::GetCurrentPosition メソッドを呼び出します。この呼び出しは、Filter Graph Manager が計算した現在位置を返します。
- フィルターグラフを停止します (グラフが一時停止中または実行中の場合)。
- 現在位置を開始時刻として、フィルターに対して IMediaSeeking::SetPositions メソッドを呼び出します。これにより、ストリーム時刻がゼロにリセットされます。
- 新しいレートを指定して、フィルターに対して
SetRateメソッドを呼び出します。 - フィルターグラフが一時停止中または実行中だった場合は、再開します。
フィルターは、レート変更に対して次のように応答する必要があります。
パーサーフィルターおよびソースフィルター: タイムスタンプを生成するフィルターが SetRate 呼び出しに応答します。これは通常、AVI Splitter Filter などのパーサーフィルターですが、ソースフィルターの場合もあります。シークまたはレート変更が行われた後、フィルターは新しい設定で IPin::NewSegment メソッドを呼び出す必要があります。レート変更後は、それに応じてタイムスタンプを調整する必要があります。レート変更の前にはシークが行われ、タイムスタンプはゼロから再開されるため、フィルターは単純にレートで除算することで新しいタイムスタンプを計算できます。
デコーダーフィルター: デコーダーは、SetRate 呼び出しに対して上流へ渡す以外の処理を行うべきではありません。代わりに、上流のパーサーが発行する NewSegment 呼び出しに応答する必要があります。デコーダーフィルターは、新しいセグメント情報を受け取ると、その値を保存し、NewSegment 呼び出しを下流へ渡す必要があります。一部のデコーダーは、入力を補間して追加のタイムスタンプを生成する必要があります。その際にはレート変更を考慮する必要があります。
レンダラー: ビデオレンダラーは通常、入力されるフレームがすでに正しいタイムスタンプを持っているため、レート変更を無視できます。オーディオレンダラーは再生レートを変更する必要があります。オーディオデコーダーは通常、レート変更に伴う変換を行わないためです。
GetRate メソッドは、再生レートを取得します。
| pdRate | DOUBLE* | out | 再生レートを受け取る変数へのポインター。 |
戻り値
HRESULT 値を返します。とりうる値には次のものがあります。
| リターンコード | 説明 |
|---|---|
| 成功。 | |
| メソッドがサポートされていません。 | |
| NULL ポインター引数。 |
解説(Remarks)
再生レートは、通常速度に対する比率として表されます。したがって、1.0 は通常の再生速度、0.5 は半分の速度、2.0 は 2 倍の速度を表します。
GetPreroll メソッドは、開始位置より前にキューへ入れられるデータの量を取得します。
| pllPreroll | LONGLONG* | out | 現在の時間形式の単位で、プリロール時間を受け取る変数へのポインター。 |
戻り値
HRESULT 値を返します。とりうる値には次のものがあります。
| リターンコード | 説明 |
|---|---|
| 成功。 | |
| メソッドがサポートされていません。 | |
| NULL ポインター引数。 |
解説(Remarks)
プリロールとは、テーププレーヤーなどの非ランダムアクセスデバイスが再生を開始すべき、開始位置より前の時間のことです。
返される値は現在の時間形式で表されます。既定の時間形式は REFERENCE_TIME 単位 (100 ナノ秒) です。時間形式を変更するには、IMediaSeeking::SetTimeFormat メソッドを使用します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IMediaSeeking "{36B73880-C2C8-11CF-8B46-00805F6CEF60}" #usecom global IMediaSeeking IID_IMediaSeeking "{}" #comfunc global IMediaSeeking_GetCapabilities 3 var #comfunc global IMediaSeeking_CheckCapabilities 4 var #comfunc global IMediaSeeking_IsFormatSupported 5 var #comfunc global IMediaSeeking_QueryPreferredFormat 6 var #comfunc global IMediaSeeking_GetTimeFormat 7 var #comfunc global IMediaSeeking_IsUsingTimeFormat 8 var #comfunc global IMediaSeeking_SetTimeFormat 9 var #comfunc global IMediaSeeking_GetDuration 10 var #comfunc global IMediaSeeking_GetStopPosition 11 var #comfunc global IMediaSeeking_GetCurrentPosition 12 var #comfunc global IMediaSeeking_ConvertTimeFormat 13 var,var,int64,var #comfunc global IMediaSeeking_SetPositions 14 var,int,var,int #comfunc global IMediaSeeking_GetPositions 15 var,var #comfunc global IMediaSeeking_GetAvailable 16 var,var #comfunc global IMediaSeeking_SetRate 17 double #comfunc global IMediaSeeking_GetRate 18 var #comfunc global IMediaSeeking_GetPreroll 19 var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。#define global IID_IMediaSeeking "{36B73880-C2C8-11CF-8B46-00805F6CEF60}" #usecom global IMediaSeeking IID_IMediaSeeking "{}" #comfunc global IMediaSeeking_GetCapabilities 3 sptr #comfunc global IMediaSeeking_CheckCapabilities 4 sptr #comfunc global IMediaSeeking_IsFormatSupported 5 sptr #comfunc global IMediaSeeking_QueryPreferredFormat 6 sptr #comfunc global IMediaSeeking_GetTimeFormat 7 sptr #comfunc global IMediaSeeking_IsUsingTimeFormat 8 sptr #comfunc global IMediaSeeking_SetTimeFormat 9 sptr #comfunc global IMediaSeeking_GetDuration 10 sptr #comfunc global IMediaSeeking_GetStopPosition 11 sptr #comfunc global IMediaSeeking_GetCurrentPosition 12 sptr #comfunc global IMediaSeeking_ConvertTimeFormat 13 sptr,sptr,int64,sptr #comfunc global IMediaSeeking_SetPositions 14 sptr,int,sptr,int #comfunc global IMediaSeeking_GetPositions 15 sptr,sptr #comfunc global IMediaSeeking_GetAvailable 16 sptr,sptr #comfunc global IMediaSeeking_SetRate 17 double #comfunc global IMediaSeeking_GetRate 18 sptr #comfunc global IMediaSeeking_GetPreroll 19 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。