流媒体播放器

2024-09-03

流媒体播放器(精选12篇)

流媒体播放器 篇1

摘要:网络电视,或称在线电视,是利用互联网上进行电视直播,通常电视节目以WMV、ASF等流媒体的格式,现如今已成为我们网络生活中不可缺少的一部分,它的技术与发展广受人关注,而研究它,也是具有深远意义的。该文介绍的是一个基于MFC和Windows Media Format开发工具包而制作的网络电视播放器。该播放器能具有友好的用户界面,能播放网络上的MMS实时流媒体,并能够实现流媒体的定时录像,弥补了网络上众多网络电视不能定时录像的缺憾,它具有体积小,占有资源少,播放列表等特点。该文首先介绍了如今网络流媒体发展的背景,然后介绍WMP控件和WMF SDK的一些基本概念和实现的方法,最后介绍该程序的设计。

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

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

流媒体技术包含三方面内容,分别是编码器(编码技术)、播放器(播放支持)和流服务器(媒体内容发布),三者缺一不可。当前市场上主流的流媒体技术有三种,分别是Real Networks公司的Real Media、Apple公司的Quick Time和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 Active X Control选定添加即可,但在之前只需要确定系统上装有Windows Media Player的第九版以上的版本即可。

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

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

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

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

3.2 录像功能实现

3.2.1 类的组成

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

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

其中入口函数是BOOL Start(CString&in Source File,CString&in Target File),代码如下:

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

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

Multi Byte To Wide Char(CP_ACP,0,in Source File,-1,m Source File,MAX_PATH);

m Target File,MAX_PATH);

3.2.2 创建读取器和生成器

Create Reader(void)函数调用WMCreate Reader函数进行创建,同样,Create Writer(void)函数调用WMCreate Writer函数进行创建,指针保存在类成员

m IReader和m IWriter。

创建读取器的同时,通过如下语句获得IWMReader Advanced和IWMHeader Info的接口:

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

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

同样的,创建生成器的时候也会获得IWMWriter Advanced和IWMHeader Info接口。

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

最后,读取器通过m IReader→Open(m Source File,this,NULL)这条语句获得读取地址,而生成器通过m IWriter→Set Output Filename(m Target File)获取生成地址。

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

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

3.3 定时功能的实现

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

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

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

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

4 结束语

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

参考文献

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

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

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

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

流媒体播放器 篇2

这个程序也能播放MP3、Real、QuickTime等多种格式的文件,不失为一款较好的多媒体工具。

不过它也有一点美中不足:不能实现文件的列表播放。这对于用惯了WinAmp、Jet-Audio的朋友来说,实在是太不方便了。

前不久,笔者偶然发现,媒体播放器可以播放WinAmp的列表文件(*.m3u),

那么,能否在这上面动动脑筋呢?

经过几次尝试,笔者终于找到了让媒体播放器实现列表播放的方法。步骤如下:

A、启动记事本(或其它文本编辑软件),新建一个文件。然后在第一行顶格输入要播放文件的路径,输入完成后按回车键转到第二行,输入下一个文件。例如:

C:Abc1.mp3

C:Def2.rm

C:Def3.mid

B、将此文件保存为扩展名为m3u的文件。用媒体播放器打开这个文件,就可以实现列表播放了。

流媒体播放器 篇3

容量256/512MB

扩展卡支持SD存储卡

屏幕大小2.5英寸

摄像头130万像素

文件格式ASF(MPEG-4)、MP3、WMA、WAV、JPG

播放时间4小时以上

体积90mm×40mm×14mm

自从去年MP4播放器逐渐火暴起来之后,众多厂商当然不甘寂寞,纷纷推出各种档次与定位的MP4播放器产品。最近多彩推出的这款DLC-202C就是面对广大消费者的入门级MP4播放器。

虽说是入门级播放器,但DLC-202C的功能却比很多高价产品还多,除了可以播放MP3及MP4格式的音视频文件之外,机身正面还配备了130万像素的摄像头,支持3倍数码变焦,可以拍摄、播放视频和照片,且长度只受存储空间的限制。

202C的另一大卖点就是它超薄的机身与充满现代感的造型。机身整体为银灰色,采用仿金属塑料材质,金属质感十分强烈,整体造型也比较出色。机身背后采用了在这个价位上比较少见的2.5英寸彩色液晶屏,能显示26万种颜色,播放一般的MP4影片毫无问题。

整个机身的厚度仅有14mm,名副其实的卡片机。从正面看上去,颇有几分超薄数码相机的味道,实际上当你像把握数码相机那样用右手拿起它的时候,会发现中指和机身正面的接触位置正好有些防滑兼美观的设计,一举两得。不得不说的是,202C机身上提供的功能键不算很多,可以满足日常操作的需求,但是手感还有待加强。

流媒体播放器 篇4

随着通信技术和计算机技术的迅猛发展, 3 G时代的到来, 使得人们对手持设备的应用有了更高的要求, 人们已不满足于简单的通话, 收发短信等基本功能, 而更多的是要求有多媒体应用, 能利用手机进行上网冲浪, 3 D游戏, 播放视频等。

二、系统的分析与设计

1. 目前存在的系统分析

随着通信技术和计算机技术的迅猛发展, 使得人们对手持设备的应用有了更高的要求, 人们已不满足于简单的通话, 收发短信等基本功能, 而更多的是要求有多媒体应用, 能利用手机进行上网冲浪, 3 D游戏, 播放视频等。移动设备通过网络观看视频将是不可避免的问题。而且目前的城市的网络覆盖率比较的好。

在这种情况下, 多媒体播放器在设计与实现在有一些问题:

(1) 由于多媒体手机在硬件性能上与P C机有着显著的差异, 所以在多媒体手机上播放的视频短片的比特率要远远低于P C机上的, 所以在设计多媒体手机时要受到多媒体手机硬件与操作系统的影响。

(2) 现在多媒体手机外接的存储卡容量不是很高, 当你在旅行的过程中或者在移动的过程中, 因为你的存储卡的容量有限, 所以你只能看少量的视音文件。

(3) 现在多媒体手机在播放视音频文件的过程中, 如果你看到自已喜欢的图片, 你就想要保存下来, 作为永久的珍藏。

(4) 如何设计一项全新多媒体播放器, 为将来的多媒体移动服务打下坚实的基础。

2. 对目前系统的改进

本项目是一个关于手机播放器的系统, 通过移动终端手机能够实现在任何时间, 地点进行多媒体音频与视频的播放, 本项目在空间上延伸了基于internet的网络服务, 在时间上更具有灵活性。本系统只能播放视频文件的格式为M P E G格式与音频文件的格式为W A V格式, 这是因为由底层的开发包所决定的。

本项目具有以下几个功能模块:

(1) 首先视频 (主要是MPEG格式) 的播放模块, 播放形式主要采用两种形式:本地播放与网络播放。本地播放也就是所谓的视频文件在本地手机存储器里, 直接进行播放, 网络播放主要是视频文件放在网络服务器, 手机进行调用播放。它在空间上延伸了internet网络服务, 在时间上更具有灵活性。

(2) 其次实现音频 (主要是W A V格式) 的播放模块, 播放形式主要采用两种形式:本地播放与网络播放。运行方式与视频播放模块相似。

(3) 再次抓图模块, 在进行播放本地与网络视频时, 当你认为哪一个视频的瞬间你很鼓欢, 你就可以进行抓图, 把它抓下来。

(4) 最后是控制模块, 在进行播放音频与视频的同时, 有一些基本的控制功能, 比如:播放, 停止, 暂停, 增加音量, 减小音量等。

1>以下是本地播放视频或音频文件流程图

以上图的说明:这是一个本地播放视频或音频文件的流程图, 首先生成一个等待Wait Canvas的对象, 之后生成一个等待界面, 然后生成一个Video Canvas对象, 它主要是用来进行播放文件控制的, 用Video Canvas生成的对象来打开用户在刚开始的界面上所输入URL, URL里包括IP地址, 端口号 (8080) 以及被访问的文件名。如果打开成功都进行播放, 如果失败者结束程序。最终关闭MIDlet程序。

2>以下是网格播放视频或音频文件流程图

以上图的说明:这是一个网络播放视频或音频文件的流程图, 首先生成一个等待Wait Canvas的对象, 之后生成一个等待界面, 然后生成一个Video Canvas对象, 它主要是用来进行播放文件控制的, 用Video Canvas生成的对象来打开用户在刚开始的界面上所输入U R L, URL里包括IP地址, 端口号 (8080) 以及被访问的文件名。如果打开成功都进行播放, 如果失败者结束程序。最终关闭MIDlet程序。

三、客户端的实现

手机客户端MIDlet的设计是本课题研究的重点, 是实现本地与无线播放器应用的关键, 客户端MIDlet需要解决的关键问题有:MIDlet程序结构流程控制, 界面的开发;准确地提交用户请求参数问题等。根据系统需求分析, 本项目终端支持系统的客户端主要面向的活动者是有具有多媒体手机的用户。以多媒体手机的用户所应具有的功能进行介绍手机客户端MIDlet开发的过程和主要解决的问题。

1. 客户端流程设计

主要的流程说明:首先启动MIDlet, 进行输入所要访问的服务器的IP和所要播放的文件的全称, 如果输入错误, 都重新输入, 如果输入正确者, 进行下面的一个操作, 机器根据你所输入的IP地址来判断是本地播放, 还是要进行网络的播放, 当你如果输入的是本地IP, 那么手机只播放你在手机存储介质里面的视频或音频文件。如果你输入的是网络IP, 那么手机会播放在服务器中的视频或音频文件。在进行播放视频与音频的过程中, 可以对被操作对象进行一系列的操作, 比如抓图等。

2. MIDLET主程序的设计

一个MIDP应用程序的基本执行单元——MIDlet, 所以Control Video继承MIDlet了, 并有以下几个方法:start App () , pause App () , destroy App () , command Action () 还有一个线程Play Image, 这个程序它所要实现在的主要功能是, 形成一个输入的界面, 在这个界面里面要实现让用户输入URL, URL里面包含访问计算机的IP, 端口号及所要访问的播放文件全称。还有在界面上还形成几个按钮比如开始, 退出这是由command Action () 来进行控制等, 它还进行控制整个程序的运行, 选形成一个等待的界面, 然后根据用户所输入的信息进行打开U R L, 再进行播放文件的控制等等。

3. 播放控制的设计

它主要是由Video Canvas继承Canvas, 并有以下几个方法:Video Canvas () , initialize () , paint () , time2pix () , open () 等方法。它主要实现的功能是:对播放的视频或音频文件进行一系列的操作比如播放, 停止, 暂停, 增加音量, 减小音量。

4. 播放文件判断的设计

在这里主要是设计一个单独的类, 名称为Video Type, 它主要先从用户输入的U R L来分析出用户输入的信息, 从中分离出输入的I P地址, 端口号以及文件的名称, 再进行判别用户输入的文件的类型。它里面有以下几个方法:guess Content Type () , split URL () 。

5. 网络连接等待介面的设计

这是一个所设计的一个等待界面, 名称Wait Canvas, 它继承了Canvas类, 它主要的功能是:当用户输入IP地址时, 手机在连结服务器的时候, 可能会有一个过程, 所以这个时候出现一个等待界面。它里面有以下几个方法:Wait Canvas () , void set Message () , paint () 。

四、结束语

本文研究的重心在于利用流媒体技术使手机播放器中本地与网络 (无线) 终端MIDP应用开发技术的解决方法及资源的网络通信, 信息整合问题。因此在论文中深入研究了J2ME体系结构及其平台下手机程序MIDP的开发技术, 详细分析了本地终端与无线终端和资源的通信解决方法, 并构造了一个手机多媒体播放器系统, 通过该系统, 完整说明了MIDP应用程序开发的流程控制, 界面设置与流媒体和视频压缩技术。本系统还会不断的改进, 实现更广, 更新, 更实际的功能, 以适应时代的需求。

摘要:本课题的重点是讨论利用现在的J2ME, MPEG及相应的流媒体技术, 开发出移动设备终端的媒体播放器。

关键词:流媒体,J2ME,MPEG,RTP,RTCP

参考文献

[1]吴一丁:J2ME技术在移动设备上的应用.java研究组织, 2005

[2]黄宝雄:流媒体技术.中国多媒体视讯, 2005

[3]刘雄武:移动流媒体技术及其应用发展方向.CSDN, 2005.06

自动更新播放软件里的媒体库 篇5

1. 在Windows Media Player中设置

点击菜单“工具→选项”,在“选项”对话框中选择“媒体库”标签,接着点击下面的“监视文件夹”按钮,如图1所示。

图1 Windows Media Player选项设置 然后在弹出的对话框中点击“添加”按钮,来选择你要监视的文件夹,一次可以添加多个受监视的多媒体文件夹,还可以把FlashGet中保存下载文件的文件夹设置为受监视的文件夹,这样下载的多媒体文件就可以自动加入媒体库了。

编辑提示:在“媒体库”标签下还可以设置一下多媒体文件的大小限制,这样就可以删除一些系统中的声音文件了,如音频设置最小为500KB,视频最小为KB,

2. 在RealPlayer中设置

在RealPlayer中也可以自动加入多媒体文件到“媒体库”,点击菜单“工具→首选项”,在弹出的“首选项”对话框中点击左面的“我的媒体库”,接着把右面 “每隔20分钟便检查受监视的文件夹是否有新剪辑”前面的复选框选中,再设置一下间隔的时间,然后点击下面的“添加文件夹”按钮就可以来选择要监视的多媒体文件夹,一次可以添加多个受监视的文件夹。这样每当我们打开RealPlayer中的“我的媒体库”时,软件就会自动检查设置的文件夹,把新的多媒体文件夹添加到“媒体库”中,如图2所示。

图2 Real Player选项设置 在点击窗口下面的“配置列”按钮,我们还可以来设置“媒体库”中显示的列表,根据自己的需要选择哪些列要显示,哪些列不要显示。

热门推荐:UU通讯录:自动更新通讯录

用百兆打造个人网络电台 点击阅读更多学院相关文章>>

流媒体播放器 篇6

PMP是Portable Multimedia Player的英文缩写,意为便携式多媒体播放器,顾名思义,这个小东西体积虽小,功能可是十分的丰富。朝华PMP MV500整体外观为中规中举的银灰色,做工相当精细,体现了厂家的实力,其尺寸为116×78×23mm(长×宽×高),拿在手里的感觉与一个普通的PDA相似,重量约为225克,没有那种廉价播放器轻飘飘的感觉,但较长时间托在手中也不会觉得疲劳,因此无论是携带还是使用都十分轻便。

PMP MV500拥有高达26万色的3.5英寸TFT真彩显示屏,颇有画龙点睛的效果—毕竟一台便携式多媒体播放器的视频播放效果是非常重要的。在实际测试使用中,其播放效果也称得上优秀,色彩锐利丰富,影像清晰自然,但还是会出现类似于“丢帧”的现象,不过这应该与测试影片本身有较大的关系。在播放较长影片的时候,使用者可以将其放置于底座之上进行观看,省力且方便。

易用性方面,用户可以通过一个五向遥杆配合三个功能键,就可以完成全部操作,简洁而快速,只是需要一些时间来适应,不过对于用惯了带有遥杆的手机用户来说,应该能够很快熟悉。应用程序和菜单的响应速度也相当快速,没有太多延迟的感觉,整体性能相当不错。

值得一提的是,该产品还带有一个130万像素的摄像头,可以进行180度的旋转,使用起来十分方便,可以满足用户摄影、摄像的需求。标配的20GB硬盘能够为用户长时间摄像提供了保障,而且还可以存放大量的数码相片、MP3或是其它数据文件,亦可客串一个大容量的移动存储设备。

PMP MV500除了MP4标准的视频播放功能之外,同时将摄像机、照相机、录像机、电子相册、随身听、收音机、录音笔、移动硬盘这些功能一网打尽,几乎可称得上是消费类数码产品中的“全能选手”。当然,如此丰富的功能必然意味着高昂的价格,有经济实力的朋友不妨找机会一试。

朝华PMP MV500 便携式多媒体播放器

优点:性能强大,几乎可称得上是“全能选手”。

缺点:价格较高。

参考价:5800元

厂商:朝华数码科技有限责任公司

电话:800-810-5996

流媒体播放器 篇7

Symbian OS是当前智能手机市场占有率最大的主流操作系统,基于Symbian平台的移动流媒体应用有着广阔的前景。Symbian S60系统内置播放器采用的是RealPlayer引擎,意味着它只能播放格式为MP4、3GP和RMVB的音视频本地文件或RTSP流。鉴于使用Symbian内置的RealPlayer引擎实现的流媒体播放器有着诸多的限制,比如不支持HTTP流式播放,不支持FLV等主流视频网站采用的流媒体格式,在Symbian平台定制自己的流媒体播放器,成为了当前研究的热点。

该文根据Symbian S60平台的特点,提出了两种流媒体播放器的实现方案,为不同的需求提供了不同的解决办法。其中为开源的本地播放器添加网络模块以实现流式播放,是一种行之有效的方法,可以广泛应用于Symbian平台的流媒体应用开发中。该文重点介绍了如何为本地播放器添加网络模块来实现HTTP流的播放。

1 Symbian对流媒体的支持

1.1 流式传输技术

实现流式传输有两种方法:顺序流式传输(Progressive Streaming)和实时流式传输(Real-time Streaming)。

顺序流式传输的本质是顺序下载,在下载文件的同时用户可观看已下载的部分,而不能跳到未下载的部分,顺序流式传输不像实时流式传输在传输期间根据用户连接的速度做调整。由于标准的HTTP服务器可发送这种形式的文件,也不需要其他特殊协议,所以常又称之为HTTP流式传输。

实时流式传输是指保证媒体信号带宽与网络连接带宽相匹配,使媒体可被实时观看。实时流式传输总是实时传送,适用于音视频直播,也适用于随机访问的点播,用户可快进或后退以观看前后的内容。实时流与HTTP流式传输不同,它需要专用的流媒体服务器(QuickTime Streaming Server、Real Server与Windows Media Server等)与传输协议(RTSP(Real-time Streaming Protocol)或MMS(Microsoft Media Server)等)。

1.2 Symbian多媒体框架

Symbian采用多媒体框架(MMF)处理多媒体应用,它为各种S60音视频播放器提供了一些高级API。MMF拥有一个插件架构,它使用了多种类型的用于媒体回放和录制的插件,所有的媒体录制和回放都由MMF控制器插件完成。一个MMF控制器可使用一些附加插件,用于媒体处理,如MMF编码解码器等。通过增加一些实现了新型编码解码和文件格式的控制器插件,就可对MMF进行扩展。如要回放一个多媒体文件或URL,MMF框架将选择一种控制器插件来播放这个文件或URL。控制器插件可以载入其它的插件(如编码解码器等)。

RealPlayer引擎是针对MMF控制器的插件,支持视频和音频回放及流。它支持其自己的编码解码器插件。针对RealPlayer引擎的音频解码插件通过一种适配层即可使用MMF编码解码插件,或与DevSound框架通讯以实现解码和渲染。

Media Player UI是一种视频和音频播放器,它使用MMF高级API来访问多种MMF控制器。很多时候Media Player UI将载入RealPlayer引擎MMF控制器以渲染各种本地和流式多媒体内容。

2 基于RealPlayer引擎的实现方案

根据上述的Media Player UI,可以实现一个基于RealPlayer引擎的流媒体播放器,这需要考虑服务器和客户端两方面的问题。

2.1 服务器端

移动流媒体并不需要专门的手机的服务器端,手机对服务器的访问,与传统PC上对流媒体服务器的访问一致,只是手机通过3G或GPRS等移动网络接入Internet,而PC可以直接连接Internet。由于Symbian内置的是RealPlayer引擎,故其只能支持RTSP形式的实时流式传输方式,不支持HTTP流式传输方式和MMS等其它流媒体协议。Helix是RealNetworks公司开发的流媒体服务器产品,可以用来作为服务器端,为文件提供访问控制。

2.2 客户端

有了流媒体服务器,可以在手机客户端软件上自定义用户界面并使用CVideoPlayerUtility API播放和控制RTSP流,这同时需要提供一个从MVideoPlayerUtilityObserver派生的类,作为视频播放的观察者,以提供回调方法。

在实例化CVideoPlayerUtility后,使用过程中几个关键的函数为:1)void OpenUrlL(const TDesC&aUrl):打开指定URL,如果URL指定的文件不存在将告知错误;2)void Prepare():MVideoPlayerUtilityObserver提供的回调函数,通知装载控制器插件准备读取数据,如果文件格式不正确(不是RealPlayer支持的格式)将告知错误;3)void Play():开始播放音视频;4)void PauseL():暂停播放;5TInt Stop():结束播放。

3 自定义播放器的实现方案

如果希望应用程序能够播放RealPlayer引擎不支持的媒体格式或其它流协议,创建一个定制的媒体引擎就是唯一的选择。对于自定义的播放器,典型的原理如图1所示。

基于上述框图,可以自由地在Symbian S60平台上实现流媒体播放器的各个模块。

3.1 服务器端的选择与开发

如果希望进行实时流式传输,则可以选用支持不同协议的流媒体服务器,不同的服务器可以支持的文件格式不一样,假如想播放微软的wmv、asf等格式,则可以选用Windows Media Service作为服务器;如果只需要进行顺序流式传输,则普通的Web服务器如IIS、Tomcat等都可以满足要求,且对音视频文件类型没有限制;当然,也可以根据需要自定义服务器端的实现。

3.2 手机客户端播放器主要模块的开发

1)获取数据:通过网络模块从网络上接收数据流,如果是采用RTSP协议等,接收到的RTP数据包有可能是乱序的,这时候需要进行数据包重组;如果是采用HTTP协议,则不存在数据包重组的问题,但需要自定义处理丢包的情况;

2)音视频分离:如果是采用RTSP协议,音视频是分开传输的,需要识别不同数据包的媒体类型,然后分离给不同的解码模块(音频或视频)处理;如果是使用HTTP协议,实际上获取的是源文件的内容,这时候需要读取数据内容来进行格式解析,判断不同的媒体类型,从而进行音视频分离;

3)音视频解码:针对不同的音视频压缩标准,在PC端有成熟的音视频解码方案,对于不同的文件格式和编码标准,可以采用移植ffmpeg、live555等开源项目中解码器的方法,实现Symbian平台的解码器;

4)音视频输出:对于视频,解码后的YUV数据转换为RGB后,采用双缓冲绘屏的方法输出到屏幕;对于音频,解码后可以使用CMdaAudioOutputStream输出。

基于上述原理,接下来将详细介绍如何实现FLV文件的HTTP流式播放。

4 FLV文件的HTTP流式播放

4.1 FLV和MobiFLV简介

FLV流媒体格式是一种新的视频格式,全称为Flash Video。它形成的文件极小、加载速度极快,已经成为当前视频文件的主流格式。目前各大在线视频网站如优酷网、土豆网等,均采用此视频格式,

MobiFLV是一个基于Symbian的开源FLV播放器项目,它的视频解码器部分是从开源项目ffmpeg的libavcodec部分移植而来的,使用MobiFLV可以在Symbian S60平台播放本地的FLV文件。为了让本地播放器能够实现流式播放,就必须为其添加网络模块,使其可以处理来自网络的数据而不仅仅是本地文件。

4.2 网络模块的实现

发送HTTP请求并获取服务器传回的数据,通常是非常耗时的任务。为防止主线程被阻塞,下载过程通常被安排在另一线程中执行,采用多线程的方法来实现数据的读写。但是Symbian并不提倡使用多线程,因为Symbian系统是通过客户端/服务器结构来提供对线程资源的访问,这意味着访问线程需要与内核的服务器程序不断地进行通信,效率低。

为此,Symbian为这种特别需求设计了一个Active Object(AO)框架。AO框架是运行于一个线程内部的调度框架,其基本思想是把单个线程分为多个时间片来运行不同的任务,各个任务是不可抢占的(这和多线程明显不同)。

利用Symbian独有的活动对象,可以使用两个AO分别负责下载和读取数据,这样即达到了类似多线程编程的目的,又提高了效率。

网络模块的基本职责是向服务器请求数据,并将获取的数据以适当的方式存储,供上层模块(如文件格式解析模块)读取,这其中并不需要修改上层模块的代码,只需要修改读取数据接口的具体实现。获取数据后,可以将数据完整地保存在本地文件中,也可以只保存在内存缓冲中,以下分别介绍这两种方法的实现。

4.2.1 基于本地文件

基于本地文件的方法,在从网络获取数据之前,先在手机上建立一个可读写的文件,从网络获取的数据流可以不断写入到文件中,当需要读取数据时,就好像从本地文件读取一样。

具体的实现方法是:使用一个低优先级的活动对象负责下载,并将数据写入到文件中,同时用一写指针记录当前写入文件的位置。同时,另一个高优先级的活动对象负责读取文件,为下一模块提供数据。当读指针大于写指针时,则等待下一个写信号完成的到来。

这种方案的缺点是:无论如何,都需要在手机上创建一个文件来保存数据,如果要观看的文件比较大,会占用较大的空间。

4.2.2 基于内存缓冲

基于内存缓冲的方法并不创建一个本地文件用于保存数据,而是将数据保存于内存的缓冲区中,读取完后再为缓冲区加入新数据。一个基本的方法是采用双缓冲策略,两个缓冲轮流负责接收网络数据流和为上层模块提供数据。基本的流程图如图2所示。

这是一个典型的生产者/消费者模型,Read AO作为消费者,DownLoad AO作为生产者,Buffer作为共有资源。DownLoad AO负责轮询Buffer,看是否为空,是则启动下载,否则返回;Read AO则负责读取数据,如果Buffer为空则等待,否则读取,并记录读指针的位置,当超出Buffer大小时,将Buffer置为空,表示需要下载新数据。

根据上述方法,可以实现一个基于HTTP的流媒体播放器,并在N79上测试成功,可流畅播放FLV视频。

5 结束语

该文总结了Symbian平台流媒体播放器的解决方案,先简单介绍了基于RealPlayer引擎实现RTSP流式播放3gp文件的方法,后详细介绍了如何通过为已有的本地播放器添加网络模块,实现HTTP流式播放FLV文件。通过在真机上测试,证明了上述方案的可行性。在上述方案的基础上,还可以根据需求扩展实现支持RTSP或MMS等流媒体协议的播放器。

参考文献

[1]廖勇.流媒体技术入门与提高[M].北京:国防工业出版社,2006:365-395.

[2]Harrison R,Shackman M.Symbian OS C++手机应用开发(第3卷)[M].北京:人民邮电出版社,2009:441-482.

[3]Stichbury J.Symbian OS C++高效编程[M].北京:人民邮电出版社,2006:84-116.

流媒体播放器 篇8

关键词:DirectShow,WinCE6.0,流媒体

0引言

多媒体终端是一种以播放多媒体文件为其主要功能的消费类电子产品, 其中的多媒体文件包括音频、视频、FLASH动画、图片等。而且, 在此基础之上, 多媒体终端可以扩展诸如视频录制、摄像/照相、数码相册、收音机、电子书、游戏、上网等丰富的功能, 成为一种个人信息和娱乐的便携式设备。便携式媒体播放器 (Portable Media Player, PMP) 、智能手机 (Smart Phone) 、个人数字助理 (PDA) 等都是典型的多媒体终端设备[1]。本文主要论述了如何在基于WinCE操作系统的智能设备上利用DirectShow技术实现流媒体的播放, 并给出了测试结果。

1 DirectShow简介

DirectShow是DirectX开发包中关于流媒体处理的一个开发包, 这个开发包可以进行音频和视频的捕捉, 使用它可以开发DVD应用程序和数字TV应用程序。DirectShow支持的媒体文件主要有WMA、MOV、MPG、AVI、MP3、WAV、WMV等, 无论是读取媒体文件还是将捕捉的数据写入到媒体文件, DirectShow开发包都能提供很好的技术支持。

DirectShow技术利用标准组件来处理流媒体数据, 这些组件称为过滤器。过滤器带有输入和输出针角, 或二者兼而有之。在DirectShow技术中处于最核心位置的就是作为“过滤器”的可插入标准组件, 它是执行特定任务的COM对象。过滤器又分为源过滤器 (source filter) 、变换过滤器 (Transform filter) 和表现过滤器 (Render filter) 等。过滤器通过向文件读写、修改数据和显示数据到输出设备上来操作流媒体[2]。为了完成整个任务, 必须要将所有过滤器Filter连接起来, 这3种过滤器组成了过滤器图表结构, 如图1所示。

2 DirectShow技术开发准备

DirectShow组件在“C:WINDOWSsystem32”目录下的Quartz.dll动态库中, 要使C#代码引用COM对象和接口, 必须将COM类型库转换为.NET框架元数据, 从而有效地创建一个可以从任何托管语言调用的托管包装。在转换过程中需要使用FrameWork SDK自带的TlbImp命令工具, 该命令工具在“E:Program FilesMicrosoft Visual Studio 8SDKv2.0BinTlbImp.exe”目录下 (取决于Visual Studio 2005的安装路径) 。该命令的使用方法为:TlbImp C:WINDOWSsystem32quartz.dll out:QuartzTypeLib.dll在DOS命令下执行转换成功[3]。

3多媒体播放器程序

按以下步骤创建一个空的项目:

(1) 启动 Visual Studio 2005, 然后单击菜单栏“新建”|“项目”。

(2) 在项目类型里选择“Visual C# ”|“智能设备”, 在模板中选择“设备应用程序”, 键入新项目的名称 (最好为 DirectShow) , 然后单击“确定”。

(3) 在属性窗口中将窗体名称更改为FrmPlayMedia, 将窗体文本更改为“流媒体播放器”。

按照以下步骤在项目中添加一个对 DirectShow的引用:

(1) 在Visual Studio 2005开发环境中, 选择菜单“项目”|“添加引用”命令, 弹出“添加引用”对话框。

(2) 选择“浏览”选项卡, 通过浏览找到引用QuartzTypeLib.dll所在的位置, 并引用到程序中。

(3) 引入using QuartzTypeLib后, 在程序中就可以开发相关多媒体程序了。

添加 Windows 窗体控件:

(1) 在 View (视图) 菜单中, 单击 Designer (设计器) , 或者单击 Solution Explorer (解决方案资源管理器) 中的 View Designer (视图设计器) 按钮, 切换到窗体设计器。

(2) 在窗体上添加6个Button控件, 主要用来操作播放的媒体文件。

(3) 在窗体上添加一个TrackBar控件, 用来显示媒体文件播放的进度。

(4) 在窗体上添加一个Timer控件, 用来计算媒体当前的进度。

(5) 调整控件在窗体中的排列方式, 使之符合需要而且方便用户使用, 如图2所示。

4实验结果

以上程序编译后, 即可下载到开发板上的WinCE6.0系统内, 就可以顺利地播放在线视频。图3是播放效果截图, 流媒体文件地址是mms://stream-mms.daai.tv/wmtencoder/100k.wmv。

5结束语

现代多媒体技术的终端智能化和嵌入化发展趋势, 促使嵌入式系统产品中对多媒体的应用越来越多, 特别是要求对各种多媒体文件的播放支持显得越来越重要。通过对本程序的研究, 可以比较清晰的了解WinCE下基于DirectShow多媒体编程开发的方法与步骤, 以便为更复杂的开发应用奠定基础。

参考文献

[1]何宗键.Window CE嵌入式系统[M].北京:北京航空航天大学出版社, 2006.

[2]张冬泉, 谭南林.Windows CE实用开发技术[M].北京:电子工业出版社, 2006.

流媒体播放器 篇9

关键词:嵌入式,流媒体,ARM,客户端

0 引言

流媒体是一种将网络技术和流式传输技术结合起来的连续时基媒体。流媒体技术不同于传统媒体技术之处在于它能够直接从网络上得到平滑的数据流,而无需事先把数据下载到本地机器。就把从网络上获得这种平滑数据流的传输方式叫做流式传输[1]。流式媒体在播放前并不下载整个文件,只将开始部分内容存入内存,流式媒体的数据流随时传送随时播放,只是在开始时有几秒或十几秒的延迟。通过对Mplayer播放器的改进和移植构建了一种基于ARM处理器的新型流媒体播放器的客户端。这种播放器不但继承了Mplayer播放器本身的所有优点,而且能够通过网线与装有流媒体服务器的PC机相连,在ARM上进行流媒体播放,非常适合应用于嵌入式系统。

1 开发平台

1.1 ARM处理器

1.1.1 ARM处理器简介

1991 年11月 ARM 公司成立于英国剑桥的一个谷仓,公司主要出售芯片设计技术的授权。目前,采用 ARM技术知识产权(IP)核的微处理器,即通常所说的 ARM 微处理器,已遍及工业控制、消费类电子产品、通信系统、网络系统、无线系统等各类产品市场,基于 ARM 技术的微处理器应用约占据了32位RISC微处理器75%以上的市场份额,ARM 技术正在逐步渗入到我们生活的方方面面。

1.1.2 ARM处理器特点

ARM芯片具有RISC体系的一般特点[2],如:

①具有大量的寄存器。

②绝大多数操作都在寄存器中进行,通过Load/Store的体系结构在内存和寄存器之间传递数据。

③寻址方式简单。

④采用固定长度的指令格式。

不但如此,ARM体系采用了一些特别的技术,在保证高性能的同时尽量减小芯片体积,减低芯片的功耗。这些技术包括:

⑤在同一数据处理指令中包含算术逻辑处理单元处理和移位处理。

⑥使用地址自动增加(减少)来优化程序中循环处理。

⑦Load/Store指令可以批量传输数据,从而提高数据传输的效率。

⑧所有指令都可以根据前面指令执行结果,决定是否执行,以提高指令执行的效率。

文中采用三星公司S3C2410 ARM开发板作为开发平台。

1.2 Linux嵌入式操作系统

Linux从1991年问世到现在,短短的十几年时间已经发展成为功能强大、设计完善的操作系统之一,不仅可以与各种传统的商业操作系统分庭抗礼,在新兴的嵌入式操作系统领域内也获得了飞速发展。嵌入式Linux是指对标准Linux经过小型化裁剪处理之后,能够固化在容量只有几百k或者几M字节的存储器芯片或者单片机中,适合于特定嵌入式应用场合的专用Linux操作系统。嵌入式Linux的开发和研究是操作系统领域中的一个热点,目前己经开发成功的嵌入式系统中,大约有一半使用的是Linux。Linux之所以能在嵌入式系统市场上取得如此辉煌的成果,与其自身的优良特性是分不开的[3]。

①广泛的硬件支持。

②内核高效稳定。

③开放源码,软件丰富。

④优秀的开发工具。

⑤完善的网络通信和文件管理机制。

本文选用适合嵌入式移植的Linux-2.4.18内核版本。

1.3 音频驱动

目前,大多数的嵌入式开发板都使用philips uda1341音频芯片,因而它们使用的音频驱动也是相同的,即为MIZI公司拥有版权的Linux uda1341音频驱动[4],这个驱动基本符合开放声音系统(oss)的规范。但是当使用到多段DMA音频数据传输时,出现了一个问题。即DMA缓冲的建立发生在第一次调用write()函数将音频数据传送到设备描述符的时候,然而oss驱动的调用者通常要在打开音频设备描述的时候,就期望获取DMA缓冲的信息,因为此时缓冲尚未建立,返回缓冲大小必然为0。解决的办法是修改音频驱动源码的drivers/sound/smdk2410_audio_open()函数体。

在Audio_clear_buf(&output_stream)这句后面加上如下一段代码:

最后重新编译内核,音频驱动成功。

2 RTP/RTSP功能实现

RTP(Real-time Transport Protocol)是用于Internet上针对多媒体数据流的一种传输协议[5]。RTSP(Real-time Streaming Protocol)定义了一对多应用程序如何有效地通过lP网络传送多媒体数据。它使用TCP或RTP完成数据传输[6]。

2.1 Live555简介

为了实现Mplayer RTP/RTSP功能,则需要安装live555库。live555是以事件驱动为基础的网络多媒体串流处理函式库[7],live555主要包含以下几个基本类库:

(1)使用环境(usageEnvironment):UsageEnvironment和TaskScheduler类用在调度不同事件。还有HashTable类定义,这些都是抽象基类。在使用过程中可以利用环境的特定功能。

(2)groupsock:封装网络接口和socket。特别是还封装了multicast应用,这个multicast并不是Mbone意义的multicast,而是将多个写而不读的socket组合处理,用来模拟multicast。

(3)liveMedia:定义一个类栈,根类是Medium类。

(4)BasicUsageEnvironment:定义一个usageEnvironment的实现, 这个里面除了有一个TaskScheduler以外,都是一些说明性的东西。TaskSheduler里面是一些调度相关的函数,其中doEventLoop是主控函数,定义为纯虚函数。

(5)MediaSession:定义了一个mediaSubSession链表;MediaSubSession中又定义了SessionId,服务端口号,rtp/rtcp Channelld和MediaSink指针,等等一些参数信息。

2.2 Mplayer中Live555库的调用

从RTSP或者SIP中取到SDP描述,然后调用Live555中的mediaSession类创建Session。通过成员函数initializeWithSDP分析SDP描述。

OpenRTSP:

(1)创建TaskScheduler和UsageEnvironment实例。

(2)调用createClient创建media实例。

(3)在openRTSP.c中,main完成配置以后,开始如下循环:

在BasicTaskScheduler0类中,定义为while(1) SingleStep()。SingleStep的处理是通过select监听一组句柄,这组句柄通过iter组成的链表串接起来,对每个句柄有处理函数,如果有句柄上有数据,那么调用对应的处理函数。

2.3 编译Live555

3 Mplayer播放器的移植

3.1 编译前的准备

选择合适的交叉编译器是保证编译成功的前提,编译器版本过高或者过低都可能导致编译失败,本文选用arm-linux-gcc-3.3.2版本的编译器。Mplayer源码选用目前最新版本MPlayer-1.0pre8.tar.bz2。对源码进行解压缩之后,进入解压后的目录,例如:

(1)# cp MPlayer-1.0pre8.tar.bz2 /usr/src

(2)# cd /usr/src

(3)# tar jxvf MPlayer-1.0pre8.tar.bz2

(4)# cd MPlayer-1.0pre8

3.2 编译Mplayer

(1)配置文件

文件的配置是交叉编译Mplayer的关键所在,配置选项可以通过./configure--help来查询。配置代码如下:

./configure--host-cc=gcc --cc=arm-linux-gcc--target=arm-armv4l-linux --enable-static --enable-live --with-livelibdir=/usr/src/live --prefix=/tmp/mplayer --disable-win32 --disable-dvdread --enable-fbdev --disable-mencoder 2>&1 | tee logfile

在这里有几处配置参数需要特别说明:

①--host-cc=gcc:

这个参数必不可少,否则编译不通,原因是某些文件需要gcc来生成,而不是arm-linux-gcc。

②--target=arm-armv4l-linux :

其中,arm是指arch,此处根据处理器设定为arm ;armv4l是指具体的版本,确保和libavcodec目录下的平台目录名一致,否则这个平台的优化代码无法编译进去;第三部分是系统平台。

③2>&1 | tee logfile:

意思是将执行的情况在输出到屏幕的同时记录到logfile文件中,在控制台下编译比较有用。

④--enable-live:

加入live555库,--with-livelibdir等号右边就是live555所在目录。

(2)Make

一行行代码自下而上在屏幕间闪过,如果一切顺利的话,最终得到了可以在ARM中运行的可执行文件mplayer,把它下载到ARM开发板中,一套精巧而功能强大的流媒体客户端就建立起来了。在PC机上安装Darwin等流媒体服务器,开发板就可以通过网线播放PC机上的音视频文件了。

4 结束语

本客户端已经通过流煤体项目投入应用,用户反映良好。

参考文献

[1]徐鹏.嵌入式流媒体播放器的设计与实现[D].电子科技大学硕士学位论文,2008:4.

[2]杜春雷.ARM体系结构与编程[M].北京:清华大学出版社,2003.

[3]徐波涛.基于ARM的流媒体传输方法的研究[D].南京理工大学硕士学位论文,2007:18.

[4]史涛.嵌入式媒体实时点播系统的设计与RTSP的实现[D].华中科技大学硕士学位论文,2007:23.

[5]DOUGLASE.COMER and DAVID L.STEVENS.用TCP/IP进行网络互联[M].北京:电子工业出版社,2001.

[6]杨英杰.流媒体编程[J].计算机应用与软件,2007.

流媒体播放器 篇10

关键词:层次结构,嵌入式,播放器

0 引 言

随着互联网宽带技术、流媒体技术、嵌入式技术的飞速发展和用户对网络媒体资源的需求量逐渐增大, 基于IP流媒体技术的交互式网络电视得到广泛应用, 嵌入式流媒体播放器作为IPTV重要组成部分越来越引起重视[1,2]。但是当前的嵌入式流媒体播放器大多存在两个问题:第一, 虽然流媒体技术具有实时性、无需下载等待和在线播放的优点而备受青睐, 但是由于流媒体对带宽的高占有特性, 传统的C/S方式很容易导致服务器的性能瓶颈, 内容分发网络CDN由于成本高昂使服务商难以承受, 而IP组播由于其自身的限制难以在因特网中有效部署;第二, 目前市场上的很多嵌入式流媒体播放器, 如果用纯软件方法实现虽然易于升级和移植, 但实时性较差, 如果采用专用的编解码算法芯片虽能保证实时性, 但系统的灵活性太差, 不利于算法升级[7]。

文中主要将P2P思想引入到实时流媒体技术中, 通过让普通节点行使一部分服务器的功能, 使服务分散化, 能够有效减轻服务器的负载以及局部网络带宽的高消耗, 因此, P2P实时流媒体技术具有潜在广阔的应用前景。同时采用的基于TI公司专为多媒体应用而设计的芯片TMS320DM6446 (简称DM6446) 为开发平台, DM6446是目前业界公认的性能良好的媒体处理器[3,4,8]。它的完全可编程性, 使其能兼容正在发展的各种多媒体信号处理标准, 构成通用的软件平台。

本文首先提出层次化嵌入式播放器的设计方式和模块化的线程设计方式, 层次化设计的目的是保证设计结构清晰, 细化的模块化线程设计是为了达到升级容易的目的, 并且结构化的设计给出了升级接口和模块, 实现模块之间的高内聚和低耦合的特性, 有效地保证了播放器的灵活性、易移植性和易升级特性。其次本文给出了音视频流内同步和流间同步的两种方法, 从多媒体数据包的宏观和微观的角度来保证音视频在播放时同步输出。提出的滑动窗口时数据加载机制可以达到降低系统资源消耗的目的, 最后对系统进行了测试并验证了此方案的可行性。

1 播放器结构设计

1.1 层次结构

视频编码技术是很多学科互相融合借鉴的产物, 有较深的理论基础, 播放器 (内含解码器) 设计本身又是工程性, 实践性很强的工作, 一个好的播放器往往是在这两个方面都有所长或者相互平衡。播放器的设计必须综合考虑众多因素和约束, 例如使用环境和业务要求、成本、系统构建难度、底层硬件、开发平台和用户需求等等。简单来讲, 播放器是个多变量系统, 要考虑与用户的无障碍交互, 用户接口 (UI) 的设计也要符合用户操作习惯。播放器的每个层次内部也需考虑众多因素, 例如在媒体引擎部分, 码流, 图像质量, 运算复杂度是3个最基本的考虑方向, 这3个重要因素往往互为矛盾又互相影响, 实时软件播放器着眼点之一是在

这些因素之间找到平衡和折衷。播放器软件设计的指导思想是层次化和模块化。

播放器软件设计采用组件化构架, 把播放过程中的各个实现划分为功能模块, 各模块可以根据功能选择采用实际应用中比较成熟的算法和思想, 这样可以减少软件结构中的耦合, 方便算法替换和升级, 模块功能扩展和性能测试。

模块化处理可以迭代地进行, 开始的模块划分是功能之间的, 之后的模块划分是功能内部的, 即大模块内部可以继续划分子模块。比如, 在媒体引擎模块, 处理环节子模块化后, 针对视频编解码众多好的算法和设计就可以在模块的范围内进行替换和优化, 在系统基本原型搭建初始阶段, 会使用一些简单易行的算法, 粗糙的实现可以使系统工作但是可能效率低下, 达不到设计目标, 到了优化阶段, 就必须使用较复杂但可有效提升系统性能的算法, 在替换的过程中, 模块化设计保证了此过程不会对整个系统造成破坏, 同时方便对比各种算法的性能以便找到最优算法。同时应该注意不必为了模块而模块化, 一些可分可不分的功能宁愿放在一起, 以免产生调度开销和资源浪费。

播放器的逻辑结构为分层的系统结构, 便于将各层功能分离, 在每层完成独立功能。从下往上依次为数据源访问层、解码器层和用户界面层。其中数据源访问层负责媒体数据的读取, 包括本地数据和通过流媒体传输协议读取服务数据。解码器层负责各种格式媒体数据的解码, 由解码选择器和各个解码程序组成, 在用户界面层主要进行音视频的播放和控制。分层结构如图1所示。

第1层为用户界面, 这是用户与播放器的接口, 用于播放用户所请求的媒体文件或媒体流, 并允许用户对播放过程进行控制。

第2层为解码器层, 包含媒体数据的解码选择器、各种主流媒体的解码器等模块以及多元流媒体同步机制。解码选择器根据从下层接收的媒体数据 (来自本地多媒体文件或远端的P2P流媒体数据) 的头信息, 确定媒体数据的编码格式, 并选择相应的解码器。解码器将编码后的数据进行解码。对于视频数据, 解码后为位图格式:对于音频数据, 解码后为线性格式[5,6]。

第3层包括本地文件访问与流媒体数据传输两部分。前者用于读取本地的媒体文件, 后者用于访问来自P2P网络或Internet网的数据。流媒体数据传输部分包括QoS控制机制、基于各种数据传输协议的数据传输模块以及媒体数据缓冲队列。QoS控制机制根据传输过程中的网络状态信息, 与流媒体网络进行交互, 实现对媒体数据传输的QoS控制。流内同步主要用于对接收的P2P流媒体数据进行排序, 缓冲队列用于对接收到媒体数据进行缓冲, 从而减少网络传输过程中产生的抖动。数据传输模块用于实现流媒体数据的接收以及与P2P媒体文件节点消息交互。流媒体数据主要P2P流媒体传输方式和Internet网络媒体数据获取, 这样可以达到播放器的通用性。

1.2 体系结构

播放器的工作原理可以简单地描述为:首先将已下载的媒体文件取一定长度 (文件块) , 根据文件块的信息 (通常包括:文件大小、文件格式和文件类型等等) 决定播放器开哪些类型线程和初始化哪些类型的数字解码器 (DSP) , 然后取一定长度的已下载的文件数据放入播放器的内存 (Buffer) 中, 同时判断下一片数据段是否也已经被下载, 如果已经下载好了, 播放器根据文件格式调用DSP进行解码, 然后将解码后的数据流写入显示设备提供的应用程序接口 (API) 中, 终端输出设备将最后的效果播放出来。如果没有下载好, 播放器就停止等待, 一直到下一片数据段已经被下载好才开始继续播放。在整个播放过程中, 计算量最大的任务由专门的DSP完成而其他的计算任务由机顶盒的CPU完成, 这样使DSP和CPU协调工作共同完成播放任务, 其体系结构如图2所示。

通过会合同步模块 (Rendezvous utility module) 来同步各个线程的初始化和清除, 这个模块是在主线程中被初始化的。每个线程完成了初始化以后会通知会合对象, 当所有的线程都完成初始化以后, 才会同时被解锁并开始执行各自的主循环。对各个线程清除进行同步的方法是一样的。通过这种方法, 可以保证各个线程所共享的缓冲区在同一时间内只能允许一个线程使用。

2 媒体数据加载策略

数据加载器从编码的音频、语音和视频基本流中加载数据。需要注意的是加载器只是一个耦合函数, 当被线程调用时才会执行, 它本身并不是线程。加载要解决3个问题:

a) 因为应用程序使用的是基本数据流, 所以在处理帧之前, 我们没有办法知道一个编码帧的大小;

b) 当调用VISA过程函数时, 我们希望每次提供给解码器的都是一个满帧;

c) 因为解码算法决定了编码帧的实际大小, 在VISA过程调用完成之前, 我们不知道最后一帧的大小, 这将使得I/O与DSP处理的同步很难实现。

首先分配一个readBufSize为60×1024 (60 Kb) 的缓冲区, 在初始化loader时, 先读进来一个窗口大小 (即readSize) 的数据, 这个值也是可以通过打印得出的。初始化阶段还会初始化一系列的指针。完成了对loader的初始化后, 程序就会调用函数loaderGetFrame () , 每调用一次就会从源文件中读一帧的数据。图3描述了文件加载器的算法, 图3中的变量名或者是loader函数的局部变量, 或者是LoaderState结构体的一部分。

只有确保一个窗口的编码数据对解码算法可用时加载算法才会执行。对于视频的情况, 窗口的大小取决于解码器使用XDM_GETBUFINFO控制调用获得的最坏情况下编码帧的大小。对于语音和音频, 为这个窗口选择了足够的大小, 因为音频帧和语音帧的大小要远小于视频帧, 而且在同样的方式下不需要优化。

每次调用VISA过程函数时, 文件加载器要确保至少给算法提供一个编码帧 (直到没有数据为止) 。从上图中我们可以看出, 在解码的过程中, 窗口会从左向右滑动。每次调用函数loaderGetFrame ( ) , 其中的参数frameSize会表明最后一个编码帧的实际大小, 这样窗口会调用read () 函数向右移动frameSize字节, 并且返回一个新的帧指针指向至少一个编码帧大小的数据。

最后, 当spaceLeft比窗口小的时候, 加载器将会从readBuffer的开始执行, 所以我们要使用函数memcpy () 将剩下的编码数据拷贝到readBuffer的开头, 然后再调用read () 函数。其中的输入成员需要在使用这个加载器之前设置, 而输出变量是在每次调用loaderGetFrame () 之后设置的。被标志为内部的变量是不需要设置的, 下面以音频加载过程为例给出loaderPrime ( ) 和loaderGetFrame () 函数使用方法的算法伪代码:

if (loaderPrime (初始化加载数据对象, 将结构体和指针赋值) = = FAILURE) {

cleanup (退出线程) ;

}

while (是否退出) {

if (decodeAudioBuffer (解码压缩数据流) = = FAILURE) {

breakLoop (退出线程) ;

}

if (write (将解压后的raw数据写入硬件驱动接口) = = -1) {

breakLoop (退出线程) ;

}

if (loaderGetFrame (加载下一帧数据) = = FAILURE) {

breakLoop (退出线程) ;

}

if (是否数据流结束) {

if (audioDecodeAlgCreate (重造解码句柄) = = FAILURE) {

breakLoop (退出线程) ;

}

if (loaderPrime (初始化加载数据对象) = = FAILURE) {

breakLoop (退出线程) ;

}

}

gblIncSoundBytesEncoded (显示OSD解码信息) ;

}

3 音视频同步策略

在流媒体播放器的设计与实现中, 媒体流的同步问题一直是研究的重点, 通常来讲, 流媒体的同步包括两部分内容:一是流内同步;二是流间同步。互联网中传输数据包时, 不同的数据包所经过的路径可能不相同, 以至于顺序从流媒体服务器中发送出来的数据包到接收端已经无序, 因此, 流内同步是指将乱序的网络数据进行处理, 使得播放时媒体流的时基顺序与原始媒体演播的顺序一致, 即保证音频、视频这类时基媒体在播放过程中的顺序是正常的, 不能前后乱序。流间同步是指不同媒体流之间的基于时序的对应, 如声音和视频信息的同步, 即保证多个媒体流 (音频、视频) 的播放是吻合的, 根据一定的时间关系信息在媒体流间确定同步点, 将同一个发送者同时发送的多个媒体类型的媒体数据在接收方同时播放, 以实现媒体间同步。流间同步的目的是维护多个媒体流之间正确的时间对应关系, 如视频和音频流同步。与流内同步相比, 在媒体播放过程中, 流间同步显得更加复杂也更为关键, 而且它以流内同步为基础, 流媒体播放器中多个流的同步关系如图4所示。

3.1 流内同步

流内同步分为两步:一是缓冲;二是排队。由于网络数据包到达的时间间隔不尽相同, 此时若直接将接收的数据包立刻排队组帧交给流间同步模块, 将有可能造成数据帧不完整, 即使数据帧是完整的, 若没有缓冲将有可能导致播放器端画面的不连贯, 所以接收缓冲区的设计是很必要的。缓冲区的大小应由点播系统所在的网络状况决定。虽然使用接收缓冲技术会造成一定程度的播放延迟, 但只要设定大小合适的接收缓冲区, 是可以被绝大多数用户接受的。采用P2P流媒体传输协议进行传送时, 数据包的起始序列号Seq是一个以2为模的随机无符号整数, 即:Seq∈[0, 216]。基于以上的分析, 同步机制的排队策略采用升序双向循环队列作为基本数据结构, 利用该双向循环队列既可以将接收的无序的数据包重新排列, 而且对越界的处理也很简单, 即当越界后收到的下一个后续包序列号靠近序列号范围的左边界时, 将首先判断包序列号是否小于队尾序列号, 再判断是否小于队头序列号, 如果是, 就认为是越界的后续包, 将其直接插入队尾, 否则认为是一个前序包并从队尾往前虚幻搜索器正确插入位置。对于越界并乱序的情况, 将首先按越界处理, 然后再做乱序的处理, 图5给出了排队处理的判断逻辑。

3.2 流间同步

流间同步功能在流媒体播放器网络接收模块中实现, 不同于通常在播放器主控模块中实现的方式, 这种实现方法使得各个模块间的功能调用更加清晰, 此外, 由于播放器主控制块控制播放时与具体的同步实现彼此独立, 使得不同的开发者在设计同步机制时的实现及修改更加灵活。同步机制采用的是网络接收模块中的一个计时器来完成, 所以运行效率会高于将同步机制在播放器主控制模块中实现的方法。此同步机制还有一个特色, 它通过将音视频帧时间戳与系统时间相比较求取正确的解码播放时机, 使得视频流和音频流的同步基都是系统时间, 无需互相依靠, 因而当播放媒体流中只有一个视频流或者音频流时, 它们可以独立正常播放, 而不是采用通常的做法, 如:将视频数据包与音频数据包中自带的时间戳互相比较以决定音视频帧是否应该被解码, 在采用这种传统同步机制的播放器中, 流间同步往往选择视频流或者音频流之一作为同步的基准, 这样会导致视频流依赖于音频流, 或者音频流依赖于视频流, 因而当播放媒体仅有一个媒体流时, 必须增加新的同步处理操作, 这样不仅判断逻辑复杂而且容易出错。在网络接收模块的主线程中启动计时器, 每隔10 ms调用一次, 因此根据这种设计思想:

iRunTime的计算公式如下:

iRunTime= (iCurrentTime -iBeginTime) * fSpeed

其中:iBeginTime为开始播放的系统时间;iCurrentTime为当前系统时间;fSpeed为系统播放设定的速度, 正常播放速度为1, 大于1快播, 小于1慢播。

Diff_TwoFrame_Ts的计算公式如下:

Diff_TwoFrame_Ts=CurFrameTs-FirstFrameTs

其中:CurFrameTs为播放缓冲中当前数据帧时间戳;FirstFrameTs为第一个数据帧的时间戳;Diff_TwoFrame_Ts为求取当前帧和第一帧的时间戳差值, 以微秒为单位。

如果iRunTime>Diff_TwoFrame_Ts, 表明当前的取帧速度正确, 本帧可以被解码播放, 于是帧数据从播放缓冲中被读出解码。反之iRunTime≤Diff_TwoFrame_Ts, 表明当前的取帧速度已经超过了系统播放速度, 本帧还未到播放时机, 暂时不能从播放缓冲中读出解码播放。

网络接收模块主线程中设计创建了一个计时器, 每隔固定时间周期调用函数c_check_time ( ) 进行单个或多个数据流的同步判断处理。同步的逻辑判断就在该函数c_check_time () 中被实现, 它的主要功能是将系统播放时间和音视频帧时间戳分别与系统时间作比较, 若系统播放时间大于音视频帧时间戳, 表明该音视频帧应该被解码播放, 于是给相应的线程发送同步信号, 判断逻辑如图6所示。

流媒体播放器启动时在主模块创建多个媒体子线程, 且线程初始状态为阻塞, 由各个媒体子线程循环判断各自的同步信号是否到达, 若有同步信号则从数据缓冲中读出数据帧, 并放入播放缓冲中解码播放, 然后再次阻塞等待下一个同步信号到达, 如此循环, 直到播放结束或得到终止命令等情况。播放器主模块的主控制类中定义一个函数Get-Sam-pleByTrack () , 用于不断地从缓冲区中读出已经同步的应该被解码播放的当前音频帧和视频帧数据。采用以上同步机制可以保证视频音频能够按照时间戳相等的原则播放, 并且如果只有一个流, 也可以保证正常的播放。

4 结束语

本文研究了当前嵌入式技术和基于P2P流媒体技术的嵌入式播放器的发展情况, 提出了当前嵌入式播放器技术存在的两个问题, 针对提出的两个问题, 论文提出层次化嵌入式播放器的设计方式和模块化的线程设计方式, 层次化设计的目的是保证设计结构清晰, 细化的模块化线程设计是为了达到升级容易的目的, 并且结构化的设计给出了升级接口和模块, 实现模块之间的高内聚和低耦合的特性, 有效地保证了播放器的灵活性、易移植性和易升级特性, 最后论文给出了音视频流内同步和流间同步的两种方法, 从多媒体数据包的宏观和微观的角度保证音视频数据同步, 这种设计方式可以作为嵌入式流媒体播放器的一种设计参考。

参考文献

[1]贾鹏.IP机顶盒系统设计及视频解码实现[D].北京.北京工业大学, 2006.

[2]张涛.基于通用DSP实现HDTV机顶盒的研究与设计[D].天津:天津大学, 2004.

[3]DVEVM Getting Started Guide[EB/OL].2007-03.http://focus.ti.com/lit/an/spraag66c/spraag66c.pdf.

[4]DaVinciTM Technology Digital Video software DevelopmentKit[R].http://focus.ti.com/lit/ml/sprt396/sprt396.pdf.

[5]张旭东, 卢国栋, 冯健.图像编码基础和小波压缩技术[M].北京:清华大学出版社, 2004.

[6]MPEG Requirement Group.ISO/IEC 14496-12:Informationtechnology-Coding of audio-visual:Part 12-ISO base mediafile format.MPEG Document:ISO/IEC JTC1/SC29/WG11N5295, February 2003.

[7]金西, 黄汪.嵌入式Linux技术及其应用[J].计算机应用, 2000, 20 (7) :5-6.

流媒体播放器 篇11

尽管与aigo上一代PMP产品MP-F335相比UM-P881在功能上有了很大提高,但在外形设计上则没有明显改变,甚至在部分设计上还有些许退化。首先,UM-P881整体尺寸相对MP-F335有所减小,但厚度明显有所增大,我们认为这应当是采用了2.5英寸硬盘所致,尽管现在市场上很多产品仍然在采用相同规格的产品,但很多国际厂商为了更好控制体积以及能耗,已经开始在PMP播放器上大量采用1.8英寸硬盘,因此这可算作UM-P881的一个美中不足之处;另外UM-P881取消了多功能方向键设计,用户移动光标只能通过机身右侧的“上、下”方向键进行操作,尽管可以完成操作,但着实有些不方便。

支持RMVB文件播放显然是UM-P881最令人期待的功能,这极大地拓宽了用户获取视频资源的渠道。想一下,以前如果你希望在PMP上播放RMVB文件时必须通过冗长的视频转制过程方可实现,而现在你可以直接获得大量的RMVB文件并直接将其存储在播放器内播放。

UM-P881最大可以支持码率600Kbps、640x360@25fps规格的RMVB文件,而且从测试来看它的确可以播放RM/RMVB格式的视频文件,但在播放高码率文件时仍会出现滞顿,因此为更好的体现RMVB播放器的特点,我们认为UM-P881的处理能力还有必要进一步加强,因为滞顿的问题同样出现在播放Divx/Xvid格式文件时。与之前aigo推出的其他型号的PMP播放器一样,UM-P881也可以很好的支持SRT格式的外挂字幕,并允许用户对字幕位置、体积透明度进行自定义。

除了视频播放能力外,UM-P881还具备播放多种其他类型媒体的能力,例如播放MP3音乐、欣赏照片、电子书以及音频录制与AV输出能力,当然作为对以往经典功能的延续,UM-P881同样具备Flash文件播放能力,这一点对于喜欢创作Flash的朋友来讲无疑是一个好消息,现在你可以随时将作品展示给更多的朋友。

浅谈使用VB制作多媒体播放器 篇12

Visual Basic 6.0提供了各种多媒体播放控件:Media Player控件、ShockwaveFlash控件和Animation控件等。这些控件可以播放常见的音频、视频等多媒体文件。这3种多媒体控件都属于ActiveX控件, 每次创建工程后, 要将其添加到工具箱中。在“工程”菜单中单击“部件…”菜单项, 则会打开“部件”对话框, 选择合适的多媒体控件对应的部件名, 即可将该多媒体控件添加到工具箱中。

3种多媒体控件所在的部件名如表1所示。

2、Media Player控件

Media Player控件可以播放WAV, MP3, WMA, DAT, MPG等多媒体文件。

2.1 Media Player控件常用的属性和方法

Media Player控件常用的属性有URL等, 常用的方法有openPlayer, Close等。

2.2 实例

【例1】利用Media Player控件制作自己的多媒体播放器, 可以播放音乐和VCD视频。

实现过程如下:

(1) 界面设计。

新建一个标准EXE工程, 添加一个Media Player控件, 把它的名称改为MediaPlayer1, 然后添加一个Common Dialog控件和三个命令按钮。界面如图1所示。

(2) 代码设计。

运行程序, 单击“打开”按钮打开一个多媒体文件, 就可播放该文件。

3、ShockwaveFlash控件

ShockwaveFlash控件可以播放SWF动画文件。

3.1 ShockwaveFlash控件常用的属性和方法

ShockwaveFlash控件常用的属性有Movie等, 常用的方法有Play, Stop, Forward, Back等。

3.2 实例

【例2】利用ShockwaveFlash控件制作可以播放Flash动画 (*.swf) 的播放器。

实现过程如下:

(1) 界面设计。

新建一个标准EXE工程, 添加一个ShockwaveFlash控件、一个Common Dialog控件和四个命令按钮。界面如图2所示。

(2) 代码设计。

运行程序, 单击“打开”按钮打开一个SWF动画文件, 就可播放该文件。单击“停止”按钮, 则停止播放该文件。单击“播放”按钮, 可从停止的地方继续播放该文件。

4、Animation控件

Animation控件可以播放无声的视频动画AVI文件。

4.1 Animation控件常用的属性和方法

Animation控件常用的属性有AutoPlay, BackStyle Center等, 常用的方法有Open, Play, Stop, Close等。

4.2 实例

【例3】利用Animation控件制作可以播放无声动画 (*.avi) 的播放器。

实现过程如下:

(1) 界面设计。

新建一个标准EXE工程, 添加一个Animation控件、一个Common Dialog控件和四个命令按钮。界面如图3所示。

(2) 代码设计。

运行程序, 单击“打开”按钮打开一个avi文件, 然后单击“播放”按钮, 就可播放该文件。

5、结束语

Media Player控件既可以播放WAV, MP3, WMA等音频文件, 也可以播放DAT, MPG, AVI等视频文件, 功能较强大, 使用很方便。ShockwaveFlash控件可以播放SWF动画文件。Animation控件可以播放无声的视频动画AVI文件。我们可以根据需要, 选择合适的控件播放多媒体文件。

参考文献

[1]张建辉.Visual Basic从初学到精通[M].北京:电子工业出版社, 2010.

[2]陈业斌.巧用VB的ActiveMovie控件制作视频播放器[J].电脑编程技巧与维护, 2001, 04.

上一篇:杀毒系统下一篇:经食道心房调搏术