IMediaDet::GetBitmapBits 方法

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

注意

[已弃用。 此 API 可能会从 Windows 的未来版本中删除。]

 

方法 GetBitmapBits 在指定的媒体时间检索视频帧。 返回的帧始终采用 24 位 RGB 格式。

语法

HRESULT GetBitmapBits(
   double StreamTime,
   long   *pBufferSize,
   char   *pBuffer,
   long   Width,
   long   Height
);

参数

StreamTime

检索视频帧的时间(以秒为单位)。

pBufferSize

接收所需的缓冲区大小。 如果 pBufferNULL,则变量接收检索帧所需的缓冲区大小。 如果 pBuffer 不为 NULL,则忽略此参数。

pBuffer

指向接收 BITMAPINFOHEADER 结构后跟 DIB 位的缓冲区的指针。

Width

视频图像的宽度(以像素为单位)。

Height

视频图像的高度(以像素为单位)。

返回值

返回 HRESULT 值。 可能的值如下所示:

返回代码 说明
S_OK
成功。
E_NOINTERFACE
无法将 示例抓取器 筛选器添加到图形。
E_OUTOFMEMORY
内存不足。
E_POINTER
NULL 指针错误。
E_UNEXPECTED
意外错误。
VFW_E_INVALIDMEDIATYPE
媒体类型无效。

 

备注

在调用此方法之前,请通过调用 IMediaDet::p ut_FilenameIMediaDet::p ut_CurrentStream 来设置文件名和流。

若要确定所需的缓冲区的大小,请使用 pBuffer 等于 NULL 调用此方法。 大小在 pBufferSize 指向的变量中返回。 然后创建缓冲区并再次调用 方法, pBuffer 等于缓冲区的地址。 方法返回时,缓冲区包含 位图后跟的 BITMAPINFOHEADER 结构。 位图将缩放到 WidthHeight 参数中指定的尺寸。

此方法将媒体检测器置于位图抓取模式。 调用此方法后,除非创建媒体检测器的新实例,否则 IMediaDet 中的各种流信息方法将不起作用。

注意

头文件 Qedit.h 与版本 7 之后的 Direct3D 标头不兼容。

 

注意

若要获取 Qedit.h,请下载适用于 Windows Vista 和 .NET Framework 3.0 的Microsoft Windows SDK更新。 Qedit.h 在 Windows 7 和 .NET Framework 3.5 Service Pack 1 的Microsoft Windows SDK中不可用。

 

示例

以下代码使用 GetBitmapBits 方法创建与设备无关的位图。

long size;
hr = pDet->GetBitmapBits(0, &size, 0, width, height);
if (SUCCEEDED(hr)) 
{
    char *pBuffer = new char[size];
    if (!pBuffer)
        return E_OUTOFMEMORY;
    try {
        hr = pDet->GetBitmapBits(0, 0, pBuffer, width, height);
    }
    catch (...) {
        delete [] pBuffer;
        throw;
    }
    if (SUCCEEDED(hr))
    {
        BITMAPINFOHEADER *bmih = (BITMAPINFOHEADER*)pBuffer;
        HDC hdcDest = GetDC(0);
        
        // Find the address of the start of the image data.
        void *pData = pBuffer + sizeof(BITMAPINFOHEADER);
        
        // Note: In general a BITMAPINFOHEADER can include extra color
        // information at the end, so calculating the offset to the image
        // data is not generally correct. However, the IMediaDet interface
        // always returns an RGB-24 image with no extra color information.
        
        BITMAPINFO bmi;
        ZeroMemory(&bmi, sizeof(BITMAPINFO));
        CopyMemory(&(bmi.bmiHeader), bmih, sizeof(BITMAPINFOHEADER));
        HBITMAP hBitmap = CreateDIBitmap(hdcDest, bmih, CBM_INIT, 
            pData, &bmi, DIB_RGB_COLORS);
    }
    delete[] pBuffer;
}

要求

要求
标头
Qedit.h

Strmiids.lib

另请参阅

IMediaDet 接口

错误和成功代码