基于DirectShow的视频采集与压缩存储的实现

作者简介: 张明杰( 1977~ ) , 男, 陕西铜川人, 西安邮电学院信息管理系助教, 研究方向为计算机网络与数据库。
基于DirectShow的视频采集与压缩存储的实现
张明杰
(西安邮电学院 信息管理系, 陕西 西安 710061)
摘 要: 随着信息化技术的发展, 在视频监控系统中, 传统的VFW方法的应用已经满足不了实际要求。阐述了
DirectShow系统的结构以及DirectShow应用程序的建立过程, 并在此基础上介绍了如何利用DirectShow在视频监控系
统中实现视频采集与压缩存储。
关键词: Directshow;视频采集; COM;过滤器
中图分类号: TP391.41 文献标识码: A 文章编号: 1672- 7800( 2008) 08- 0054- 02
在视频监控系统中, 实现视频图像采集的传统处理方法是
采用VFW函数。这种传统的编程模式落后于目前占主导地位
的面向对象程序设计。 它已不能满足某些要求, 例如:要实现网
络可视IP电话就不能使用VFW, 因为它不能提供流数据。 因此,
必须寻求其它的手段, DirectShow就是一个很好的选择。
1 DirectShow概述
DirectShow的设计初衷就是尽量让应用程序开发人员从复杂
的数据传输、 硬件差异、 同步性等工作中解脱出来, 总体应用框
架和底层工作由DirectShow来完成。这样, 基于DirectShow框架
开发多媒体应用程序就会变得非常简单。DirectShow的使用解
决了网络音频及视频信息传输中数据量大、数据源种类多、 客
户端软硬件环境不确定、 视频音频需要同步的问题, 因此有着
广泛的应用。
图1 DirectShow系统
如图1所示, 图中央最大的一块即是DirectShow系统, 虚线
以下是Ring 0特权级别的硬件设备, 虚线以上是Ring 3特权级
别的应用层。DirectShow系统位于应用层。它使用一种叫Filter
Graph的模型来管理整个数据流的处理过程; 参与数据处理的
各个功能模块叫做Filter; 各个Filter在Filter Graph中按一定的
顺序连接成一条“ 流水线” 协同工作。
按功能的不同可将Filter分为3类: Source Filters、 Transform
Filters和Rendering Filters。Source Filters主要负责获取数据, 然
后将数据往下传输; Transform Filters主要负责数据的格式转
换, 例如数据流分离/合成、 解码/编码等, 然后将数据继续往下
传输; Rendering Filters负责数据的最终去向, 将数据送给显卡、
声卡进行多媒体的演示, 或者输出到文件进行存储。
DirectShow是基于COM(组件对象模型)规范的。过滤器是
一种COM组件。应用程序把多个过滤器组件组合起来, 形成对
媒体流的处理流程。这一整套过滤器集合被称为过滤器图
( Filter Graph)。DirectShow提供FGM( Fiher Graph Manager, 滤波
器图形管理器)组件来控制整个过滤器图。它负责执行协调滤
波器间的状态变化、 设置参考时钟、 向应用程序传递事件、 向应
用程序提供构建滤波器图形的方法。 它为应用程序提供高层的
API, 使得开发者不必关心底层的数据流是如何运作的。 如果开
发者想对底层数据进行操作, 可直接通过各个滤波器的接口进
行相应操作。
一个典型的DirectShow应用程序的建立包含3个步骤:
( 1)调用函数CoCreateInstance建立一个滤波器图形管理器
的对象;
( 2)利用滤波器图形管理器对象建立滤波器图形(调用各
个滤波器并将它们连接来) ;
( 3)控制各个滤波器的运作, 对产生的事件进行回应。
2 视频采集与压缩存储的实现
视频数据处理主要由二部分构成:视频图像的压缩与存储、
视频图像的采集播放。视频图像的实时播放可以和视频图像的
实时捕捉存储同时进行。它的设计分别是通过视频采集压缩卡
软 件 导 刊
Software Guide
第7卷 第8期
2008年 8 月
Vol.7 No.8
Aug. 2008第 8 期
附带的二次开发包以及DirectShowSDK实现的。DirectShowSDK
提供了一系列COM组件对象模型。COM是软件组件互相通讯的
方式, 允许任意两个组件互相通讯, 不管该组件是运行在什么平
台下, 也不管它使用什么语言编写。在这里我们利用DirectShow
开发包所提供的COM接口设计封装了一个CVideoBase类。
2.1 视频图像的采集预览实现
视频图像的采集预览实现流程如图2所示。
图2 视频采集预览实现流程
( 1)初始化环境: 由于DirectShow是使用COM技术实现的,
需要初始化COM调用, 代码为: CoInitialize(NULL)。
( 2)连接到获取设备: 完成初始化之后就可以连接硬件设
备, 首先枚举设备的情况, 然后将第一个设备绑定到视频获取
过滤器上。
( 3)创建过滤器图, 并向其中添加过滤器。
( 4)连接各个过滤器。
( 5)清理环境: 在退出时需要释放定义的指针。
主要数据结构及函数说明如下:
IMediaEventEx *m_pMediaEvent; //事件接口指针
IGraphBuilder *m_pGraphBuilder; //过滤器图形管理器
指针
IMediaControl *m_pMediaControl; //视频窗口控制指针
IVideoWindow *m_pVideoWindow; //视频窗口接口指针
IBaseFilter *m_pCapture; //源过滤器指针
IBaseFilter *m_pVideoRender; //渲染过滤器指针
int m_nVideoSource; //捕获设备来源索引
IMoniker *m_pCapMonikers[10]; //捕获设备名称
int m_nNumOfCapDev; //捕获设备数量
void CleanUp( ) ; //清理环境
void Capture( int capInd) ; //采集
HRESULT ConnectFilters( IGraphBuilder*pGraph, IBaseFilter
*pSrc, IBaseFilter*pDest) ; //连接过滤器
HRESULTConnectFilters(IGraphBuilder*pGraph, IPin *pOut,
IBaseFilter*pDest) ; //连接过滤器
HRESULT
GetUnconnectedPin ( IBaseFilter*pFilter , PIN_DIRECTION
PinDir, IPin**ppPin) ; //得到没有连接的针脚
HRESULT CreateFilterGraph( ) ; //创建过滤器图
HRESULT FindCaptureDevice ( IBaseFilter **ppSrc) ; //连接
捕获设备
HRESULT ShowFilterPropertyPage ( IBaseFilter *pFilter ,
HWND hwndParent) ; //显示过滤器的属性页
void ShowOnRect( ) ; //在对话框中的矩形框中显示视频
static IBaseFilter* EnumDevice( GUID deviceGid, wchar_t*
pSearchName) ; //枚举设备
2.2 视频图像的压缩存储实现
随着CPU主频的快速提升, 计算机整体性能不断提高, 对
于数字视频监控等应用, 纯软件编解码器即可满足视频压缩的
应用要求。本系统采用了DivXNetworks公司的DivX5.02编解码
器来实现视频图像的压缩解压缩编码处理, 这样既满足了性能
要求又降低了成本。这种编解码器的最大特点是支持AVI格
式。DivX在视频方面采用了先进MPEG- 4压缩标准, 其压缩率
和质量都很高。
文件的存储采用指定时间长度与指定文件大小两种存储
方式, 以便于以后视频文件的查询回放。文件的命名采用以保
存文件的时间为文件名主要部分的方法, 例如: 文件名
20050328123523。
主要数据结构与函数说明:
IBaseFilter *m_pFileWrite; //File Write滤波器指针
IFileSinkFilter *pSink; //写文件滤波器指针
IBaseFilter *m_pAviMux; //Avi Mux滤波器指针
IBaseFilter *m_pCapture; //视频捕获设备滤波器指针
IBaseFilter *m_pMPEG4Codec; //MPEG- 4编码器滤波
器指针
void SaveFile( ) ; //保存视频文件
void SetTimeLength( ) ; //设置时间长度
void SetFileSize( ) ; //设置文件大小
3 结束语
在视频监控系统中, 传统的VFW方法存在通用性差、 可扩
张性不强等缺点。 本文利用DirectShow开发多媒体应用程序。 实
践证明, 这种方法使视频采集与压缩的质量与方便性得到了很
大的提高。 DirectShow是一种基于COM技术的多媒体编程接口。
它给出了一种全新的多媒体数据处理模型, 并封装了采集、 压
缩和解压缩等一系列算法, 使视频监控、 视频会议等多媒体应
用系统的开发变得简单而富有成效。
参考文献:
[ 1] 陆其明.Directshow开发指南[M] .北京: 清华大学出版社, 2003.
[ 2] Microsoft.Microsoft DirectX Media SDK Document.Redmond wash-
ington:Microsoft press, 2000.
[ 3] 盛健, 李晓勇.Directshow过滤器组件开发技术及其应用实例[M] .
微型机与应用, 2004( 1) .
(责任编辑: 袁 月)
张明杰: 基于 DirectShow的视频采集与压缩存储的实现 55 · ·

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值