专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 多媒体/流媒体开发

directshow实现了视频采集,怎样保存?该如何解决

发布时间:2011-06-27 19:26:10 文章来源:www.iduyao.cn 采编人员:星星草
directshow实现了视频采集,怎样保存?
directshow实现了视频采集,怎样把采集的视频保存起来?
贴代码,关键看[视频开始采集]的代码就OK了。
C/C++ code

[color=#FF0000] //采集相关的变量[/color]
    IGraphBuilder *pGraph;    
    ICaptureGraphBuilder2 *pBuild; //视频采集过滤器图表
         IMediaControl *m_pMediaControl;
    //视频采集设备的源Filter   
    IBaseFilter* pSrc;
[color=#FF0000]//---------------------------------//[/color]

HRESULT hr;
    //创建IGraphBuilder
    CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder, (void      **)&pGraph);

    //创建ICaptureGraphBuilder2
    hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, 
        CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, (void**)&pBuild); 

    // 过滤器图表添加到管理器中
    pBuild->SetFiltergraph(pGraph); 

    pGraph->QueryInterface(IID_IVideoWindow, (void **)&m_pVidWin);
[color=#FF0000]//--------------------------------------------//
//以下代码为查找设备[/color]
    ICreateDevEnum *pDevEnum=NULL;
    IEnumMoniker *pClsEnum=NULL;

    //创建设备枚举COM对象
    CoCreateInstance(CLSID_SystemDeviceEnum,NULL,CLSCTX_INPROC,IID_ICreateDevEnum,(void **)&pDevEnum);

    //创建视频采集设备枚举COM对象
    pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pClsEnum,0);
    if(pClsEnum == NULL)
    {
        MessageBox(_T("Sorry, you have no video capture hardware.\r\n\r\nVideo capture will not function properly."));
        //如果没有设备,返回
        return ; 
    } 

    IMoniker *pMoniker = NULL;
    //如果先前的createclassenumerator调用成功了,可以用ienummoniker::next得到设备
    if(pClsEnum->Next(1,&pMoniker,NULL)==S_OK)
    {
        //调用imoniker::bindtoobject建立一个和选择的device联合的filter
        pMoniker->BindToObject(0,0,IID_IBaseFilter,(void **)&pSrc);
        pMoniker->Release();
    }

    //将设备添加到管理器graph
    hr = pGraph->AddFilter(pSrc, L"Video Capture");
[color=#FF0000]//---------------------------------------
//视频开始采集----------------------------//[/color]
    //连接一个源插口,将Filter添加到过滤器图表中
    hr=pBuild->RenderStream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Video,pSrc,NULL,NULL); 

    //设定视频窗口为主窗口的一个子窗口
    m_pVidWin->put_Owner((OAHWND)m_hWnd);
    m_pVidWin->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
    CRect rc;
    GetDlgItem(IDC_VW_FRAME)->GetWindowRect(rc);
    ScreenToClient(rc);

    //设定视频窗口
    m_pVidWin->SetWindowPosition(rc.left, rc.top, rc.Width(), rc.Height());

    hr=pGraph->QueryInterface(IID_IMediaControl, (void **)&m_pMediaControl);

    hr=m_pMediaControl->Run();    //运行Filter Graph
    if(FAILED(hr))
    {
        MessageBox(_T("加载运行失败!"));  
        return ;
    }




关键看视频开始采集的代码就OK了。
通过上面的代码,已经实现了视频采集(视频区域可以显示了),可是我想把采集的视频保存起来,应该是用以下的代码,
  //设置保存文件并初始化aviWriter
//pBuild->SetOutputFileName(&MEDIASUBTYPE_Avi,L"D;\\A.Avi",&vedioWriter,&fsFilter);
//保存文件
//pBuild->RenderStream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Video,pSrc,NULL,vedioWriter);

是不是我设置的参数错了,还是其他错误,应该怎么才能实现视频保存?

------解决方案--------------------
也看不出 什么大问题 你在这里多设几个断点调试了看看

//pBuild->SetOutputFileName(&MEDIASUBTYPE_Avi,L"D:\\A.Avi",&vedioWriter,&fsFilter);
//保存文件
//pBuild->RenderStream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Video,pSrc,NULL,vedioWriter);

------解决方案--------------------
这两句代码是加入一条写文件的链路,用于保存视频。
这是一种简便方式,不过不灵活。灵活的方式是手动建立链路。楼主可以参考dshow自带的那些例子,多用Grephedit来查看尝试一下。
------解决方案--------------------
明显是“;”的问题………………
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: