IAsyncReader::Request 方法 (strmif.h)

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

方法 Request 对数据的异步请求进行排队。

语法

HRESULT Request(
       IMediaSample *pSample,
  [in] DWORD_PTR    dwUser
);

参数

pSample

指向调用方提供的媒体示例 的 IMediaSample 接口的指针。

[in] dwUser

指定请求完成时返回的任意值。

返回值

返回 HRESULT 值。 可能的值包括以下值。

返回代码 说明
S_OK
成功。
VFW_E_BADALIGN
缓冲区未正确对齐。
VFW_E_SAMPLE_TIME_NOT_SET
该示例未标记时间戳。
VFW_E_WRONG_STATE
引脚正在刷新。
HRESULT_FROM_WIN32 (ERROR_HANDLE_EOF)
请求的开始位置已超过文件的末尾。
E_OUTOFMEMORY
内存不足。

注解

在调用此方法之前,请从引脚的分配器中检索媒体示例。 使用请求的字节偏移量(包括第一个和最后一个)乘以 10,000,000 的时间戳示例。 字节偏移量相对于流的开始时间。

开始和停止位置应与引脚连接时确定的对齐方式匹配。 否则,方法可能会返回VFW_E_BADALIGN。 如果商定的对齐方式比流的实际对齐方式粗糙,则停止位置可能会超过实际持续时间。 如果是这样,方法会将停止位置向下舍入到实际对齐方式。

尽管从技术上讲,它违反了 COM 规则,但调用方必须在示例上保留未完成的引用计数。 方法 Request 不调用 AddRefRelease,因此需要引用计数才能使示例保持活动状态。

方法在请求完成之前返回 。 调用 IAsyncReader::WaitForNext 方法来等待请求。 在请求挂起时,请勿重复使用原始媒体示例。 WaitForNext 方法返回指向原始示例的指针。 如果请求成功,示例将包含请求的数据。 WaitForNext 方法还返回 dwUser 参数中指定的任何值。 调用方可以使用此值来标识示例。

示例

以下示例演示输入引脚的可能帮助程序函数,以将请求排入队列:

C++
CMyPin::QueueSample(long cbFirst, long cbLast, DWORD_PTR dwuser)
{
    IMediaSample* pSample = NULL;
    HRESULT hr = m_pAlloc->GetBuffer(&pSample, NULL, NULL, 0);
    if (FAILED(hr)) 
    { 
        return hr; 
    }

    LONGLONG tStart = cbFirst * 10000000, tStop = cbLast * 10000000;
    hr = pSample->SetTime(&tStart, &tStop);
    if (SUCCEEDED(hr))
    {
        hr = m_pReader->Request(pSample, dwuser);
    }

    if (FAILED(hr))
    {
        pSample->Release();
    }
    return hr;
}

要求

要求
最低受支持的客户端 Windows 2000 Professional [仅限桌面应用]
最低受支持的服务器 Windows 2000 Server [仅限桌面应用]
目标平台 Windows
标头 strmif.h (包括 Dshow.h)
Library Strmiids.lib

另请参阅

错误和成功代码

IAsyncReader 接口