我要做个程序,用DirectShow播放视频文件,然后再需要的时候,按下一个按钮,可以将当前播放的帧保存为位图。
我现在的方法是,用IGraphBuilder的RenderFile方法建立一个graph,然后在这个graph的“Video Renderer”之前,加入一个ISampleGrabber的filter,在它的回调函数里,获得那个buffer,再根据之前通过ISampleGrabber::GetConnectedMediaType的得到的VIDEOINFOHEADER得到位图的一些信息,这样就可以了。
可是问题是,这种方法只对那种最简单的avi文件有效,就是那种没有经过任何编码的,对其他经过编码的,比如说mpeg1或者divx,就不行了,请问该怎么办?
我现在发现了一个问题,就是ISampleGrabber::GetConnectedMediaType得到的AM_MEDIA_TYPE中的pbFormat不一定是VIDEOINFOHEADER,有可能是其他的,可是还是不知道该怎么解决。
还有,如果VIDEOINFOHEADER中的BITMAPINFOHEADER的biBitCount不是24,那么,这个位图的调色板应该怎么获得呢?