2024年8月21日发(作者:)
第28卷第1期
2011年1月
计算机应用与软件
Computer Applications and Software
Vo1.28 No.1
Jan.201l
基于DirectShow视频帧实时捕捉的设计与实现
朱尹华 周尚波 王兴星 谢 磊 周 庆
(重庆大学计算机学院重庆400030)
摘要 主要针对远程教育等软件系统中现存的“黑屏”问题提出一种解决方案。运用DirectShow技术对多媒体文件或多媒体流
中的视频流进行处理,实现从多媒体文件视频流中进行视频帧的实时捕获,而后调用Windows中GDI函数对获取的图像帧进行渲
染,最后按照MPEG2标准合成AVI视频文件并可以实时重放。
关键词DirectShow技术AVI MPEG2 多媒体流
DESIGNING AND IMPLEMENTING REAL.TIME VIDEo FRAME
CAPTURING BASED oN DIRECTSHoW
Zhu Yinhua Zhou Shangbo Wang Xingxing Xie Lei Zhou Qing
(College ofComputer Science,Chongqing University,Chongqing400030,China)
Abstract In this paper,we present a solution to resolve the“black screen’’problem occurred in software system such as distance
education,etc.Firstly,we implement the video—frames real—time capturing from video stream of multimedia files by using DirectShow technology
to deal with multimedia files or video stream in multimedia stream.Then,the GDI function of Windows is invoked to render the image frames,
which are captured by the DirectShow.Finally,according to the standard of MPEG2 a file is composed in AVI video format which is able to
replay real—timely.
Keywords DirectShow technology AVI MPEG2 Multimedia stream
对象模型(COM)基础上的,由许多模块化的组件所组成,简化
0 引 言
了在Windows平台上数字媒体应用程序的开发任务。
1.1 DriectShow系统结构
随着科学技术的发展、人们对信息资源的渴望,以及网络与
DirectShow作为高效的多媒体开发系统,兼备与底层的硬
继续教育的紧密结合,远程教育逐渐被人们所熟知-. ,远程教
件设备与高层的应用程序打交道的能力。如图1为DirectShow
育就是将集数字、文字、声音、图形、图像和动画等各种媒体的有
系统框架图,其中中央最大的一块即是DirectShow系统,虚线以
机组合的多媒体信息,通过Internet网络传输达到资源的共享。
下是RingO特权级别的硬件设备,虚线以上的是Ring3特权级
在远程多媒体教育通信中,人们对信息的提供和传输质量提出
别的应用层。前者包括WDM视频采集卡、VFw视频采集卡、
了更高的要求,但在网络多媒体的实时性以及可视化性等方面
MPEG2硬解码卡、声卡、显卡等;后者提供了统一规范的COM
还存在很多的问题。例如,利用现有的抓屏软件抓取流媒体文
接口。通过这种方式系统将底层硬件设备和高层应用程序隔
件视频流得到的视频帧是黑色的 ,即黑屏问题;如何设计抓
开,从而可以很方便的编程实现从设备获取多媒体的数据或利
屏的最佳速率;实时再现等问题。
用设备回放多媒体数据,而不需要考虑硬件的特性 。
MPEG标准的视频压缩编码技术主要利用了具有运动补偿
&月&
的帧间压缩编码技术以减时间冗余度 J,利用DCT技术以减小
々T
图像的空间冗余度,利用熵编码则在信息表示方面减小了统计
冗余度。通过这几种技术的综合运用,大大增强了压缩性能。
本文主要讨论的是以DirectShow技术为基础,通过对多媒
体文件或多媒体文件中的视频流进行处理 ,以实现从多媒体
文件视频流中进行视频帧图像的捕获,从而解决黑屏问题。对
抓取出来的视频帧进行信息压缩处理,处理方式主要采用
MPEG标准
图1 DirecShow系统结构图
DirectShow技术简述
收稿日期:2009—09—30。国家自然科学基金(61004112)。朱尹
DriectShow是一套高效的多媒体开发系统,是建立在组件 华,本科,主研领域:计算机图形图像处理,网格技术。
36
1.2过滤器
计算机应用与软件 2011生
视频播放要求:每秒钟24帧(因为DirectShow抓取图像速
率较快,具体的视频速率可根据实际的情况而进行调整)。
DirectShow的基本组成单元是一种称为Fiher的COM组
件。DirectShow系统位于应用层,它使用一种叫Filter Graph的
模型来管理整个数据流的处理过程;参与数据处理的各个功能
模块就叫做Filter;各个Filter在Filter Graph中按一定的顺序连
接成一条“流水线”协同工作。为了实现在Filter Graph中的统
一
2.2系统设计流程
(1)黑屏问题的解决,利用DirectShow提取视频帧,将所获
的帧进行格式转换;
(2)根据MPEG2一TS的具体标准,对bmp图片组进采用运
动估计和补偿或者帧内编码(I-block)方式进行mpeg2编码;
(3)设置适当的缓冲区大小,修改相应的PES包和Ts包,
进而合成最终的mpeg2一ts流,并将其显示在电视屏幕上。
操作,每个Filter上都至少实现了IBaseFiher接口。
按照功能来分,Filter大致分为以下三类:
(1)Source Filters 主要负责获取数据,数据源可以是文
件、因特网计算机里的采集卡(WDM驱动的或者VFw驱动的)
2.3基于DirectShow技术的实现
数字摄像机等,然后将数据往下传输;
(2)Transform Filters主要负责数据的格式转换,它既有
输入口又有输出口。在系统中有以下两类:一类是音频视频的
编码器和解码器;另一类是在中间的辅助过滤器,用于实现一些
特殊的功能,然后将数据继续往下传输;
(3)Rendering Fihers主要负责数据的最终去向:将数据
送给显卡、声卡进行多媒体的演示,或者输出到文件进行存储。
1.3 Filter的数据传送
一
个Fi],ter具有零或者几个输入/输出Pin,每个Filter是通
过Pin相连接的。对于一个已经连接好的Filter链,其目的主要
是实现数据的传送,而Filter之间是以Sample的形式来传送数
据的。Sample是一个封装了一定大小数据内存的COM组件。
那么数据到底怎么从上一级Filter传送到下一级Filter的呢?
每个Pin上都实现了IPin接口。但这个接口主要是用于
Pin连接的,而不是用于数据传送的。真正用于数据传送的一
般是输入Pin上实现的IMemlnputPin接口(调用其接口方法)
IMemlnputPin::Receive。
Filter之间的数据传送有两种模式:拉模式和推模式。
1.4 Mpeg-2标准
本系统采用现在比较成熟的Mpeg-2标准进行压缩编码,
Mpeg一2是由MPEG开发的第二个标准,是“活动图像及有关声
音信息的通用编码”标准。它是针对标准视频清晰度电视的数
字压缩标准,其码流由外层系统层和内层压缩层两层组成 。
2计算机屏幕信息
2.1黑屏问题及其处理
黑屏是指电脑、电视或者其他电子显示设备的显示屏幕呈
现出漆黑或者画面暗淡模糊不清,在人的感光系统中呈现出漆
黑的场景,画面的质量难以得到接受。
针对现有播放器或者截屏软件抓取动态屏幕画面或者实时
视频流的质量过差,甚至漆黑,加上远程传输数据出错等原因,
使得客户端看到的图像画面模糊不清,呈现出黑屏的场景,这就
是远程教育中遇到的黑屏问题。
针对以上现象,经过科学分析和实践得知,出现该黑屏问题
的主要原因是资源竞争的问题。众所周知现在比较成熟的视频
渲染的方法有两种:一种是Windows自带的GDI的渲染函数;
而另一种是DirectX的API渲染函数。当播放器仅通过DirectX
的API渲染函数对所抓取的视频图片进行渲染后得到的一般是
黑屏,而通过GDI的就会成功抓取,所以解决的办法是,让一个
播放器先获得DirectX的资源,然后再用另一个播放器去抓取视
屏,那样就可以成功抓屏了。
2.3.1 用DirectX相关的API函数绘图抓取屏幕信息
1)构建的Filter Graph,如图2所示。
叠 |i 蕾薯罐l簧黼媾 臻褊 警 i弦l薯罄
薯l|麟瓣酶 峨黼镄戳 蠹 冁褥麓蝴懒精 晦祷鹾薅
00 0毒 曩未
图2 FilterGraph结构图
实现Filter Graph的流程,如图3所示。
图3 Filter Graph的实现流程图
2)实现源代码
::
CoCreateInstance(CLSID—FiherGraph,NULL,CLSCTX—INPROC—
SERVER,IID
—
IGraphBuilder,(void%{)&pGraph);
//6,1建Filter Graph对象
HRESULT hr=0;l //句柄对象
hr=Graph.AddVideoFiher(pGraph,&s—Video,friendlyname);//根据
设备友好名字将屏幕抓取Filter加人Filter Graph
if(SUCCEEDED(hr)){
//根据设备CLSID将渲染Filter加入Fiher Graph中hr=Graph.Ad—
dFilterByCLSID(pGraph,CLSID—VideoRenderer,L”VideoRenderer",&S—
Render);
If(SUCCEEDED(hr)){
//根据设备CLSID将渲染Filter加入Filter Graph中hr=Graph.
AddFiherByCLSID(pGraph,CLSID—SmartTee,L”SmartTeer",&S—SmartTee);
if(SUCCEEDED(hr)){hr=Graph.ConneetFihers(pGraph,S_Vide-
O,S Render) ,/连接Filter
if(SUCCEEDED(hr)){
IVideoWindow¥mmVideoWindow=NULL:
pGraph一>Querylnterfaee(1id—IVideoWindow,(void )
&mmVideoWindow); //获得渲染窗口接口
//注册Filter Graph到系统之中
hr=AddGraphToRot(pGraph,&g—dwGraphRegister);
if(FAILED(hr))j.・・ }
GetDlghem(IDC—COMBO1)一>ShowWindow(SW—HIDE);
第1期 朱尹华等:基于DirectShow视频帧实时捕捉的设计与实现 37
} } } }
3)Filter之间的数据,它主要是通过Sample数据结构进行
传输的,但是,我们可以通过一些接口函数获得这些数据,并转
化为我们需要的数据格式,这里,通过一些接口函数获得Sample
数据,并获得其数据的内存缓冲地址,对内存缓冲进行处理,转
变为BMP图片流,对BMP图片流,我们可以保存为BMP图片,
或者将这些数据流写入AVI文件进行保存。
2.3.2用API绘图函数进行抓屏
利用Windows默认的GDI的相关的API绘图函数抓取屏
幕信息,抓屏的具体流程如图4所示。
图4抓取流程框图
2.4基于C语言的实现
2.4.1位图数据结构
typedef struct ta只BITMAPc0REHEADER{
DWORD bcSize; //指定文件类型,其值始终为“BM”
WORD bcWidth: //指定整个文件大小
WORD bcHeight;
WORD bcPlanes;
WORD bcBitCount:
}BITMAPC0REHEADER,FAR LPBITMAPCOREHEADER,
PBITMAPCOREHEADER; ’
typedef struct tagBITMAPINFOHEADER
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
//指定目标设备位面数,必须为1
WORD biBitCount
DWORD biCompression;
//指定压缩位图的压缩类型,在24位格式中,必须为0
DWORD biSizelmage;
LONG biXPelsPerMeter; //指定目标设备水平分辨率
LONG biYPelsPerMeter; //指定目标设备垂直分辨率
DWORD biClrUsed;
DWORD biClrhnportant;
}BITMAPINFOHEADER,FAR LPBITMAPINFOHEADER,¥PBITMAP—
INFOHEADER:
2.4.2 AVI文件格式
AVI文件的结构为:一个RIFF头+两个列表十一个可选的
索引块。
AVI文件的展开结构大致如下:
RIFF(‘AVI’//表征为AVI文件类型
LIST(‘hdrl’,‘avih’(主AVI信息头数据)
LIST(‘strl’,‘strh’,‘strf’,‘strd’(可选),‘strn’(可选)))
LIST(‘movi’
{SubChunk I LIST(‘rec’,SubChunkl,SubChunk2,...)
...
)
‘idxl’(可选的AVI索引块数据)j
)
‘hdrl’列表嵌套的‘avih’块和一个或者多个‘strI’子列表。
‘
avih’块用一个AVIMAINHEADER数据结构来操作:
typedef struct
avimainheader{
FOURCC c: //必须为‘avih’
DWORD cb;
//本数据结构的大小,不包括最初的8个字节(f(:c和cb两个域)
DWORD dwMicroSecPerFrame;//视频帧间隔时间(以毫秒为单位)
DWORD dwMaxBytesPerSec: //这个AVI文件的最大数据率
DWORD dwPaddingGranularity; //数据填充的粒度
DWORD【lW Flags;//AVI文件的全局标记,比如是否含有索引块等
DWORD dwTota1FrameS: //总帧数
DWORD dwInitialFrames:
//为交互格式指定初始帧数(非交互格式应该指定为0)
DW0RD dwStreams:
//本文件包含的流的个数
DWORD dwSuggestedBufferSize
//读取本文件的缓存大小
DW0RD dwWidth:
//视频图像的宽(以像素为单位)
DW0RD dwHeight:
//视频图像的高(以像素为单位)
DWORD dwReserved I4;
//保留
}AVIMAINHEADER;
每个‘strl’子列表至少包含一个‘strh’块和一个‘strf’块,
而‘strd’块和‘stria’块是可选的。首先是‘strh’块,用于说明这
个流的头信息,可以使用一个AVISTREAMHEADER数据结构
来操作:
typedef struct
avistreamheader{
FOURCC fcc: //必须为‘strh’
DWORD cb; //本数据结构的大小,(fcc和cb两个域)
FOURCC ̄cType: //流的类型
FOURCC fccHandler;
//指定流的处理者,对于音视频来说就是解码器
DWORD dwFlags;//标记:是否允许这个流输出?调色板是否变化?
WORD wPrioritv; //流的优先级
WORD wLanguage;
DWORD dwlnitialFrames; //为交互格式指定初始帧数
DWORD dwScale; //这个流使用的时间尺度
DWORD dwRate;
DWORD dwStart; //流的开始时间
DWORD dwLength;
DWORD dwSuggestedBufferSize;
DWORD dwQuality: //流数据的质量指标(O~10,000)
DWORD dwSampleSize; //Sample的大小
struct{
shoa int left;
short int top;
short int right;
short int bottom;
}rcFrame;
//指定这个流(视频流或文字流)在视频主窗口中的显示位置
//视频主窗口由AVIMAINHEADER结构中的dwWidth和dwHeight决定
}AVISTREAMHEADER;
注意:如果一个AVI文件包含有索引块,则应在主AVI信
38 计算机应用与软件 2011丘
息头的描述中,也就是AVIMAINHEADER结构的dwF|ags中包
含一个AVIF—HASINDEX标记。
2.4.3保存为BMP图片的源程序代码
BOOL GetCurrentlmage(const char inFile){
if(SUCCEEDED(mBasicVideo一>GetCurrentImage(&bitmapSize.
0))){
if(SUCCEEDED(mBasicVideo一>GetCurrentImage(&bitmapSize.
(1ong )buffer))){
int nColors=1<<lpbi一>biBitCount:
if(nColors>256)nColors=0;
hdr.bFFype=((WORD)( M <<8)I B );
hdr.bfSize=bitmapSize+sizeof(hdr);
hdr.bfOffBits=(DWORD)(sizeof(BITMAPFILEHEADER)+lpbi一
>biSize+nColors sizeof(RGBQUAD));
CFilebmpFile(inFile,CFile::modeReadWrite I CFile::modeCreate l
CFile::typeBinary);
bmpFile.Write(&hdr,sizeof(BITMAPFILEHEADER));
bmpFile.Write(buffer,bitmapSize);
…
}… }
return TRUE;}
2.4.4保存为AVI文件的源程序代码
int RecordVideo(int top,int left,int width,int height,int fps,const char
{szFileName){
…
}
通过设定RecordVideo函数实现Avi文件的转换,详细代
码略。
2.5实验分析
2.5.1测试环境
实验测试环境配置见表1。
表1 实验测试环境配置表
环境类型 配置
CPU:AMD Athlon 64 X2 Dual Core Processor
硬件环境 3600
+、主频:2.O1GHz、内存:1.OG
软件环境 Windows XP Professional SP3、暴风影音、
Windows Media Player 9.0、DirectX 9.Ob
2.5.2测试效果
(1)一般抓屏软件对有播放器播放视频的画面进行抓取
后,得到的视频中,原播放器播放的视频部分是漆黑的一片,效
果如图5所示。
(2)通过调节资源竞争的问题,运用DirectShow进行视频
,
帧的抓取如图6所示。点击图中“试抓屏”按钮即可进行抓取,
此时看到的效果是一个抓取图片(如果直接抓屏,在暴风播放
器中只能出现黑屏)。
(3)针对远程教育实时视频流的采集,首先在菜单栏的
“选择录制区域”选项下选择“全屏录制”选项,然后点击“开
始”即可以录制,图7展示的是实时视频流截获的屏幕图像(远
程教育考研辅导——线代)。
在本文测试环境下,做了七次实验,实验相关数据如表2所
示。由实验统计得知,每抓一帧的时间平均约为0.032063s,实
时播放时,从视觉上几乎感觉不到延时。
图5一般抓屏软件抓屏效果图
图6 DirectShow抓取的图片帧
。 圆b 。链螽
0
图7 DirectShow抓取的实时视频流
表2实验测试视频帧抓取时间表
实验序号 抓取帧数(张) H ̄I司(秒) 平均抓取时间(秒)
1 1296 41.5O 0.032021
2 344 l1.Ol 0.032058
3 l563 5O.O2 0.032002
4 93 3.O0 0.032258
5 454 14.55 O.032O48
6 734 23.51 0.032030
7 1032 33.05 0.032025
3结束语
计算机视频是远程教育中最基本也是最重要的环节,通过
DirectShow的高效性以及Windows GDI相关函数,可以轻松地抓
取一个播放流畅、图像稳定的视频数据源,为远程教育等相关视
频处理软件的视频直播奠定了良好的基础,相信其将在远程教
育等相关视频处理软件方面得到更广泛的运用。
参考文献
[1]黄燕.教师继续教育网络学习体系建设的思考与实践[J].远程教
育杂志,2008(1):1.
[2]申瑞民,王加俊,郑珂.同异步结合的远程教育模型及实现[J].计
算机应用与软件,2001(9):1—2.
[3]徐洋.基于TCP的支持多格式实时编码的流媒体直播系统设计与
实现[J].计算机应用与软件,2009,26(6):228—230.
(下转第4o页)
计算机应用与软件
1.3代理权的验证
代理签名者B收到所有(FA,,S m )(i=1,2,…,n)后,计
2011生
求解初始密钥 。,属于大因数分解难题,非常困难。如果试图
从 = , (modn)求解第 周期密钥 ,,即使已知 , ,同样要
面临大因数分解难题。如果已知( ,m,m ,Y。,Y ,Y , ,Y,D,
『』),企图通过[(
算R:n (modn),验证等式g = Y ’m。dn)是
Y口 ) (ycm ) ] :D(modn)求解
否成立。若对所有的(r^.,s¨m )均成立,则接受A (i=1,2,
…
,
n)的授权,反之拒绝。B计算:
s =
∑ modn),O"o=xB+s mod ),Y=( “
Y。 ) (modn),O"0为初始代理签名密钥,公开y作为验证公钥。
1.4代理签名密钥更新及签名产生
系统进入 周期时(1≤ ≤T),B根据第 一1周期的密钥
计算第 周期密钥 : ... (modn),并删除 ,一,。设等待
签名消息为m,B选择随机数Otj [1,n],计算:
,J=(Yv ) (modn)占=h(j,Y ,D,m,m )
“= (modn)s=Otj一3fB6(modq)
则前向安全的代理多重签名为U,y ,D,S, ,6,m,m ,t)发送给
1.5前向安全的代理多签名验证
被提名验证者 收到( ,Y ,D,s,/2,6,m,m ,t)后,先验证t
是否在代理期限内,若超出,则签名无效。反之验证[(g u
y )。 (yc" ̄8) ]~=D(roodn)是否成立。若成立,则签
名有效并接受,反之拒绝。
2安全性分析
(1)提名验证性
[(g “ Y ) “。 (Yc ) ]xv
=
[(gv一 , yB ) 一 (f,o YG )一 (yGID ) ]
=
[( 0撕) “㈠(f,0。 “) ]
=
[( ) “ :(), ) “ :D(modn)
则( ,Y ,D,S,“,6,m,m , )是一个有效的基于前向安全的提名
代理多重签名。
由于验证过程中,要用到提名验证者 的私钥 ,而求解
面临离散对数难题,十分困难。所以此签名满足提名验证性。
(2)前向安全性
当n为合数时,企图通过方程 = (modn)求解 ,
涉及到强RSA假定问题和模合数平方剩余难题,非常困难。所
以,即使攻击者已经获得了第 周期的代理签名密钥 ,,他也无
法求出 周期之前的代理签名密钥,也就无法伪造相应的代理
签名。所以方案满足前向安全性。
(3)可区分性
代理签名中包含m ,且m 中有代理签名者B的身份信息,
验证签名时还要用到原始签名者和代理签名者以及被提名者的
公钥,因此,可区分一般签名和代理签名。
(4)不可否认性
原始签名者 (i=1,2,…,I'L)对授权信息m 进行了签名,
同时代理签名者 的信息中也包含m 在签名验证过程中要
用到m 和Y。,Y ,Y 以及B的身份标示,D 。所以一旦签名完
成,4就不能否认其授权身份,日不能否认其代理人身份, 也不
能否认其被提名人身份。
、
(5)不可伪造性
假定攻击者试图从公布的Y=( 。。 yelo ) (modn)中
,
相当于求解离散对数问题;如果已知( ,m,m ,Y ,Y ,Y , ,
y,D, ),通过上式求解u,面临大因数分解难题;如果已知( ,m,
m ,YG,Y ,Y , ,Y,s,M),通过上式求解D,相当于求解离散对
数问题和单向散列函数求逆问题。因此,本方案能抵抗包括原
始签名者在内的伪造攻击。
3 结语
如何减少由于代理签名者的签名私钥或密钥泄露带来的对
系统安全的影响,一直是人们十分关注的研究课题。但是目前
提出的代理多重签名方案大多数不具有前向安全性。本文在文
献[8]的基础上,进行了相应的改进,并结合提名思想和代理多
重签名理论,提出了一类新的前向安全的提名代理多重签名方
案。新方案在强RSA假定和模合数平方剩余等难题假设下是
安全有效的。
参考文献
[1]Mambo M,Usuda K,Okamoto E.Proxy signatures for delegating signing
operation[C]//Proc.3rd ACM Conference on Computer and Communi-
cations Security(CCS’96).[S.1.]:ACM Press,1996:48—57.
[2]Mambo M,Usuda K,Okamoto E.Proxy signature:delegation of the
power to sign messages[J].IEICE Trans.Fundamentals,1996,E79-A
(9):1338—1353.
[3]Hwang S J,Chen C H.A new multi-proxy multi—signature scheme
[C]//2001 National Computer Symposium:Information Security,Tai—
wan,2001:19—26.
[4]Park H U,Lee I Y.A digital nominative proxy signature scheme for mo・
bile communication[C]//Proc.of ICICS 2001,Berlin:Spring—Verlag,
2001,LNCS 2229:451—455.
[5]Sen S H,Lee S H.New nominative proxy signature scheme for mobile
[C]//Proc of SPY2003,Security and Protection of In—
formation,Bmo,CZ,2003:149—154.
[6]Anderson R.Two remarks on public key cryptology[c]//Proc of the
4th ACM Conference on Computer and Communications Security.New
York:ACM Press,1997:151—160.
[7]王晓明,陈火炎,符方伟,等.前向安全的代理签名方案[J].通信
学报,2005,26(11):38—42.
[8]王亮,贾小珠.基于离散对数的前向安全代理签名方案[J].青岛
大学学报:自然科学版,2007,20(2):46—49.
(上接第38页)
[4]尹丹,耿国华.视频压缩及其在远程教学系统中的应用[J].计算
机应用与软件,2009,26(1):161—163.
[5]吕宏伟,毛文燕,陆惠西.流式媒体集成课件的研究与实现[J].计
算机应用与软件,2006,23(2):97—144.
[6]郭吴.基于DirectSh0w技术实现视频采集[J].火控雷达技术,
2008.37(2):97—100.
[7]陆其明.DirectShow开发指南[M].北京:清华大学出版社,2003.
[8]都业娇.基于MPEG-2标准的视频压缩编码系统的实现与应用
[D].北京交通大学,2008.


发布评论