如何从其他DirectShow筛选器或捕获设备填充虚拟网络摄像头的缓冲区 这是我的代码,当我在图或Skype中使用它时,它重新启动,我尝试使用“IVMRWORTHOWORKEXECUT9”,并且使用过滤器基础,像任何捕获设备,我在C++中也是新的,所以我很

如何从其他DirectShow筛选器或捕获设备填充虚拟网络摄像头的缓冲区 这是我的代码,当我在图或Skype中使用它时,它重新启动,我尝试使用“IVMRWORTHOWORKEXECUT9”,并且使用过滤器基础,像任何捕获设备,我在C++中也是新的,所以我很,c++,directshow,C++,Directshow,如何从其他DirectShow筛选器或捕获设备填充虚拟网络摄像头的缓冲区 这是我的代码,当我在图或Skype中使用它时,它重新启动,我尝试使用“IVMRWORTHOWORKEXECUT9”,并且使用过滤器基础,像任何捕获设备,我在C++中也是新的,所以我很抱歉如果我误解了我的问题,那么你会帮助我吗? HRESULT CVCamStream::BuildGraph(IGraphBuilder* pGraph, IMediaSample* pSample) { REFERENCE_TIME

如何从其他DirectShow筛选器或捕获设备填充虚拟网络摄像头的缓冲区 <>这是我的代码,当我在图或Skype中使用它时,它重新启动,我尝试使用“IVMRWORTHOWORKEXECUT9”,并且使用过滤器基础,像任何捕获设备,我在C++中也是新的,所以我很抱歉如果我误解了我的问题,那么你会帮助我吗?
HRESULT CVCamStream::BuildGraph(IGraphBuilder* pGraph, IMediaSample* pSample)
{
    REFERENCE_TIME rtNow;

    REFERENCE_TIME avgFrameTime = ((VIDEOINFOHEADER*)m_mt.pbFormat)->AvgTimePerFrame;

    rtNow = m_rtLastTime;
    m_rtLastTime += avgFrameTime;
    pSample->SetTime(&rtNow, &m_rtLastTime);
    pSample->SetSyncPoint(TRUE);
    HRESULT hr = S_OK;
 
    CComPtr<IBaseFilter> pManyCam;
    hr = pManyCam.CoCreateInstance(CLSID_ManyCam);
    IVMRWindowlessControl9 * controlPtr = NULL;
   
    BYTE* pData=NULL;
    hr = controlPtr->GetCurrentImage(&pData);
    if (SUCCEEDED(hr))
    {
        BITMAPINFOHEADER* pBMIH = (BITMAPINFOHEADER*)pData;
        DWORD               bufSize = pBMIH->biSizeImage;

        // Let's create a bmp
        BITMAPFILEHEADER    bmpHdr;
        BITMAPINFOHEADER    bmpInfo;
        size_t              hdrSize = sizeof(bmpHdr);
        size_t              infSize = sizeof(bmpInfo);

        memset(&bmpHdr, 0, hdrSize);
        bmpHdr.bfType = ('M' << 8) | 'B';
        bmpHdr.bfOffBits = static_cast<DWORD>(hdrSize + infSize);
        bmpHdr.bfSize = bmpHdr.bfOffBits + bufSize;

        // Builder the bit map info.
        memset(&bmpInfo, 0, infSize);
        bmpInfo.biSize = static_cast<DWORD>(infSize);
        bmpInfo.biWidth = pBMIH->biWidth;
        bmpInfo.biHeight = pBMIH->biHeight;
        bmpInfo.biPlanes = pBMIH->biPlanes;
        bmpInfo.biBitCount = pBMIH->biBitCount;

        // boost::shared_arrays are awesome!
        //boost::shared_array<BYTE> buf(new BYTE[bmpHdr.bfSize]);//(lpDib);
        memcpy(new BYTE[bmpHdr.bfSize], &bmpHdr, hdrSize); // copy the header
        memcpy(new BYTE[bmpHdr.bfSize] + hdrSize, &bmpInfo, infSize); // now copy the info block
        memcpy(new BYTE[bmpHdr.bfSize] + bmpHdr.bfOffBits, pData, bufSize);

        // Do something with your image data ... seriously...
        CoTaskMemFree(pData);

    }

    return NOERROR;
}
HRESULT CVCamStream::BuildGraph(IGraphBuilder*pGraph,IMediaSample*pSample)
{
参考时间:现在;
参考时间avgFrameTime=((VIDEOINFOHEADER*)m_mt.pbFormat)->AvgTimePerFrame;
rtNow=m_rtLastTime;
mrtlastTime+=平均帧时;
pSample->SetTime(&rtNow和&mrtlastTime);
pSample->SetSyncPoint(TRUE);
HRESULT hr=S_正常;
首席执行官pManyCam;
hr=pManyCam.CoCreateInstance(CLSID_ManyCam);
IVMRWindowlessControl9*controlPtr=NULL;
字节*pData=NULL;
hr=controlPtr->GetCurrentImage(&pData);
如果(成功(hr))
{
BitMapInfo头文件*pBMIH=(BitMapInfo头文件*)pData;
DWORD bufSize=pBMIH->BISIZEMAGE;
//让我们创建一个bmp
位图文件头bmpHdr;
BitMapInfo标头bmpInfo;
size_t hdrSize=sizeof(bmpHdr);
size\u t infSize=sizeof(bmpInfo);
memset(&bmpHdr,0,hdrSize);
bmpHdr.bfType=('M'biWidth;
bmpInfo.biHeight=pBMIH->biHeight;
bmpInfo.biPlanes=pBMIH->biPlanes;
bmpInfo.bibibitcount=pBMIH->bibibitcount;
//boost::共享_阵列太棒了!
//boost::共享_数组buf(新字节[bmpHdr.bfSize]);/(lpDib);
memcpy(新字节[bmpHdr.bfSize],&bmpHdr,hdrSize);//复制头
memcpy(新字节[bmpHdr.bfSize]+hdrSize,&bmpInfo,infSize);//现在复制信息块
memcpy(新字节[bmpHdr.bfSize]+bmpHdr.bfOffBits,pData,bufSize);
//用你的图像数据做点什么…说真的。。。
CoTaskMemFree(pData);
}
返回无错误;
}