用DirectShow抓取影片帧2011-04-12 vckbase youken很多视频播放软件或视频编辑软件都提供了抓帧的功能,利用这类软件,视频工作者可以 很轻松地将一个电影某一时刻的帧抓取出来并保存为图片文件,那么,我们如何自己编程实 现这样的功能呢?如果你熟悉MPEG或者AVI等常见视频格式,你可以直接对影片文件进行操作 ,如果你不知道这些视频格式,而希望使用更简单的方法来抓取影片的帧,微软的 DirectShow将会给你极大的惊喜。DirectShow属于DirectX家族(DirectX还包括 Direct3D、DirectInput、DirectDraw、DirectSound等组件),在使用DirectShow开发抓取 帧的程序前,你必须要安装DirectX SDK,这个开发包可以在微软的网站上下载得到,目前最 新版本是9.0b;另外,由于DirectX SDK是用COM的方式发布的,所以对于开发人员而言,他 还必须要了解COM的基本原理。如果大家没有使用过COM,可以先从网上找一些COM方面的入门 教程看看一、编程工具的设置:先说说我使用的VC 6.0的设置,一般而言, 安装完DirectX 9.0b SDK后,会自动设置好VC,用户无需手动干预,如果编译过程中出现错 误,请检查VC是否包含了DirectX SDK的头文件和库文件,方法是选择菜单“Tools- >Options…”,在弹出的Options对话框中选择Directories选项卡,看看 Include files和Library files中是否包含有DirectX SDK的Include路径和Lib路径,如果没 有,将这两个路径添加上去即可。二、主要的实现步骤:在实现抓取影片帧 的过程中,DirectShow的IMediaDet接口将是主角,这个接口包含了一些方法能够从媒体源文 件中提取一些重要信息,比如媒体类型、帧速率甚至是视频流的单个帧。·注 意要正确使用IMediaDet接口,工程中需要包含下列文件:头文件:dshow.h, qedit.h库文件:strmiids.lib因为使用CComPtr模板来声明接口实例,所以 还要在工程中包含atlbase.h头文件。下面我们将一步步利用IMediaDet接口实现抓取 影片帧的功能。第一步:新建一个基于对话框的应用程序,为应用程序添加两个编辑 控件和三个按钮控件,程序界面如图所示: