增强的视频渲染器快照图像为空

时间:2014-02-17 07:07:28

标签: c++ image directshow snapshot renderer

我正在尝试使用增强型视频渲染器拍摄当前渲染流的快照图像。我可以从文件或采集卡中显示视频。我跑的时候

if (pDisplay)
{
    BITMAPINFOHEADER lpHeader = { 0 };
    BYTE* lpCurrImage = NULL;
    DWORD bitmapSize = 0;
    LONGLONG timestamp = 0;
    lpHeader.biSize = sizeof(BITMAPINFOHEADER);

    if (SUCCEEDED(hr = pDisplay->GetCurrentImage(&lpHeader, &lpCurrImage, &bitmapSize, &timestamp)))
    {

输出图像数据为0,见下图: enter image description here

出于某种原因,当我使用VMR7或9时,图像工作正常并具有数据(渲染相同的视频),但EVR无法获得图像。输出的位图是14kb(这是标题信息)。

有关详细信息,请参阅以下代码,用于呈现EVR:

HRESULT InitializeWindowlessEVR(IGraphBuilder* pGraph, IBaseFilter** ppEVR)
{
    IBaseFilter* pEvr = NULL;
    CComPtr<IMFGetService> pServices;
    CComPtr<IMFQualityAdvise2> pAdvise;

    if (!ppEVR)
        return E_POINTER;
    *ppEVR = NULL;

    // Create the VMR and add it to the filter graph.
    HRESULT hr = CoCreateInstance(CLSID_EnhancedVideoRenderer, NULL,
        CLSCTX_INPROC, IID_IBaseFilter, (void**)&pEvr);
    if (SUCCEEDED(hr))
    {
        hr = pGraph->AddFilter(pEvr, L"Enhanced Video Renderer");
        if (SUCCEEDED(hr))
        {
            // Update the window settings
            CHECK_HR(pEvr->QueryInterface(IID_IMFGetService, (void**)&pServices));
            CHECK_HR(pServices->GetService(MR_VIDEO_RENDER_SERVICE, IID_IMFVideoDisplayControl, (void**)&pVideoDisplay));
            CHECK_HR(pVideoDisplay->SetVideoWindow(ghApp));
            CHECK_HR(pVideoDisplay->SetAspectRatioMode(MFVideoARMode_PreservePicture));
        }

        pEvr->AddRef();
        *ppEVR = pEvr;
        pEvr->Release();
        pEvr = NULL;
    }
done:
    return hr;
}

请帮我弄清楚为什么我无法获得EVR的图像,我不想回去使用VMR9。如果有帮助,我可以发布更多代码。提前谢谢!

答案:

BOOL CaptureImage(LPCTSTR szFile)
{
    if (pVideoDisplay)
    {
        BYTE* lpCurrImage = NULL;
        BITMAPINFOHEADER lpHeader = { 0 };
        DWORD bitmapSize = 0;
        LONGLONG timestamp = 0;
        lpHeader.biSize = sizeof(BITMAPINFOHEADER);

        if (SUCCEEDED(pVideoDisplay->GetCurrentImage(&lpHeader, &lpCurrImage, &bitmapSize, &timestamp)))
        {
            // Create a new file to store the bitmap data
            HANDLE hFile = CreateFile(szFile, GENERIC_WRITE, FILE_SHARE_READ, NULL,
                CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);

            if (hFile == INVALID_HANDLE_VALUE)
                return FALSE;

            DWORD dwWritten;
            BITMAPFILEHEADER fileHeader;
            fileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
            fileHeader.bfReserved1 = 0;
            fileHeader.bfReserved2 = 0;
            fileHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + lpHeader.biSizeImage;
            fileHeader.bfType = 0x4d42;

            // Write the bitmap header and bitmap bits to the file
            WriteFile(hFile, (LPCVOID)&fileHeader, sizeof(BITMAPFILEHEADER), &dwWritten, 0);
            WriteFile(hFile, (LPCVOID)&lpHeader, sizeof(BITMAPINFOHEADER), &dwWritten, 0);
            WriteFile(hFile, (LPCVOID)lpCurrImage, bitmapSize, &dwWritten, 0);

            CloseHandle(hFile);

            CoTaskMemFree(lpCurrImage);
            return TRUE;
        }
        else
        {
            return FALSE;
        }
    }
    return FALSE;
}

0 个答案:

没有答案