目前视频播放器很多,可以播放各种各样的文件和流,但大多只支持一个文件或一个流播放,若要播放多个文件就需手工打开多个播放器。在现实的应用中,为了实现多流播放,实际上是直接将媒体流打包输入到计算机的通信接口上,由多个播放器进程进行播放,这样做只适应于播放无关联的媒体流(如多路视频监控,多人会议系统等)。而对于相关联的媒体流,这种播放器就不能实现多个视频文件流的控制和同步。本文在对多流媒体同步播放技术研究的基础上,通过对流媒体服务器的设置,进行了多流媒体播放器的开发。该多流媒体播放器可以接收多流媒体服务器的码流并对其进行解码和控制,同时对相关流进行同步,改进了播放器的内部结构和播放器的用户界面。将其移植成Active控件后,在网页上调用,通过对4个媒体流的同步播放测试,证实该播放器运行性能良好。
1 ActiveX介绍
ActiveX是一种技术集合。利用ActiveX,开发者几乎可以利用任何熟悉的工具产生多媒体效果、交互式功能及复杂的应用程序。其优点在于开放的跨平台支持,可以运行在Macintosh,Windows 和UNIX操作系统上,支持Visual Basic、Visual C++、Borland Delphi、Borland C++、java and Java-enabled tools等各种工具,支持HTML,TCP/IP,Java,COM和其他工业标准。
ActiveX的技术包括用户能够在浏览器之中看非HTML文档(如word、excel文档);能够被插入网页或任何称作控件容器库的应用程序之中的对象(如按钮、股票计数器和直方图);可以在整个客户区域以框架形式显示文档;能够定制来源于数据库或是一个在服务器上运行的程序的网页内容;可以将处理过程从服务器方移至客户方[1]。
2 同步方法、模型、技术
2.1 流媒体同步方法
目前流行的同步方法有分层同步法、时间戳同步法两种。
分层同步法把多媒体流看成一个树型结构,由串并行演示子树组成。有基于动作的串行同步和并行同步两种操作。其优点是易于计算存储和处理,因此得到了广泛的应用。
时间戳同步法是把多个具有时间关系的媒体流依附于一个公共的时间轴上,去掉或更改一个对象不影响其他对象的同步。在运行期间,研究公共的时间轴与局部时间的误差是否超出指定的范围,如果超出则需同步。Quick Time就用此方法。其优点是使得单一媒体对象和嵌套媒体对象的内部结构能有更好的抽象。
2.2 流媒体同步模型
目前,流媒体同步模型采用RTP/RTCP协议,并且将分层同步法和时间戳同步法结合使用,其模型结构如图1所示。人机交互同步即用户对媒体操作,媒体做出相应反应,这种操作的特点是发生时间不确定。媒体间同步即流媒体对象根据时间相关性分为时间无关媒体和时间相关媒体。媒体内的同步指某个时间相关媒体流中各媒体元素之间的时间同步关系[2]。
2.3 流媒体同步解决技术
目前,流媒体播放同步技术有3种:(1)Windows Media Tools同步法,此法利用ASFINDEXER工具在ASF流中设定标记,每个标记都有相应的名称,在导航区中点击标记名称并利用相应的调用语句,就能使媒体播放器跳到标记所在位置开始播放;(2)Microsoft Producer法,此法用工具将视频导入,将其分割成若干片断(create clips),依次把片断拖拽到时间线上,然后点击同步按钮自动生成标题、音视频等信息的同步;(3)SMIL语言法,此法使用SMIL(Synchronized Multimedia Integration Language)语言,描述各种媒体之间的时间同步关系和空间编排关系,将各种媒体文件如音频、视频、文字、图片等关联起来实现同步[3]。
3 多流播放器的设计
3.1 流媒体服务器的架设
Windows Media Server是微软免费提供的一个流媒体服务端软件,可在安装Windows 2003时选择这个服务,也可在Windows安装好后在“添加删除程序”里选择添加该服务。
Media Services 9可将asf、wmv等流文件添加到C:WMPubWMRoot中,然后用“mms://地址/文件名”的方式来访问,也可以重新建立访问目录。
3.2 多流播放器构想
多流播放器应具备的功能为:多个相关文件/流输入到播放器,经过解码,使多个文件/流能够同时显示在播放器窗口播放。系统结构如图2所示。
经过一段时间开发后,发现每个Filter的PIN输出和PIN输入只能是单个的。一个播放器只能对一个流文件进行编码/解码。因此,不能通过这种方式实现多个画面的播放。
对图2进行了改进,图3为改进后系统结构图。
这种方式是在一个播放器的外壳下,包含了多个播放器,实际上每一个视频窗口都是一个独立的视频播放器。多个媒体在同一外壳的播放器下播放,外形上是一个播放器,内部是由多个播放器在播放,通过设置一些应用属性,可以很方便地实现播放的控制功能。
3.3 播放器的播放流程
播放器的播放流程为:打开多流播放器,加载媒体控制文件,判断窗口个数,将媒体流的url的值、同步时间赋给各个窗口,同步技术播放控制多个视频,显示视频,当用户进行控制时,反馈用户,播放完毕。图4为播放器的播放流程图。
3.4 流媒体播放器采用的同步方法、模型、解决技术
本文开发的多流媒体播放器支持4个流媒体,同步模型采用图1所示之模型,用户交互操作采用分层同步法,时间无关的媒体流之间采用分层同步法,时间有关的媒体流之间采用时间戳同步法,单个媒体流采用缓冲控制同步法。同步解决技术将前文所述3种方法相融合,借用2.3节中第3种同步技术,由播放器解码文件中的同步信息协调4个流媒体之间的同步播放,同时利用文本文件记录同步信息和跟踪跳转时间以实现多个流媒体之间同步。具体同步解决技术是:4个流媒体在打开流媒体时,同步读取时间头,在流媒体开始播放时进行同步,然后利用文本文件记录的同步信息,以流媒体1为参考时间轴,其他的流媒体通过函数每1 000 ms检测一次同步信息,如果发现多个流媒体播放时间点与文本文件中记录同步信息一致,则无需同步,反之按文本文件记录的同步信息进行调整[5-6]。
3.5 流媒体播放器核心程序
(1)读取同步点(用数组保存同步信息点)
Open sycFile For Input As #1
Line Input #1, sycQt
ReDim WMP1time(sycQt),WMP2time(sycQt),WMP3time(sycQt),
WMP4time(sycQt)
For i=1 To sycQt
Input #1,WMP1temp,WMP2temp,WMP3temp,WMP4temp
WMP1time(i)=WMP1temp
WMP2time(i)=WMP2temp
WMP3time(i)=WMP3temp
WMP4time(i)=WMP4temp
Next i
Close #1
sycponit=1
(2)通过播放时间与同步时间数组对比,决定是否同步
If WMP1time(sycpoint)=curtime Then
WindowsMediaPlayer1.Controls.pause
WindowsMediaPlayer2.Controls.stop
WindowsMediaPlayer3.Controls.stop
WindowsMediaPlayer4.Controls.stop
WindowsMediaPlayer2.Controls.currentPosition=WMP2time(sycpoint)
WindowsMediaPlayer3.Controls.currentPosition=WMP3time(sycpoint)
WindowsMediaPlayer4.Controls.currentPosition=WMP4time(sycpoint)
WindowsMediaPlayer1.Controls.play
WindowsMediaPlayer2.Controls.play
WindowsMediaPlayer3.Controls.play
WindowsMediaPlayer4.Controls.play
sycpoint = sycpoint + 1
End If
4 多流媒体播放器ActiveX控件设计概要
为了实现多流媒体播放器在网络中的应用,可将程序移植成一个ActiveX控件。本文在VB新建工程中选择建立“ActiveX用户控件”即可建立控件。其程序编写与上面所设计的多流媒体播放器没有太大的区别。但其打开方式上有所不同,程序是用户选择打开多流媒体文件,为4个WindowsMediaPlayer控件赋值。但在ActiveX控件中,为WindowsMediaPlayer赋值的是网站开发人员赋值或者在动态页面中对它进行赋值。
4.1 控件属性、方法和事件
作为一个控件,属性是其主要功能的体现。定义一个属性,除了考虑命名和功能,还要考虑该属性的数据类型、是否允许读写、是允许在设计时还是在运行时使用[4]。
属性、方法和事件统称为控件的成员。控件的接口成员有公有(public)和私有(private)之分。私有成员只能在模块内部调用,公有成员可以被ActiveX控件的用户调用。
利用菜单“工具/添加过程”可以添加控件的成员,其类型有4个:Sub(子程序)、Property(属性)、Function(函数)、Event(事件)。范围有2个:Public(共有的)、Private(私有的)[7-8]。
4.2 播放器属性设置
本播放器选择的用户过程为Property(属性)和Public(共有的),生成的代码为:
Public Property Geturl1() As String
End Property
Public Property Let url1(ByVal New_url1 As String)
End Property
其中Property Get( )读取该过程的属性值,Property Set( )为此过程赋值。可以给设定的用户属性赋值和取值。
该控件中,共设置了9个用户属性。分别为4个url赋值、4个同步起始时间和1个窗口数量。设置接口属性startTime1、startTime2、startTime3、startTime4用于文件头同步;sycFile用于文件中的同步。
图5为多窗口调试同步的测试图。程序运行时,首先读取同步文件,读到同步点数目和第一个同步点同步时间。同时运行各个媒体,在第一媒体播放窗口播放到同步点时间处,会判断其他三个媒体播放时间是否与读取到的同步时间相同,相同则不同步,不同就开始同步。
目前,流媒体播放器在网络、教学、会议和娱乐领域使用广泛。本文对多流媒体服务器架设、多流播放构架设计进行了分析,对同步模式和同步技术方面进行了阐述,设计了播放器ActiveX控件,为研究多流媒体播放器提供了一种新的解决方法。
参考文献
[1] 陆其明.DirectShow开发指南[M].北京:清华大学出版社,2003:1-3.
[2] 王新颖.基于校园网的流媒体同步机制研究[J].襄樊职业技术学院学报,2006,5(6):7-8.
[3] 张炳卓,苏恭.建立Real流媒体技术的网络教学系统[J].中国电化教育,2004(6):83-85.
[4] 李海.Visual Basic编程晋级,ActiveX控件[M].北京:清华大学出版社,2000:100-120.
[5] GINSBURG M.Late Night ActiveX[M].Simon and Schuster,1997:50-63.
[6] 许延.存储媒体的媒体内同步反馈控制算法[J].电子学报,2002,39(12):1675-1680.
[7] 张震新.基于SMIL的流媒体播放器的设计与实现[J].福建电脑,2007(9):134-136.
[8] 基于DirectShow的流媒体解码和回放[EB/OL].seo论坛:http://bbs.fly810.com