前言:很久没空更新博客了,甚至最近一两个月都没有太多实质的学习和进展,十分愧疚。这段时间,疯狂加班,但却越来越迷茫。现在做的方向和我最开始的设想相去甚远,而我还无力挣扎。在身心俱疲的时候,连逃避的选择都没有。
今天主要说一下做DirectShow开发中遇到的一个小问题。
关于Dshow Filter,做Dshow开发的都知道Filter在上下级连接的时候,会枚举两端pin的输入输出媒体类型,当符合的时候便可以完成连接。
其中枚举的媒体类型,使用CMediaType变量表示。
参阅官方文档:
https://msdn.microsoft.com/en-us/library/windows/desktop/dd374727(v=vs.85).aspx
这个类实际操作的数据结构是AM_MEDIA_TYPE,参阅文档如下:
https://msdn.microsoft.com/en-us/library/windows/desktop/dd373477(v=vs.85).aspx
在MediaType下,还挂载了formattype,这个更详细描述媒体类型的结构体。其在音视频方面,用各自的结构体进行描述。
这里主要讲一下在做视频传输的时候,会用到的两个结构体:
1.VideoInfoHeader
2.VideoInfoHeader2
如果不注意,很多人根本不会发现filter的pin上,有VIH和VIH2两种不同的formattype,甚至不知道,如果其对应的cbformat不正确,在浏览、读取pin的MediaType上会出现数据混乱的现象。
关于VideoInfoHeader和VideoInfoHeader2的具体区别,我这里就不讲了,主要是结构体描述的参数有些许出入,大部分参数还都是一致的(包括bitmapheader),这里给出官方文档两份:
https://msdn.microsoft.com/en-us/library/windows/desktop/dd407325(v=vs.85).aspx
https://msdn.microsoft.com/en-us/library/windows/desktop/dd407326(v=vs.85).aspx
一般来说,你无法知道上级或者下级filter,支持的媒体类型中,使用的formattype究竟是header还是header2。如果仅使用其中一个,很可能使你开发的filter不能完成上下级的协商握手。因此,一般开发,对同一个数据类型,可能需要枚举两个几乎一致的mediatype,一个是header,一个是header2,交由实际连接的filter来选择使用哪个。
在使用检查、获取、传输MediaType的函数(Filter的重载函数)时,通常你需要自己定义MediaType,或者改动上级传递给你的MediaType。
这个时候,你需要注意以下事情:
1.formattype是header还是header2
2.如果是自己定义的MediaType,需要自己开辟对应空间(header和header2的大小不同),将指针传递给pbformat
3.如果是VideoInfoHeader,MediaType的cvFormat应为88,而VideoInfoHeader2的cvFormat应为112;
如果开发的filter在GraphStudioNext中查看pin时,参数乱码,通常是步骤2导致的。
如果部分参数乱码,部分定义参数正常,通常是步骤3导致的。