Visual Basic环境下Video/ Audio压缩数据流播放技术[1]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 zdg 的 blog

张汉华 计科峰
国防科技大学
--------------------------------------------------------------------------------
---- 1. 引言

---- 银行的数字化监视监控系统是目前比较有市场及应用前景的开发项目,基于不同的mpeg采集卡与硬件外围设备开发的监视监控系统在国内外都有比较成型的技术。为了满足实时监视、实时采集压缩、随时回放、压缩数据流的传播等具体要求,在该系统中使用了一种用于网络视频/音频多点传输(视频广播)的视频数据采集卡,提供avi(mpeg i frame压缩编码)采集、mpg采集。发送端广播mpeg流,接受端接受mpeg流并显示,网络传输采用winsock 2 ip-multicast。如果本机为发送端,网络上另外任何一台pc可以作为接收端。只要指定不同端口号,同时可以有多台pc机作为发送端,多台pc机作为接收端接收不同发送端的视频数据,也可在传送数据的同时在本机将数据存为mpeg文件。本文主要介绍在vb的环境下开发mpeg卡采集的audio/video数据播放的一些编程技巧。

---- 2. mpeg的内容与发展简介

---- 多媒体信息主要包括图像、声音和文本三大类。其中视频、音频等信号的信息量是非常大的,而且这些信息的表达方式、输入、输出的要求也各不同。对这些数据进行有效的表达和适当处理是很重要的,它使多媒体信息压缩技术成为多媒体通信领域中的关键技术之一。iso与iec于1988年联合成立的mpeg(moving picture expert group),致力于运动图像及其伴音编码的全球标准化工作。它包括mpeg系统:mpeg视频、mpeg音频。为了推动社会由文本信息时代向多媒体信息时代过渡,iso继mpeg-1、2和4后又推出了mpeg-7。

---- mpeg-1制定于1993年(iso/iec 11172),是针对1.5mbit/s以下数据传输率的数字存储媒质运动图像及其伴音编码的国际标准。视频压缩率为26:1。mpeg-2制定于1995年(iso/iec 13818),是ccir601建议的图像质量dvb、hdtv和dvd制定的3-10mbit/s的运动图像及其伴音编码的国际标准。与前面基于信息论的波形编码理论,针对一定比特率的视频、音频编码的mpeg标准不同的是,于1998年11月公布的国际标准mpeg-4更加注重多媒体系统的交互性和灵活性。它引入av对象(audio/visual objects),使得更多的交互操作成为可能。1998年10月国际标准化组织又推出了mpeg-7的构想,预计于2001年初最终完成并公布,其正式名称为"多媒体内容描述接口"(multimedia content description interface)。它提出了一种适用于现实生活中的各种多媒体内容的标准化描述方案,以提取待描述对象的各方面特征为基础,方便人们对所需的多媒体材料进行快速、有效的检索。

---- 3.vb开发mpeg -- audio/video数据流的播放技术

---- 3.1.vb中multimedia mci 控件,mediaplayer控件播放mpeg数据流的缺点

---- vb中常用的多媒体控件是multimedia mci 控件,它管理媒体控制接口 (mci) 设备上的多媒体文件的记录与回放。它被用来向诸如声卡、midi 序列发生器、cd-rom 驱动器、视频 cd 播放器和视频磁带记录器及播放器等设备发出 mci 命令,还支持 windows (*.avi) 视频文件的回放。采用multimedia mci 控件播放采集的mpeg数据流,播放速度比实时监控显示要快,在测试时还发现mpeg文件长度缩短到500k-600k时,就无法看到播出的图像了。改用vb中的mediaplayer控件上叙缺点仍然存在。分析原因是:因为mpeg文件长度太短了,播放设备刚打开就已经关闭了,这是编程无法控制的。而且,对于用户要求获取的某些有关压缩数据流的信息和希望实现的某些功能,比如图线尺寸、copmression rate、图形的缩放显示、界面的美观等,上叙控件所提供的为方便程序开发人员使用的高层接口已不适用,要想在此基础上实现对底层的一些操作,难度可想而知。在解决上叙实际性问题时,我们调用了动态链接库quatrz.dll。

---- 3.2.提供对mpeg流方便的底层操作和高层接口的动态链接库quatrz.dll

---- 在windows\system下可找到一个动态链接库quatrz.dll,这是windows中带的用于控制运动图像的播放的一个类型库,只要在vb的"引用"菜单中将它添加进来即可使用。该库中定义了ibasicaudio,ibasicvideo和ibasicvideo2,imediaevent 、imediaeventex、imediaposition等类,可方便地在commandbutton控件的click等事件中添加代码设置和读取audio的相关值,设置或读取video的输入输出源的相关参数,直接调用无参函数run、pause、stop等控制播放事件进程,利用imediaposition类对具体播放细节进行操作。对于压缩的mpeg数据流的输出显示并不需要特别的控件,在visualbasic中你可以选择一个窗体作为容器或窗体上的picturebox控件作为容器。为了界面的美观和用户查取相关信息的方便,我们采用了picturebox控件作为容器显示播放的mpeg数据流。

---- 3.3.用picturebox控件显示mpeg数据流

---- visual basic中picturebox 控件可以显示来自位图、图标或者元文件,以及来自增强的元文件、jpeg 或 gif 文件的图形。亦可在代码中操作图形属性和方法,以创建动画或进行仿真。在窗体上放置了一个picturebox控件pictv,在调用了windows\system下动态链接库quatrz.dll的基础上,定义一个全局的object对象pmc,令 pmc指向 filgraphmanager的一个新实例,打开压播放的mpeg文件;再定义一个局部对象 pvw 为 ivideowindow的新实例,打开一个播放video的窗口;令pvw = pmc,给对象引用pvw赋值,将pictv的属性值hwnd赋给pvw的owner ,这样pictv就能显示接收的mpeg数据流了。具体操作如下:

set pmc = new filgraphmanager
pmc.renderfile "c:\bank\montior\example.mpg"
set pvw = pmc
pvw.windowstyle = clng(&h6000000)
pvw.left = 0
pvw.top = 0
oldwidth = pvw.width
oldheight = pvw.height
pictv.width = pvw.width * 15
pictv.height = pvw.height * 15
pvw.owner = pictv.hwnd
---- 可以单独定义一个函数包括这些代码,也可将其放到commandbutton控件的click事件中。
---- 3.4.mpeg数据流的缩放显示

---- 放大或缩小mpeg图像是各种多媒体播放软件中常用的图像显示处理手段。visualbasic中对于静态图片进行缩放处理可以使用image控件,将控件的stretch属性设为true,则装入的图片会改变比例适应image控件的范围,因此对图片的缩放处理变成对image控件的height、width属性值的大小变化。由于控件的尺寸发生变化,显示的点距不能改变,造成显示点的像素点与图片不能完全一一对应,显示质量明显变差。只有image控件才能对图片进行缩放,如果picturebox控件不足以显示整幅图象,则裁剪图象以适应控件的大小。要想实现用picturebox控件实现对输出mpeg图像的缩放,必须改变mpeg数据流的输出比例,在调节picturebox控件的尺寸去适应输出的mpeg图像。实际上,在上面的第3小节里,为了显示输出mpeg图像已经这样做了。只不过用的是读取出的mpeg图像oldwidth、 oldheight,下面给出一个以原来的1/2大小输出mpeg图像的例子。

pvw.width = oldwidth / 2
pvw.height = oldheight / 2
pictv.left = 135
pictv.top = 135
pictv.width = pvw.width * 15
pictv.height = pvw.height * 15
pvw.owner = pictv.hwnd

---- 在放大或缩小mpeg图像的尺寸时要注意保持width、height的比例一致,以免输出的图像变形。
---- 3.5.鼠标拖动播放mpeg数据流

---- 用鼠标拖动滚动条随意播放mpeg数据流是windows中多媒体播放机播放vcd的常用技术。VB中的slider 控件是包含滑块和可选择性刻度标记的窗口,可以通过拖动滑块,用鼠标单击滑块的任意一侧或者使用键盘移动滑块。在选择离散数值或某个范围内的一组连续数值时,slider 控件十分有用。通过将滑块移动到刻度标记处,可以对mpeg数据流进行定位播放。在窗体上放置一个slider 控件slider 1,设置好光标移动的最大步长largechange=5,最小步长smallchange=1,最大移动范围max=50,实现程序如下:

private sub slider1_scroll()
'
dim pmp as imediaposition
dim v as double

if not bopen then exit sub

bseeking = true
pmc.pause

set pmp = pmc

v = slider1.value - slider1.min
v = v / slider1.max * pmp.duration
pmp.currentposition = v
set pmp = nothing

pmc.run
'
end sub

---- 3.6.mpeg数据流采集时间的获取
---- visualbasic里提供了一个函数filedatetime可用来获取文件建立或是更新的日期与时间。定义一个局部对象 pmp 为imediaposition的新实例,令pmp = pmc,给对象引用pmp赋值;再定义两个double型的变量curpos 、length,将pmp.currentposition赋给curpos,取得mpeg数据流的当前相对位置时间,将pmp.duration 赋给length,取得mpeg数据流的时间长度值;就能获取mpeg数据流相对的采集时间。根据mpeg采集文件建立的特性将两个日期时间作加法或减法则可以得到mpeg数据流的采集时间。

本文关键:Visual Basic环境下Video/ Audio压缩数据流播放技术
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top