directX显示采集源(摄像头)filter

IGraphBuilder * g_pGraphBuilder = NULL;
IBaseFilter *Pbf=0;
IVideoWindow  * g_pVWindow = NULL;
IMediaControl * g_pMControl = NULL;
IMediaEventEx * g_pMEvent = NULL;
ICaptureGraphBuilder2 * g_pCaptureBuilder = NULL;
IVideoWindow  *g_pivw  = NULL;

void CTestDlg::OnButton5() 
{
// TODO: Add your control notification handler code here
HRESULT hr;
IBaseFilter *pSrcFilter=NULL;
     CoInitialize(NULL);
    // Create the filter graph
    hr = CoCreateInstance (CLSID_FilterGraph, NULL, CLSCTX_INPROC,
                           IID_IGraphBuilder, (void **) &g_pGraphBuilder);
    // Create the capture graph builder
    hr = CoCreateInstance (CLSID_CaptureGraphBuilder2 , NULL, CLSCTX_INPROC,
                           IID_ICaptureGraphBuilder2, (void **) &g_pCaptureBuilder);
    // Obtain interfaces for media control and Video Window
    hr = g_pGraphBuilder->QueryInterface(IID_IMediaControl,(LPVOID *) &g_pMControl);
    hr = g_pGraphBuilder->QueryInterface(IID_IVideoWindow, (LPVOID *) &g_pVWindow);
    hr = g_pGraphBuilder->QueryInterface(IID_IMediaEvent, (LPVOID *) &g_pMEvent);
         g_pGraphBuilder->QueryInterface(IID_IVideoWindow, (void **)&g_pivw);
    // Set the window handle used to process graph events
    hr = g_pMEvent->SetNotifyWindow((OAHWND)ghApp, WM_GRAPHNOTIFY, 0);
//
hr = g_pCaptureBuilder->SetFiltergraph(g_pGraphBuilder);
hr = FindCaptureDevice(&pSrcFilter);
    if (FAILED(hr))
    {
        // Don‘t display a message because FindCaptureDevice will handle it
        exit(1);
    }
    Pbf = pSrcFilter;
    // Add Capture filter to our graph.
    hr = g_pGraphBuilder->AddFilter(pSrcFilter, L"Video Capture");
hr = g_pCaptureBuilder->RenderStream (&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,
                                   pSrcFilter, NULL, NULL);
pSrcFilter->Release();

// hr = SetupVideoWindow(0);
///* //////////////////////////////////////////////////
    HWND m_hwnd = m_Screen2.GetSafeHwnd();
    m_Screen2.ModifyStyle(0, WS_CLIPCHILDREN);
    RECT rc;
m_Screen2.GetClientRect(&rc);

hr = g_pVWindow->put_Owner((OAHWND)m_hwnd);
hr = g_pVWindow->put_WindowStyle(WS_CHILD | WS_CLIPCHILDREN);

hr = g_pVWindow->SetWindowPosition(0, 0, (rc.right), (rc.bottom));
hr = g_pVWindow->put_Visible(OATRUE);//*/
//////////////////////////////////////////////////
DWORD g_dwGraphRegister=0;
hr = g_pMControl->Run();
//

}
int rate=1;
void CTestDlg::OnButton2() 
{   
if (pims)
{    
rate++;
if(rate==4)
{
rate=1;

}
pims->SetRate(rate);
CString str;
str.Format("快进>> X %d",rate);
(GetDlgItem(IDC_BUTTON2))->SetWindowText(str);
}

// pivw->GetCurrentImage(&lpCurrImage) ;

}

HRESULT FindCaptureDevice(IBaseFilter ** ppSrcFilter)
{
    HRESULT hr;
    IBaseFilter * pSrc = NULL;
    IMoniker *pMoniker;
    ULONG cFetched;

if (!ppSrcFilter)
        return E_POINTER;
   
    // Create the system device enumerator
    CComPtr <ICreateDevEnum> pDevEnum =NULL;

hr = CoCreateInstance (CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,
                           IID_ICreateDevEnum, (void **) &pDevEnum);
    if (FAILED(hr))
    {
    //    Msg(TEXT("Couldn‘t create system enumerator!  hr=0x%x"), hr);
        return hr;
    }

// Create an enumerator for the video capture devices
   // CComPtr <IEnumMoniker> pClassEnum = NULL;
IEnumMoniker *pClassEnum=0;
    hr = pDevEnum->CreateClassEnumerator (CLSID_VideoInputDeviceCategory, &pClassEnum, 0);
    if (FAILED(hr))
    {
      //  Msg(TEXT("Couldn‘t create class enumerator!  hr=0x%x"), hr);
        return hr;
    }

// If there are no enumerators for the requested type, then 
    // CreateClassEnumerator will succeed, but pClassEnum will be NULL.
    if (pClassEnum == NULL)
    {
        MessageBox(ghApp,TEXT("No video capture device was detected.\r\n\r\n")
                   TEXT("This sample requires a video capture device, such as a USB WebCam,\r\n")
                   TEXT("to be installed and working properly.  The sample will now close."),
                   TEXT("No Video Capture Hardware"), MB_OK | MB_ICONINFORMATION);
        return E_FAIL;
    }

// Use the first video capture device on the device list.
    // Note that if the Next() call succeeds but there are no monikers,
    // it will return S_FALSE (which is not a failure).  Therefore, we
    // check that the return code is S_OK instead of using SUCCEEDED() macro.
    /*if (S_OK == (pClassEnum->Next (1, &pMoniker, &cFetched)))
    {
        // Bind Moniker to a filter object
        hr = pMoniker->BindToObject(0,0,IID_IBaseFilter, (void**)&pSrc);
        if (FAILED(hr))
        {
          //  Msg(TEXT("Couldn‘t bind moniker to filter object!  hr=0x%x"), hr);
            return hr;
        }
    }
    else
    {
       // Msg(TEXT("Unable to access video capture device!"));   
        return E_FAIL;
    }*/

while(S_OK == (pClassEnum->Next (1, &pMoniker, &cFetched)))
    {
IPropertyBag *pProp= 0;
pMoniker->BindToStorage(0,0,IID_IPropertyBag,(void**)&pProp);
VARIANT varName;
varName.vt = VT_BSTR;
hr=pProp->Read(L"FriendlyName",&varName,0);
if(hr == NOERROR)
        {
CString str(varName.bstrVal);

if (str.Find("Virtual Camera",0)!=-1)
{
hr = pMoniker->BindToObject(0,0,IID_IBaseFilter, (void**)&pSrc);
if (FAILED(hr))
{
//  Msg(TEXT("Couldn‘t bind moniker to filter object!  hr=0x%x"), hr);
break;
}
break;
}

}
pMoniker->Release();
    }
    // Copy the found filter pointer to the output parameter.
    // Do NOT Release() the reference, since it will still be used
    // by the calling function.
    *ppSrcFilter = pSrc;

return hr;
}

时间: 2024-11-05 16:30:44

directX显示采集源(摄像头)filter的相关文章

在MyEclipse显示struts2源码和doc文档及自动完成功能

分类: struts2 2010-01-07 16:34 1498人阅读 评论(1) 收藏 举报 myeclipsestruts文档xmlfileurl 在MyEclipse显示struts2源码和doc文档及自动完成功能 在MyEclipse中显示struts的源码 -------右键点击/webAppName/WebRoot/WEB-INF/lib/struts2-core-2.1.8.1.jar -------propertes -------Java Source Attachment

OpenCV show two cameras 同时显示两个摄像头

用OpenCV同时显示两个摄像头的内容的代码如下: #include <iostream> #include <stdio.h> #include <tchar.h> #include <cv.h> #include <cvaux.h> #include <highgui.h> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { CvCapture* cam0 = c

百度网盘采集源码 ,直接采集网盘添加cookies功能

名称:百度网盘采集源码 程序语言:php 数据库:mysql 程序介绍: 1.直接采集百度网盘url 2.前端基于bootstrap 3.搜索考虑到后期上亿数据,是基于coreseek,搜索时间毫秒级. 4.前后端做了非常极致的seo优化 5.资源详情页面 为了使内容聚合度.相关度增加,添加了相关内容 6.精准分词功能 7.热门词自动采集 ps:修修补补将近2个月时间,最终开发完成,在seo方面下了很大功夫,有需要的可以联系 q-q:3420435647 演示网站:http://www.blue

Lazada 如何精准定位采集源页面

Lazada 卖家批量上传产品,特别是采集1688,淘宝,速卖通等店铺产品后,处理好库存是大问题.大批量的铺货,如何定位采集源是迫切需要解决的问题.目前CSV模式的上传软件无法解决产品源的,那是否有软件可以实现精准定位了. 采采Lazada 批量上货助手 针对此需求有独特的解决方法,右键点击选择 打开源页面,软件自动链接到采集源.我们来看软件是如何实现的. 复制粘贴产品名 Summer Bag Shoulder Bags For Women 到搜索框, 并点击搜索 2.软件定位出产品后> 右键点

Android之App界面的挂载与显示及源码分析

前言 入门 视图树 源码分析 前言 好久没有写博客了,都感觉有些生疏了. 总觉的人对自己要求高一些比较好,这样才进步比较快.接下来会继续给大家带来一些更有用的知识. 个人水平有限,如果感觉我的博客对您有用处,那就留个言给下鼓励:如果那里写的有误,请各位看客老爷多多拍砖! 注意:此处我使用的IDE是Android Studio 入门 相信每个人在学习Android时,都创建过很多Demo工程,那么下面的代码,大家一定非常眼熟了. public class MainActivity extends

Activity的创建和显示以及源码分析记录

Tips:此源码分析基于Android 4.2 先来看看一个Activity上的UI控件结构: 图1-1 Activity中的UI组件结构 好了现在开始分析...... 一.Activity的创建 了解android的zygote分裂你会知道,每个APP都是zygote的子进程,而他的入口函数是ActivityThread类中的main函数.其中有一个handleLaucherActivity函数,这里就是 创建Activity的地方. private void handleLaunchActi

[求助]谁能给我讲解一下,iOS编程要如何实时显示采集到的图像???

rt,最近搞一个高清图传,本着自(bu)主(mai)创(da)新(jiang)的原则,打算利用手中的iPad当作辅助飞行屏幕,USB传输数据.再说某疆图传7999(还只支持自家云台录像拍照),哪是我这等小学生消费得起的??? 现在刚绕明白OFDM正交子载波序列,又被接收端移动设备绕进去了.本来只考虑安卓的话是FT311无疑,但是……屏幕太小:换iOS?MFi过不去,只能类似电脑与iOS通讯方式. 通讯先不管,数据传进来如何显示???刷新率60Hz,先用Stream写成PNG再不断更新?还是直接按

在eclipse中显示Android源码

How to attach android source to eclipse? == == == 1.首先要下载Android相应SDK的源码文件 >可以使用SDK Manager工具下载,由于网络的问题,我没成功过 >直接百度需要的源码文件,比如你需要Android4.4的源码,搜索“android-19 source”即可,下载分分钟完事 我随便找就找到了:http://down.51cto.com/data/1202001 2.下载的文件是一个压缩文件,不用解压: 把源码文件放在相应的

WebDriverWait显示等待源码剖析

我们在使用selenium 查找元素的时候,为了避免网页加载慢,会加一个sleep(x秒) 这样能解决加载慢的问题,但也存在2个问题 1.如果你设置的等待时间过了,还没加载出来,就会报“NoSuchElementException” 2.如果设置等待5秒,2秒就加载出来了,也还是会再等3秒,这样影响执行效率 有什么好的方法呢? 当然是有的,selenium.webdriver.support.wait下有一个 WebDriverWait类,就能很好的解决上面的问题 具体用法如下 from sel