IMemAllocator::GetBuffer 方法 (strmif.h)

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

GetBuffer 方法检索包含空缓冲区的媒体示例。

语法

HRESULT GetBuffer(
  [out] IMediaSample   **ppBuffer,
  [in]  REFERENCE_TIME *pStartTime,
  [in]  REFERENCE_TIME *pEndTime,
  [in]  DWORD          dwFlags
);

参数

[out] ppBuffer

接收指向缓冲区的 IMediaSample 接口的指针。 调用方必须释放接口。

[in] pStartTime

指向示例开始时间的指针,或 NULL

[in] pEndTime

指向示例结束时间的指针,或 NULL

[in] dwFlags

以下标志中零个或多个的按位组合:

标志 描述
AM_GBF_NOTASYNCPOINT 此示例不是同步点。 此示例不允许动态格式更改。 当在覆盖混音器或 VMR 上调用时,此标志表示返回的缓冲区将包含与上次传递的映像相同的映像。
AM_GBF_PREVFRAMESKIPPED 此示例是中断后的第一个示例。 (只有视频呈现器使用此标志。)
AM_GBF_NOWAIT 不要等待缓冲区变为可用。
AM_GBF_NODDSURFACELOCK 视频混合呈现器筛选器 7 一起使用,以请求未锁定的 DirectDraw 图面。 有关详细信息,请参阅 使用 Direct3D 呈现目标

返回值

返回 HRESULT 值。 可能的值包括下表中显示的值。

返回代码 说明
S_OK
成功。
VFW_E_NOT_COMMITTED
分配器已解除提交。
VFW_E_TIMEOUT
已超时。

备注

默认情况下,此方法会阻止,直到可用示例可用或分配器已取消提交。 如果调用方指定了AM_GBF_NOWAIT标志,并且没有可用的示例,则分配器可以立即返回返回值VFW_E_TIMEOUT。 但是,分配器不需要支持此标志。

ppBuffer 中返回的示例具有有效的缓冲区指针。 调用方负责设置示例上的任何其他属性,例如时间戳、媒体时间或同步点属性。 (有关详细信息,请参阅 IMediaSample.)

pStartTimepEndTime 参数不应用于示例。 分配器可能使用这些值来确定它检索的缓冲区。 例如, 视频呈现器 筛选器使用这些值来同步 DirectDraw 图面之间的切换。 若要在示例上设置时间戳,请调用 IMediaSample::SetTime 方法。

在调用此方法之前,必须调用 IMemAllocator::Commit 方法。 调用 IMemAllocator::D ecommit 方法后,此方法失败。

要求

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

另请参阅

错误和成功代码

IMemAllocator 接口