2008-01-09

DirectX capture image

在实现抓取影片帧的过程中,DirectShow的IMediaDet接口将是主角,这个接口包含了一些方法能够从媒体源文件中提取一些重要信息,比如媒体类型、帧速率甚至是视频流的单个帧。
·注意要正确使用IMediaDet接口,工程中需要包含下列文件:
头文件:dshow.h, qedit.h
库文件:strmiids.lib
因为使用CComPtr模板来声明接口实例,所以还要在工程中包含atlbase.h头文件。
下面我们将一步步利用IMediaDet接口实现抓取影片帧的功能。

1:为对话框类添加一个HRESULT类型的成员函数GrabFramFromMovie,它将实现抓帧功能。在函数体内创建IMediaDet接口实例,创建实例需要调用CoCreateInstance函数,并给函数的第一个参数传入CLSID_MediaDet类标识符。

2:调用IMediaDet::put_Filename方法为接口指定一个媒体文件,该方法只有一个参数,这个参数描述了媒体文件的路径,注意参数类型为BSTR。

3:调用IMediaDet:: get_OutputStreams方法以得到影片输出流的数目,一个影片的输出由多个流组成,但是get_OutputStreams方法只关心影片输出的视频流和音频流而自动忽略其它流,所以,如果一个影片输出包含有视频流、音频流和数据流,get_OutputStreams只返回视频流和音频流的数目。

4:调用IMediaDet::put_CurrentStream方法指定一个用于编辑和操作的流,因为我们的目的是要将影片的单个帧保存为图片,这就需要对视频流进行操作,所以要利用put_CurrentStream定位影片文件输出的视频流。

5:调用IMediaDet:: get_StreamMediaType方法得到一个VIDEOINFORHEADER结构,这个结构与当前指定的视频流关联。 VIDEOINFORHEADER结构中包含有一个BITMAPINFORHEADER结构类型的成员,它描述了视频影像对应位图的尺寸、颜色等有用的信息。

6:调用IMediaDet::WriteBitmapBits方法将影片的帧保存为位图,若想指定保存哪一帧,只需要给第一个参数传递一个合适的时间即可。这里,我传递给第一个参数的时间为0,因此程序将保存影片第一帧的位图。

[ref: http://www.vckbase.com/document/viewdoc/?id=976]

No comments:

Post a Comment