DirectShow下的MediaType与VideoInfoHeader问题

前言:很久没空更新博客了,甚至最近一两个月都没有太多实质的学习和进展,十分愧疚。这段时间,疯狂加班,但却越来越迷茫。现在做的方向和我最开始的设想相去甚远,而我还无力挣扎。在身心俱疲的时候,连逃避的选择都没有。


今天主要说一下做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导致的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值