DirectShow--用GraphEdit辅助调试

2023-11-06

前面的话

GraphEdit

  微软的SDK里面有个DirectShow的辅助工具GraphEdit,这里的文字简单介绍如何将应用程序生成的GraphBuilder插入到GraphEdit中直观的显示。

  可能一开始我们对这种应用有点儿不理解,既然是自己写的代码,GraphBuilder里面的链路也是自己建立的,有必要多此一举么? 其实不然,微软在生成GraphBuilder其中的数据链路时,并不是完全按照咱们的代码中指示连接的,连接的真正过程包含了一些自动化的因素。比如我设置一个H.264 Decoder Filter直接连接播放Render Filter,Connet是成功的,从代码里看是Decoder的输出PIN直接连到Render的输入PIN,但是实际情况并不是这样,在GraphEdit里面显示你会发现,Decoder和Render之间被插入一个Color Space Converter的Filter,它负责吧Decoder的输出从YUV420的格式转换成Render能接受的RGB32格式。另一个例子,摄像头的输出可以直接接Render Filter,但是实际系统会在采集设备和Render之间插入解码器MJPEG Decompressor和色彩空间转换模块Color Space Converter。微软的这种自动化手段可以大大的简化我们建立GraphBuilder的过程(我粗略的统计了一下,基本每个工程都能减少40%到70%的代码量),产生的问题是这种自动化是隐性的,不直观可见的,不会体现在代码中。GraphEdit这个小工具就给我们提供了这样一个手段,去一窥其中究竟。

GraphEdit的简单使用

  GraphEdit是一个很简单的工具软件,其实基本不用教大家也会用,但是为了文章的完整性,这里简单介绍两个最基本的功能。

 

  GraphEdit上方蓝色方块的按钮<Add Filter to graph>,点击后会出现上面图示的对话框。这个对话框中,你可以查看系统里现有的所有注册Filter;你可以知道Filter对应的文件的位置和名称;你可以知道Filter的FriendlyName用来枚举识别;你可以知道Filter的GUID用来直接创建实例,你可以知道Filter所有PIN的类型数量,并且可以知道每个PIN支持什么样的媒体类型,并知道该媒体类型的GUID或者名称。

  在设计一个GraphBuilder之初,浏览这个名为Which filters do you want to insert的对话框,比查询MSDN可要方便快速多了。当然更多的细节还是要到如下地址去查询。MSDN Filters 

功能(2)测试

  GraphEdit也可以作为一个Filter的测试平台。当我们自己写好一个Filter并对它进行注册后,就可以在Filter列表中找到我们自己的Filter〈一般会出现在DircetShow Filters那个目录树底下〉。我们可以插入自己的Filter然后组建起一个链路,点击绿色箭头运行就可以测试了。这样进行测试不用写Test程序,实现快速容易,可以避免引入额外的错误。当然这一切的前提是您Filter的Propage要好好地写,使用Propage能配置你Filter运行需要的一切参数。

用GraphEdit辅助调试

  这就是本文的重点了,首先必须要告诉您一个技巧,在使用GraphEdit加载您应用程序中的GraphBuilder之前,您必须先注册一个名为proppage.dll的文件,这个DLL就在GraphEdit同一个不录下,一般在SDK的Bin目录中。加载方法罗嗦一下,管理员权限的CMD窗口中"regsvr32 ./proppage.dll"回车。加载这个DLL以后GraphEdit的功能会稍稍出现变化,Filter的属性页会增加一两个Tab,你可以在属性页中查询一个Filter当前的输入输出的媒体类型和参数,也可以查询未连接PIN支持的所有媒体类型和参数。

  要使用GraphEdit辅助调试应用程序,只需如下两步:

Step(1)代码中实现AddGraphToRot( )和RemoveGraphFromRot( )

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

HRESULT AddGraphToRot(IUnknown *pUnkGraph, DWORD *pdwRegister)
{
    IMoniker * pMoniker;
    IRunningObjectTable *pROT;
    WCHAR wsz[128];
    HRESULT hr;

    if (!pUnkGraph || !pdwRegister)
        return E_POINTER;

    if (FAILED(GetRunningObjectTable(0, &pROT)))
        return E_FAIL;

    hr = StringCchPrintfW(wsz, NUMELMS(wsz), L"FilterGraph %08x pid %08x\0", (DWORD_PTR)pUnkGraph,
              GetCurrentProcessId());

    hr = CreateItemMoniker(L"!", wsz, &pMoniker);
    if (SUCCEEDED(hr))
    {
        // Use the ROTFLAGS_REGISTRATIONKEEPSALIVE to ensure a strong reference
        // to the object.  Using this flag will cause the object to remain
        // registered until it is explicitly revoked with the Revoke() method.
        //
        // Not using this flag means that if GraphEdit remotely connects
        // to this graph and then GraphEdit exits, this object registration
        // will be deleted, causing future attempts by GraphEdit to fail until
        // this application is restarted or until the graph is registered again.
        hr = pROT->Register(ROTFLAGS_REGISTRATIONKEEPSALIVE, pUnkGraph,
                            pMoniker, pdwRegister);
        pMoniker->Release();
    }

    pROT->Release();
    return hr;
}

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

void RemoveGraphFromRot(DWORD pdwRegister)
{
    IRunningObjectTable *pROT;

    if (SUCCEEDED(GetRunningObjectTable(0, &pROT)))
    {
        pROT->Revoke(pdwRegister);
        pROT->Release();
    }
}

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

这两个函数无需修改,直接贴到代码里面就可以使用。

在主函数调用时,首先声明一个DWORD 的句柄g_dwGraphRegister;

然后在初始化完GraphBuilder后Run之前调用AddGraphToRot( pMyGraph, &dwGraphRegister);

最后在函数推出之前调用RemoveGraphFromRot(DWORD dwGraphRegister);
这两个函数在SDK的例子里面都有出现,比如大家可以去看看Cap这个例子。

Step(2)在程序运行过程中显示

  使用很简单了,点击"Connect to a running graph in another application"这个快捷键〈图标跟GraphEdit图标一样的那个〉就会出现以下对话框,选择一个点OK。


我们程序里面运行的GraphBuilder就会出现在眼前了。

我KaO怎么跟设计的不一样。Jok~ Jok~

我总结要注意的有以下两点:

一是运行程序的权限要和运行GraphEdit的一致,比如我调试SDK例子用的管理员权限,启动调试后打开GraphEdit必须也用管理员权限,否则啥也别想看见;

二是调试中不要试图用GraphEdit加载一个已经被中断的Application,那样您的GraphEdit就等着杀进程吧。

 

另外,有时候GraphEdit会不能正常显示,一启动就被最小化。那时候打开任务管理器到应用程序页面,选GraphEdit点右键选最大化就可以了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DirectShow--用GraphEdit辅助调试 的相关文章

  • 在Python中从字典中删除某些键的最快方法

    我正在寻找删除 python 字典中某些键的最快 有效的方法 这里有一些选项 for k in somedict keys if k startswith someprefix del somedict k or dict k v for
  • Solr距离过滤

    我正在尝试使用 Solr 进行距离范围搜索 我知道在5公里范围内进行搜索过滤很容易 q fq geofilt pt 45 15 93 85 sfield store d 5 我所追求的是如果我正在寻找一系列的说法 如何做同样的事情5至10公
  • 将边权重传递给networkx中的graphviz_layout

    每个人都找不到如何将权重列表的属性名称传递给networkx中的graphviz layout 像这样的事情 nx spring layout G weight weight sum 但与nx graphviz layout G 也许有人会
  • 在尝试找到最长路径的同时消除有向无环图中的无关边

    我问了一个question https stackoverflow com q 8685598 35690关于在可变数量的集合中查找没有重复字符的子序列 解决方案是创建每对字母的矩阵 丢弃每组中未出现的字母 然后找到最长路径 http en
  • 根据 Python Pandas 中的描述场景和状态过滤产品

    假设我在 Pandas DataFrame 中有以下产品描述 我想保留满足以下条件的产品的所有产品描述 对于每一个id in product descriptions 检查是否包含全部descriptions从 至少 1 个场景scenar
  • 同时使用两个数组中的元素的过滤器

    假设我们有两个大小相同的数组 A and B 现在 我们需要一个过滤器 对于给定的掩码大小 从以下位置选择元素A 但删除掩码的中心元素 并在其中插入相应的元素B 所以 3x3 伪掩码 看起来类似于 A A A A B A A A A 对平均
  • Array.filter 与 $filter('filter')

    我应该在 Angular 应用程序中使用哪一个 为什么 array filter o gt o name myName or filter filter array name myName true 关键的区别是快捷方式或语法糖由提供 fi
  • 使用组合框过滤文本框

    好吧 我必须创建一个表单 它获取文件夹的内容并将其列出在文本框中 是的 文本框不是列表框 然后 我必须使用包含文件夹所有扩展名的组合框来过滤此文本框 例如 如果我在组合框中选择 txt 则文本框应过滤以仅显示所有文本文件 除了让组合框过滤文
  • 在 Zend Framework 应用程序中,/views/filters 有什么用途?

    我知道视图助手的作用 view helpers 但我不知道视图过滤器 view filters 是什么 或者它的用途是什么 有人可以解释一下这个问题吗 谢谢你 在渲染视图结束时 Zend View 将输出传递给您已注册的任何过滤器 方法是调
  • 什么是好的、免费的 PHP 图表套件?

    我要做的只是基本的折线图 任何人分享的经验将不胜感激 不是真正的 PHP 但我发现 amchart 非常容易实现 而且看起来很棒 http www amcharts com http www amcharts com 还可以查看 Googl
  • 如何根据开始和结束条件过滤数据?

    我试图根据依赖于连续日期的两个条件来过滤数据 我在寻找对于 5 个以上的连续日期 值低于 2 with a 缓冲期 of 值 2 到 5 最多连续 3 天 它看起来像这样 很抱歉这里的 Excel 尝试很糟糕 第 1 天到第 10 天将包括
  • boost::property_map 在 boost 中是如何实现的以及如何更改它

    我想知道属性映射是如何在提升图中实现的 例如 我的顶点和边属性定义如下 vertex property gt struct NodeInfo int a b c actual bundled property struct NodeInfo
  • ZedGraph 垂直线与 LineObj 问题

    我有一个 ZedGraphControl 里面有几条曲线 我想在一些固定的 x 位置添加垂直线 当然 这些线只能位于实际图形区域内 我尝试以下 LineObj line new LineObj Color Black xPos myPane
  • 向图节点添加标签

    我使用 visnetwork 库制作了下图 library tidyverse library igraph set seed 123 n 15 data data frame tibble d paste 1 n relations da
  • .NET(或 MFC)的高速图形控件?

    我需要编写一个数字示波器类型的应用程序 有很多很棒的静态绘图控件 但我需要一些可以绘制每秒处理 4000 个样本的 16 条轨迹的东西 有人知道 NET 的高速图形控件吗 我什至会选择 MFC 因为它可以封装到 NET 控件中 谢谢您的帮助
  • 将 dataGridView 绑定到绑定列表并按文本框过滤行

    我正在开发一个 Winforms 应用程序 并且有一个已经绑定到 dataGridView 的对象的 BindingList 我还有一个 过滤器 文本框 如果它们与文本框文本不匹配 我想从 datagridview 行中过滤掉行 我想以某种
  • Floyd-Warshall 算法:获取最短路径

    假设一个图由一个表示n x n维数邻接矩阵 我知道如何获得所有对的最短路径矩阵 但我想知道有没有办法追踪所有最短路径 Blow是python代码实现 v len graph for k in range 0 v for i in range
  • 熊猫:有条件的groupby

    我有数据框 ID used at active seconds subdomain visiting category 123 2016 02 05 19 39 21 2 yandex ru 2 Computers 123 2016 02
  • 无法使用c#更改视频捕获分辨率

    我正在尝试使用 C 中的 DirectShowNet 更改默认网络摄像头分辨率 据我所知 我需要通过调用 windows win32 api dll 中内置的 VideoInfoHeader 类来更改它以进行 avi 捕获 我有来自 Dir
  • 用于带有嵌套子图的图的 r 包? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个用于图形 网络的 r 包 它可以处理嵌套子图 Graphviz 做到了这一点 但只提供可

随机推荐

  • MyBatis动态拼接SQL

    通过使用MyBatis提供的标签方法可以实现动态SQL拼接 1 if标签
  • oracle时间获取记录

    select trunc sysdate from dual 2017 9 11 select trunc sysdate 1 from dual 2017 9 12 select sysdate from dual 从系统获取时间2017
  • VsCode怎么打开settings.json文件?

    Mac command shift p 输入setting json 选择 首选项 打开设置 json 即可
  • 使用Git进行版本控制,并将代码托管到GitHub的完整流程

    Git是一个分布式版本控制系统 它可以记录文件的修改历史 并且可以管理多人协作开发的项目 Git的基本工作流程如下 在开发者的本地电脑上安装Git 并克隆一个GitHub上已存在的项目到本地 在本地进行代码的修改和提交 这些修改都会被存储在
  • Android studio编译中Connect to maven.google.com:443[xxx] failed: connect timed out的解决方法

    前言 最近徒弟分到了一个rn的模块开发工作 但rn 大家懂的 Android studio有时需要科学上网下载必要的rn库 又是一个徒弟哀嚎的日子 问题 连接maven google com超时 具体编译报错如下 gt Could not
  • R语言-- R语言数据类型(3)

    列表 创建 1 1 创建一个列表L1 记录三位同学的姓名 A B C 编号 1 2 3 数学成绩 80 90 95 语文成绩 75 95 80 L1 lt list 姓名 c A B C 编号 c 1 2 3 数学 c 80 90 95 语
  • VPP代码阅读中文注解---dlmalloc.h

    Quickstart This library is all in one file to simplify the most common usage ftp it compile it O3 and link it into anoth
  • 大数据课程L3——网站流量项目的系统搭建

    文章作者邮箱 yugongshiye sina cn 地址 广东惠州 本章节目的 了解网站流量项目的运行环境 了解网站流量项目的日志采集系统搭建 了解网站流量项目的离线业务系统搭建 了解网站流量项目的Hive做离线数据处理 了解网站流量项目
  • js解leetcode(44)-简单

    1 有多少小于当前数字的数字 题目 给你一个数组 nums 对于其中每个元素 nums i 请你统计数组中比它小的所有数字的数目 换而言之 对于每个 nums i 你必须计算出有效的 j 的数量 其中 j 满足 j i 且 nums j l
  • Linux 下bsub命令

    一 bsub bsub 提交给lsf作业的命令 命令格式 bsub options command argument bsub pack job submission file q 选择队列 i 指定输入文件 I 交互模式 此时终端不能输入
  • RabbitMQ和Kafka的区别

    RabbitMQ 和 Apache Kafka 是两种流行的消息传递系统 它们具有不同的设计目标和适用场景 以下是它们的主要区别 消息传递模型 RabbitMQ RabbitMQ 是一个传统的消息队列系统 采用了基于消息队列的发布 订阅模型
  • 关于压缩感知的基本原理

    转自https blog csdn net wanz2 article details 52770095 该博客中作者介绍了传统的压缩和压缩感知 并且介绍了匹配追踪算法OMP的基本原理 让我看明白点了OMP算法 但是有一个疑问 如果不知道信
  • Unity下载大文件断点续传

    最近要使用安卓更新下载apk更新功能 由于安卓机运行内存有限 下载大文件就得采用实时下载写入 实时释放内存的方法 考虑到网络环境不稳定时下载被迫中断的情况 重新从头下载会导致不必要的资源浪费 断点续传也很有必要 UnityWebReques
  • 计算机网络第七版--概述知识点总结

    计算机网络第七版 谢希仁 第一章 概述 1 1 计算机网络在信息时代的应用 21世纪的一些重要的特征就是数字化 网络化和信息化 它是一个以网络为核心的信息时代 互联网具有两个重要的特点 连通性 交换各种信息 和共享 资源共享 1 2 互联网
  • Java核心——集合(一)接口

    集合框架围绕一组标准接口而设计 我们可以直接使用这些接口的标准实现 例如 LinkedList HashSet TreeSet等 除此之外还可以通过这些接口实现自己的集合 集合框架是一个用来代表和操纵集合的统一架构 所有的集合框架都包含如下
  • Visual Studio 2019中创建的C++项目无法使用万能头<bits/stdc++.h>解决方案

    Visual Studio 2019创建C 项目无法使用万能头
  • 很有意思的一个自定义CGI,用BAT文件做的。大家发挥想象,自己发挥哈~

    httpd conf ScriptAlias bat d test AddType application x httpd bat bat Action application x httpd bat bat aaa bat aaa bat
  • 【C++笔记】C++11常用特性的使用经验总结

    转载 https www cnblogs com feng sc p 5710724 html title12
  • php getmimetype,wordpress关于日志的常用函数get_post_mime_type()

    说明 按ID编号检索附件的mime类型 该函数可用于任何文章类型 但更适用于附件类型 用法 参数 ID 整数 可选 文章ID 默认值 返回的值 布尔型 字符 返回mime类型 出错时则返回False 示例 mime type get pos
  • DirectShow--用GraphEdit辅助调试

    前面的话 GraphEdit 微软的SDK里面有个DirectShow的辅助工具GraphEdit 这里的文字简单介绍如何将应用程序生成的GraphBuilder插入到GraphEdit中直观的显示 可能一开始我们对这种应用有点儿不理解 既