视频点播系统暨中心网站的实现

2013-12-29 00:00:00李亚农
电脑知识与技术 2013年2期

摘要:网络电视,或称在线电视,是利用互联网上进行电视直播,通常电视节目以WMV、ASF等流媒体的格式,现如今已成为我们网络生活中不可缺少的一部分,它的技术与发展广受人关注,而研究它,也是具有深远意义的。

该文介绍的是一个基于MFC和Windows Media Format 开发工具包而制作的网络电视播放器。该播放器能具有友好的用户界面,能播放网络上的MMS实时流媒体,并能够实现流媒体的定时录像,弥补了网络上众多网络电视不能定时录像的缺憾,它具有体积小,占有资源少,播放列表等特点。

该文首先介绍了如今网络流媒体发展的背景,然后介绍WMP控件和WMF SDK的一些基本概念和实现的方法,最后介绍该程序的设计。

关键词:网络电视;流媒体;MMS;ASF;Window Media Format SDK

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2013)02-0386-03

随着近几年来网络视频的蓬勃发展,各种流媒体文件已经被我们熟知,但潜藏在其背后的流媒体技术却是更吸引人的所在。

流媒体技术包含三方面内容,分别是编码器(编码技术)、播放器(播放支持)和流服务器(媒体内容发布),三者缺一不可。当前市场上主流的流媒体技术有三种,分别是RealNetworks公司的RealMedia、Apple公司的QuickTime和Microsoft公司的Windows Media。

Windows Media是Microsoft公司开发的流媒体技术。以Windows Media 9 Series为例,整个系列由Windows Media Codec、Windows Media Encoder、Windows Media SDK等内容组成。

其中,Windows Media SDK中的Windows Media Format SDK对ASF文件格式提供了支持。通过使用Windows Media 音视频编解码,实现对Windows Media媒体内容的生成、读取、编辑三大功能。

1 Windows 流媒体技术概述

Windows Media媒体内容采用的是ASF文件格式。Microsoft公司提供了Windows Media Format SDK,以支持 ASF文件的生成(包括ASF数据的流化)、ASF文件的编辑和ASF文件的播放(包括ASF媒体流的播放)。

Windows Media Format SDK 采用面向对象设计,是一套完全基于COM组件模型的高级开发包。这里所谓的高级,是指SDK屏蔽了ASF数据格式、网络传输控制等较为底层的流媒体技术实现细节,留给开发者的只有比较上层的编程接口。

SDK引入了一系列对象,如生成器(Writer Object)、读取器(Reader Object)、编辑器(Metadata Editor Object),等等,正是这些SDK对象屏蔽了Windows Media技术实现细节,使得应用程序开发者不需要了解太多的流媒体底层技术,也能开发出非常专业的流媒体应用系统。

1.1 MMS协议

MMS(Microsoft Media Server)是Microsoft公司自己拥有的流媒体协议。MMS协议实际上是一种应用层协议,支持快进、倒回、暂停、启动和停止索引数字媒体文件等播放器控制操作。MMS协议有TCP和UDP两种传输方式的实现——使用TCP传输的称为MMST协议,使用UDP传输的称为MMSU协议。MMS是一种串流媒体传送协议,用来访问并流式接收Windows Media服务器中.asf文件的一种协议。MMS协议用于访问Windows Media发布点上的单播内容。MMS是连接Windows Media单播服务的默认方法。若观众在Windows Media Player中键入一个URL以连接内容,而不是通过超级链接访问内容,则他们必须使用MMS协议引用该流。MMS的默认端口是1755。

1.2 ASF文件

ASF是(Advanced Streaming Format 高级串流格式)的缩写,是 Microsoft 为 Windows 98 所开发的串流多媒体文件格式。ASF是微软公司Windows Media的核心。这是一种包含音频、视频、图像以及控制命令脚本的数据格式。这个词汇当前可和 WMA 及 WMV 互换使用。

ASF是一个开放标准,它能依靠多种协议在多种网络环境下支持数据的传送。同JPG、MPG文件一样,ASF文件也是一种文件类型,但它是专为在IP网上传送有同步关系的多媒体数据而设计的,所以ASF格式的信息特别适合在IP网上传输。ASF文件的内容既可以是我们熟悉的普通文件,也可以是一个由编码设备实时生成的连续的数据流,所以ASF既可以传送人们事先录制好的节目,也可以传送实时产生的节目。

ASF用于排列、组织、同步多媒体数据以利于通过网络传输。ASF是一种数据格式,它也可用于指定实况演示。ASF最适于通过网络发送多媒体流,也同样适于在本地播放。任何压缩/解压缩运算法则(编解码器)都可用来编码ASF流。

2 程序设计的基本思想

程序的播放界面可以调用Windows Media Player里面的WMP.dll控件进行二次开发,在此基础上,将一些控制按钮实现。

节目列表功能则要调用MFC基础空间里面的LIST CONTROL完成。

而录像功能稍微麻烦点,不能直接通过控件完成,因此要研究Windows Media Format SDK里面的内容,根据里面的内容进行二次开发。这样,程序的播放与录像功能是分离的,这样做有一点好处,可以在播放的同时进行录像。

而录像需要定时,还需要在程序里面加入若干的定时器,实现录像功能的定时性。

3 程序实现

3.1播放窗口实现

Windows Media Player控件是播放器的主窗口,它的添加很简单,直接在窗体右键中选择Insert ActiveX Control选定添加即可,但在之前只需要确定系统上装有Windows Media Player的第九版以上的版本即可。

控件添加后,这时以CWMP开头的17个类将被添加到工程:

这时ClassWizard会将控件与CWMPPlayer4类对象建立关联。

CWMPPlayer4类提供了与Windows Media Player控件进行交互的基本方法,而且部分成员函数还能够进一步获取得到其他相关类对象的实例。其中,SetUrl()和close()方法将能够打开和关闭指定的媒体文件。在打开文件之后,能够通过控件上的自带按钮控制媒体的播放、暂停、停止以及对音量的控制等。如果需要在程序中控制媒体的播放,可使用GetControls()函数返回CWMPControls类对象,并进一步调用该对象的play()、stop()、pause()等方法来完成播放、停止、暂停等相应动作;如果需要在程序中对控件属性进行设置和更改,可在GetSettings()方法返回一个CWMPSettings类的对象后通过其成员函数来完成相应的设置。

Windows Media Player控件的使用较为简单,其功能的调用开发都比较智能化,在这里就不长篇幅介绍了。

3.2录像功能实现

3.2.1类的组成

为此功能新建一类CWMDownload。其中的主要函数如下:

class CWMDownloader:public IWMReaderCallback, public IWMReaderCallbackAdvanced

为了与读取器交互,应用程序需要实现IWMReaderCallback、IWMReaderCallbackAdvanced两个回调接口

其中入口函数是BOOL Start(CString& inSourceFile, CString& inTargetFile),代码如下:

BOOL CWMDownloader::Start(CString& inSourceFile, CString& inTargetFile)

由此函数实现了整个程序执行的流程,那便是:1) 创建读取器;2) 获得源文件的Profile;3) 创建生成器;3) 复制编码信息、元属性、脚本等内容;4) 执行读取写入;5) 探听事件。

Start函数接收inSourceFile和inTargetFile两个参数,分别是CString格式的源文件路径和保存文件的路径。要将这两个路径转换成宽字符串的形式,以供后面函数调用。如下:

MultiByteToWideChar(CP_ACP, 0, inSourceFile, -1, mSourceFile,MAX_PATH);

MultiByteToWideChar(CP_ACP, 0, inTargetFile, -1,

mTargetFile, MAX_PATH);

3.2.2创建读取器和生成器

CreateReader(void)函数调用WMCreateReader函数进行创建,同样,CreateWriter(void)函数调用WMCreateWriter函数进行创建,指针保存在类成员

mIReader和mIWriter。

创建读取器的同时,通过如下语句获得IWMReaderAdvanced和IWMHeaderInfo的接口:

hr = mIReader→QueryInterface(IID_IWMReaderAdvanced, (void **)&mIReaderAdvanced);

hr = mIReader→QueryInterface(IID_IWMHeaderInfo, (void **)&mIReaderHeaderInfo);

IWMReaderAdvanced接口提供了读取器更高级的控制功能,包括用户提供时钟、数据缓存分配、读取器内部统计信息返回、流选择通知等。

IWMReaderAdvanced接口用于获取ASF文件头对象中的信息,包括元数据属性、标记、脚本命令等。

同样的,创建生成器的时候也会获得IWMWriterAdvanced和IWMHeaderInfo接口。

而接下来,生成器的创建需要配置Profile,但Profile哪儿来呢?当然最简便的做法便是使用源文件的Profile,GetProfileInfo()将源文件的Profile赋给类成员mIReaderProfile,创建生成器时通过mIWriter→SetProfile(mIReaderProfile)获得读取器的Profile。

最后,读取器通过mIReader→Open(mSourceFile, this, NULL)这条语句获得读取地址,而生成器通过mIWriter→SetOutputFilename(mTargetFile)获取生成地址。

3.2.3复制元数据属性、编解码器信息、脚本、标记

元数据属性和编解码器信息在数据读取过程开始之前,就可以从源文件复制到目标文件,由CopyAttributes()和 CopyCodecInfo()两个函数完成,具体内容较为繁琐,不详细介绍。脚本比较特殊,因为它可以有两种存在形式:在文件头对象中,或作为一个脚本流。如果源文件的脚本存在于头对象中,则也可以在数据读取过程开始之前将其复制到目标文件中,这部分由CopyScriptInHeader()函数完成。但如果是脚本流保存到目标文件时,可以仍然是以脚本流的形式,也可以在数据读取过程中将各脚本缓存起来,在数据读取完毕之后再一起将它们写入到文件头对象中。标记只能通过SDK的编辑器来复制。因此,标记复制的时机是在数据读取过程结束之后,此函数是CopyMarkers(),在类外部调用。

3.3定时功能的实现

要能定时录像,除了录像,还必须要定时。

MFC有DATA TIME PICKER这样一个控件,可以直接让用户输入开始时间和结束时间,在用与它绑定的CTime格式的成员进行操作。CTime格式的时间能进行比较大小等操作,很是方便。

在对话框拖入两个DATA TIME PICKER控件,在ClassWizard中给两控件设置变量m_startTime和m_stopTime,这样,在用户改变控件值的时候,用Updatedata(true)便能获取CTime格式的时间。另外设置m_taskstarttime和m_taskstoptime作为保存的任务下载时间的变量。

时间取到了,再写一个函数对用户输入合法性进行判断。

4 结束语

至此,一个包括定时录像功能的流媒体播放器便可以搭建成功了。该播放器利用了Windows Media Formate的接口进行二次开发,能实时获取MMS协议的流媒体进行播放,还能进行定时录制视频。

参考文献:

[1] 四维科技,刘袆玮.VisualC++ 视频/音频开发实用工程案例精选[M].北京:人民邮电出版社,2005,5.

[2] 陆其明.DirectsShow实务精选[M].北京:科学出版社,2004,7.

[3] 陆其明.Windows Media 编程导向[M].北京:清华大学出版社,2006,12.

[4] 王亚琴,董彦荣,薄静仪.流媒体传输协议及应用[J].办公自动化杂志,2009,12.