次の方法で共有


CSourceSeeking クラス

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/Video Capture を使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]

csourceseeking クラス階層

CSourceSeeking クラスは、1 つの出力ピンを持つソース フィルターでシークを実装するための抽象クラスです。

このクラスは 、IMediaSeeking インターフェイスを サポートします。 すべての IMediaSeeking メソッドの既定の実装が提供されます。 保護されたメンバー変数には、開始時刻、停止時間、および現在のレートが格納されます。 既定では、 クラスでサポートされる時間形式は TIME_FORMAT_MEDIA_TIME (100 ナノ秒単位) のみです。 詳細については、「解説」を参照してください。

保護されたメンバー変数 説明
m_rtDuration ストリームの期間。
m_rtStart 開始時刻。
m_rtStop 停止時間。
m_dRateSeeking 再生速度。
m_dwSeekingCaps 機能のシーク。
m_pLock ロック用のクリティカル セクション オブジェクトへのポインター。
プロテクト メソッド 説明
CSourceSeeking コンストラクター メソッド。
純粋仮想メソッド 説明
ChangeRate 再生レートが変化したときに呼び出されます。
ChangeStart 開始位置が変更されたときに呼び出されます。
ChangeStop 停止位置が変更されたときに呼び出されます。
IMediaSeeking メソッド 説明
IsFormatSupported 指定した時刻形式がサポートされているかどうかを判断します。
QueryPreferredFormat オブジェクトの優先時刻形式を取得します。
SetTimeFormat 時刻の形式を設定します。
IsUsingTimeFormat 指定した時刻形式が現在使用されている形式であるかどうかを判断します。
GetTimeFormat 現在の時刻形式を取得します。
GetDuration ストリームの期間を取得します。
GetStopPosition ストリームの再生時間を基準にして、再生が停止する時間を取得します。
GetCurrentPosition ストリームの合計継続時間を基準にして、現在位置を取得します。
GetCapabilities ストリームのすべてのシーク機能を取得します。
CheckCapabilities ストリームでシーク機能が指定されているかどうかを照会します。
ConvertTimeFormat ある時刻形式から別の時刻形式に変換します。
SetPositions 現在位置と停止位置を設定します。
GetPositions 現在の位置と停止位置を取得します。
GetAvailable シークが効率的な時間の範囲を取得します。
SetRate 再生速度を設定します。
GetRate 再生速度を取得します。
GetPreroll プリロール時間を取得します。

解説

開始位置、停止位置、または再生速度が変化するたびに、 CSourceSeeking オブジェクトは対応する純粋仮想メソッドを呼び出します。

派生クラスは、これらのメソッドを実装する必要があります。 シーク操作の後、フィルターは次の操作を行う必要があります。

  1. ダウンストリーム入力ピンで IPin::BeginFlush メソッドを呼び出します。
  2. データを配信しているワーカー スレッドを停止します。
  3. 入力ピンで IPin::EndFlush メソッドを呼び出します。
  4. ワーカー スレッドを再起動します。
  5. 入力ピンで IPin::NewSegment メソッドを呼び出します。
  6. 最初のサンプルで不連続性プロパティを設定します。 IMediaSample::SetDiscontinuity メソッドを呼び出します。

BeginFlush の呼び出しは、サンプルの配信を待機しているスレッドがブロックされている場合、ワーカー スレッドを解放します。

手順 2 で、スレッドがデータの送信を停止したことを確認します。 実装によっては、スレッドが終了するまで待機するか、スレッドが何らかの応答を通知する必要がある場合があります。 フィルターで CSourceStream クラスが使用されている場合、 CSourceStream::Stop メソッドはワーカー スレッドが応答するまでブロックします。

理想的には、新しいセグメント (手順 5) をワーカー スレッドから配信する必要があります。 フィルターがサンプルと共にシリアル化する限り、 CSourceSeeking オブジェクトでも実行できます。

次の例は、考えられる実装を示しています。 ソース フィルターの出力ピンが CSourceSeekingCSourceStream から派生していることを前提としています。 この例では、手順 1 4 を実行するヘルパー メソッド UpdateFromSeek を定義します。 CSourceStream::OnThreadStartPlay メソッドは、新しいセグメントを送信し、不連続性を示すフラグを設定するためにオーバーライドされます。 ワーカー スレッドはこのフラグを取得し、 IMediaSample::SetDiscontinuity メソッドを呼び出します。

void CMyStream::UpdateFromSeek()
{
    if (ThreadExists()) 
    {
        DeliverBeginFlush();
        Stop();
        DeliverEndFlush();
        Run();
    }
}

HRESULT CMyStream::OnThreadStartPlay()
{
    m_bDiscontinuity = TRUE;
    return DeliverNewSegment(m_rtStart, m_rtStop, m_dRateSeeking);
}

追加の時間形式のサポート

既定では、このクラスは参照時間 (TIME_FORMAT_MEDIA_TIME) の単位でのみシークをサポートしています。 追加の時刻形式をサポートするには、時間形式を処理する IMediaSeeking メソッドを オーバーライドします。

さらに、残りの IMediaSeeking メソッドを オーバーライドして、時間形式間で必要な変換を実行します。 SetTimeFormat メソッドを呼び出した後、すべての IMediaSeeking メソッドは、受信および送信の時刻パラメーターを新しい時刻形式として扱う必要があります。 たとえば、 m_rtDuration 変数が参照時間の単位で期間を表し、現在の時刻形式がフレームである場合、 GetDuration メソッドはフレームに変換 m_rtDuration 値を返す必要があります。 次に例を示します。

STDMETHODIMP GetDuration(LONGLONG *pDuration)
{
    HRESULT hr = CSourceSeeking::GetDuration(pDuration);
    if (SUCCEEDED(hr))
    {
        if (m_TimeFormat == TIME_FORMAT_FRAME)
        {
            // Convert from reference time to frames.
            *pDuration = TimeToFrame(*pDuration);  // Private method.
        }
    }
    return hr
} 

また、IMediaSeeking::SetPositions メソッドで AM_SEEKING_ReturnTime フラグをチェックしてください。 このフラグが存在する場合は、呼び出し元に戻すときに位置の値を参照時刻に変換します。

要件

要件
ヘッダー
Ctlutil.h (Streams.h を含む)
ライブラリ
Strmbase.lib (製品版ビルド);
Strmbasd.lib (デバッグ ビルド)

関連項目

ソース フィルターでのシークのサポート