[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]
クラスは CPosPassThru 、変換フィルターの seek コマンドを次のフィルターに上流に渡すことによって処理します。
アプリケーションがフィルター グラフをシークすると、フィルター グラフ マネージャーによって seek コマンドがレンダラー フィルターに渡されます。 コマンドは、コマンドを実行できるフィルター (存在する場合) に達するまで、各フィルターの出力ピンを介してアップストリームに渡されます。 詳細については、「 Seeking」を参照してください。 クラスは CPosPassThru 、次の図に示すように、すべての seek コマンドをアップストリーム フィルターの出力ピンに渡します。
このクラスは基底クラス ライブラリで提供されますが、DirectShow は Quartz.dll でも同じクラスを提供します。 Quartz.dll バージョンを使用すると、クラスが DLL から実行時に読み込まれるため、フィルター内のコード サイズを多少小さくできます。 そのバージョンを使用するには、 CreatePosPassThru 関数を呼び出します。
次のコードに示すように、出力ピンの NonDelegatingQueryInterface メソッドで、要求されたインターフェイスが IMediaSeeking または IMediaPosition である場合は常に CPosPassThru オブジェクトにデリゲートします。
// The following member variables are assumed:
IPin *m_pInput; // Pointer to the input pin on your filter.
IUnknown *m_pPos; // Pointer to the CPosPassThru object.
STDMETHODIMP CMyPin::NonDelegatingQueryInterface(REFIID riid, void **ppv)
{
HRESULT hr
if (riid == IID_IMediaPosition || riid == IID_IMediaSeeking)
{
if (m_pPos == NULL)
{
// We have not created the CPosPassThru object yet. Do so now.
hr = CreatePosPassThru(GetOwner(), FALSE, m_pInput, &m_pPos);
if (FAILED(hr)) return hr;
}
return m_pPos->QueryInterface(riid, ppv);
}
else
{
// Other interfaces (not shown).
}
}
~CMyPin::CMyPin()
{
// Release the CPosPassThruObject.
if (m_pPos != NULL) m_pPos->Release();
}
記載されている場合を除き、このクラスのすべての IMediaPosition メソッドと IMediaSeeking メソッドは、接続されたピンの対応するメソッドを呼び出し、結果を返します。
| パブリック メソッド | 説明 |
|---|---|
| CPosPassThru | コンストラクター メソッド。 |
| ForceRefresh | 互換性のために残されています。 |
| GetMediaTime | 現在のサンプルのタイム スタンプを取得します。 仮想。 |
| IMediaPosition メソッド | 説明 |
| get_Duration | ストリームの期間を取得します。 |
| put_CurrentPosition | ストリームの合計継続時間を基準にして、現在位置を設定します。 |
| get_StopTime | ストリームの再生時間を基準にして、再生が停止する時間を取得します。 |
| put_StopTime | ストリームの再生時間を基準にして、再生が停止する時間を設定します。 |
| get_PrerollTime | 開始位置の前にキューに格納されるデータの量を取得します。 |
| put_PrerollTime | 開始位置の前にキューに入るデータの量を設定します。 |
| get_Rate | 再生速度を取得します。 |
| put_Rate | 再生速度を設定します。 |
| get_CurrentPosition | ストリームの合計継続時間を基準にして、現在位置を取得します。 |
| CanSeekForward | ストリームを後方にシークできるかどうかを判断します。 |
| CanSeekBackward | ストリームを前方にシークできるかどうかを決定します。 |
| IMediaSeeking メソッド | 説明 |
| CheckCapabilities | ストリームでシーク機能が指定されているかどうかを照会します。 |
| ConvertTimeFormat | ある時刻形式から別の時刻形式に変換します。 |
| GetAvailable | シークが効率的な時間の範囲を取得します。 |
| GetCapabilities | ストリームのすべてのシーク機能を取得します。 |
| GetCurrentPosition | ストリームの合計継続時間を基準にして、現在位置を取得します。 |
| GetDuration | ストリームの期間を取得します。 |
| GetPositions | ストリームの合計継続時間を基準にして、現在の位置と停止位置を取得します。 |
| GetPreroll | 開始位置の前にキューに格納されるデータの量を取得します。 |
| GetRate | 再生速度を取得します。 |
| GetStopPosition | ストリームの再生時間を基準にして、再生が停止する時間を取得します。 |
| GetTimeFormat | 現在の時刻形式を取得します。 |
| IsFormatSupported | 指定した時刻形式がサポートされているかどうかを判断します。 |
| IsUsingTimeFormat | 指定した時刻形式が現在使用されている形式であるかどうかを判断します。 |
| QueryPreferredFormat | ストリームの優先時刻形式を取得します。 |
| SetPositions | 現在位置と停止位置を設定します。 |
| SetRate | 再生速度を設定します。 |
| SetTimeFormat | 時刻の形式を設定します。 |
| ヘルパー関数 | 説明 |
| CreatePosPassThru |
CPosPassThruまたは CRendererPosPassThru オブジェクトを作成します。 |
要件
| 要件 | 値 |
|---|---|
| ヘッダー |
|
| ライブラリ |
|