DirectShow使用ISampleGrabber无法捕获.mp4视频格式的截图
最近在搞directShow,发现如何ISampleGrabber设置视频格式
formattype = FORMAT_VideoInfo;
majortype = MEDIATYPE_Video;
subtype = MEDIASUBTYPE_RGB24;//如何注掉这个,可以连接
之后,Connect(源文件,SampleGrabber)失败,如何注掉红色部分,则可以连接,但是获取的数据不知道如何转换成位图,望高手指点!
[解决办法]
如果DECODER不支持解码为RGB数据的话,那么将其他颜色空间的数据转换为RGB就可以了。
一般DECODER解码MP4,出来的是YV12数据,你试试填YV12的MEDIASUBTYPE,连上的话,自己做一下颜色空间转换就可以了。
[解决办法]
首先告诉你为什么红色的注掉能连接成功,上一个的filter输出pin进行协商时,没有设置子类型,那么协商没有问题,所以就连接成功了,加上子类型,连接不成功,说明filter的输出pin不支持rgb24.一般默认的是yuv格式的。
你用的解码filter是哪个,看看解码filter输出支持几种格式,你把红线部分的改成支持的格式就可以了
如果是yuv的,你可以再后面再连接个avi decompressor filter。它一般是把yuv的转成rgb的。设置好media type就可以了
[解决办法]
一般视频编解码器输入输出的都是YUV420P格式的,也叫I420,和YV12相同,只是U,V平面是反的,楼主的Grabber强制为RGB24,导致解码器和Grabber不能连接成功,按理DirectShow会自动插入Color Space Convert做转换的,但貌似失败了。
一般比较灵活的应用,比如视频会议等,都不建议用DirectShow做,我最早也用DS,限制很多,很多高级功能无法实现。网络音视频的话,还是用原生编解码库+Direct3D显示比较好,DirectShow只做视频采集,音频方面,DirectSound,WinMM,CoreAudio都是可选项,更不能用DirectShow。
如果只能在DirectShow下处理的话,做法应该是,Grabber允许连接击中常用类型,YUY2(YUYV),UYVY,YV12,RGB24,RGB32等,连接成功后(Pin的SetMediaType中)记录下连接的类型,需要RGB24的时候,把视频数据转换到RGB24即可,需要注意的是,如果是截图存文件,需要在YUV转RGB时上下翻转一下,windows的RGB数据是上下反向存放的。
需要的话,我把相关代码发给你,QQ,182383215
[解决办法]
我看到你的Graph图,似乎用了FFDSHOW的VIDEO DECODER,你把你的SampleGrabber连到FFDSHOW的VIDEO DECODER后面试试。
[解决办法]
GraphEdit很好用。你右键filter看看该filter支持哪种类型,然后找相应的filter
一般有ffdshow filter都能连接上的
[解决办法]
也就是格式问题,大多数解码处理都是yuv格式.你限定为rgb24,连不上是正常的