CPosPassThru 类

[与此页面关联的功能 DirectShow 是一项旧功能。 它已被 MediaPlayerIMFMediaEngine媒体基金会中的音频/视频捕获取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]

cpospassthru 基类层次结构

CPosPassThru通过将转换筛选器上游传递给下一个筛选器来处理查找命令。

当应用程序查找筛选器图时,筛选器关系图管理器会将 seek 命令提供给呈现器筛选器。 命令通过每个筛选器的输出引脚上游传递,直到它到达可以执行命令的筛选器 ((如果有任何) )。 有关详细信息,请参阅 查找。 类CPosPassThru将所有查找命令传递到上游筛选器上的输出引脚,如下图所示。

cpospassthru 类上游发送 seek 命令。

尽管此类是在基类库中提供的,但 DirectShow 还在 Quartz.dll 中提供相同的类。 使用 Quartz.dll 版本可以在一定程度上减小筛选器中的代码大小,因为 类是在运行时从 DLL 加载的。 若要使用该版本,请调用 CreatePosPassThru 函数。

在输出引脚的 NonDelegatingQueryInterface 方法中,每当请求的接口为 IMediaSeekingIMediaPosition 时,委托给 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();
}

除非另有说明,否则此类中的所有 IMediaPositionIMediaSeeking 方法都会调用连接的引脚上的相应方法并返回结果。

公共方法 说明
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 设置时间格式。
Helper 函数 说明
CreatePosPassThru CPosPassThru创建 或 CRendererPosPassThru 对象。

要求

要求
标头
Ctlutil.h (包括 Streams.h)

Strmbase.lib (零售版本) ;
Strmbasd.lib (调试生成)