zoukankan      html  css  js  c++  java
  • IVideoWindow 在directshow采集链路中的使用

    dshow中一个完整采集链路一般如下:

    Capture Device----->SampleGraber ------>Render

    如果只要采集原始数据可以不用渲染链路那就如下:

    Capture Device----->SampleGraber ------>Null Render

    在很多dshow的demo中遇到过很多关于设置窗体的步骤,也就是标题 IVideoWindow 的设置。

    以前没太注意过这个设置,看到别人的demo里有这个设置也就加上了,代码如下:

    if (FAILED(graph_->QueryInterface(IID_IVideoWindow, (void **)&active_video_window_)))
            {
            return -1;
            }
    
    
            if (active_video_window_)
            {
            if (FAILED(active_video_window_->put_AutoShow(OAFALSE)))
            {
            return -1;
            }

    上面的代码作用是吧渲染窗体隐藏,如果不隐藏的话,在连接整个链路运行的时候会自动弹出一个渲染窗体(如果上面的链路有Render filter)

    后来对这一块代码仔细研究了一下发现如果我只是单纯的采集摄像头原始数据的话也就不需要设置隐藏窗体这一步骤了

    所以后来就把这一块代码注释了。

    再后来再一次测试使用 graph_->Render 智能连接的时候出现了问题。

    使用graph_->Render 的话就需要吧上面的 NULL Render 废弃掉 链路如下:

    Capture Device----->SampleGraber -----graph_->Render---->?

    让Graph 去智能连接下面的链路的话,智能连接一般不会去给你连接一个Null Render 因为它不知道你是否想预览数据。

    一般情况下使用filter 的智能连接 是不太透明的,在程序当中尽量避免使用智能连接,当然这种情况也有例外的情况比如:

    virtual HRESULT STDMETHODCALLTYPE RenderStream( 
                /* [annotation][in] */ 
                _In_opt_  const GUID *pCategory,
                /* [in] */ const GUID *pType,
                /* [in] */ IUnknown *pSource,
                /* [in] */ IBaseFilter *pfCompressor,
                /* [in] */ IBaseFilter *pfRenderer) = 0;

    RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, A, B,C);

    其中A,B,C 不为NULL 链路:----A------------B---------------------C----

    如果上面这种指定filter的智能连接是可以使用的,因为目标比较明确,而且还省略了去获取IPin 的步骤让Graph 去自动帮你选择。

    ------------------------------------------

    继续说上面的graph_->Render 这种用法如果使用了很大可能在闭合链路的时候graph 给你连接的链路如下:

    Capture Device----->SampleGraber ------>Render

    而这个时候就需要 标题 IVideoWindow 的设置,如果不设置的话,在run之后会自动弹出预览窗口(因为闭合链路的时候graph 连接的是一个 Render Filter )

    从这个现象也就能明白 IVideoWindow 作用了。

    总结有点乱,大致意思就是如果你使用的智能连接链路 那就需要注意一下 IVideoWindow  

    参考:https://docs.microsoft.com/zh-cn/windows/desktop/DirectShow/combining-video-capture-and-preview

  • 相关阅读:
    WriteFile函数
    良好的动态内存申请与释放
    只需一条命令,快速在Windows 10上关闭Linux
    盘点程序员过年最怕被问的问题:薪资问题首当其冲,对象问题紧追其后
    程序员为什么是吃青春饭,而不是像医生律师一样越老越值钱?
    Linux网络配置的三种方法,手把手教你,一看就会!
    应届程序员VS往届程序员:当面对HR和领导时,此时的内心活动是这样的...
    MySql数据在磁盘上到底是怎么存储的?被存储的数据怎么查找?
    如何写出高质量的代码?优秀的程序员都是这样做的
    哼!MySQL 8.0不讲武德,给我挖坑!
  • 原文地址:https://www.cnblogs.com/wainiwann/p/10039281.html
Copyright © 2011-2022 走看看