基于Symbian平台的流媒体播放器设计与实现*

2010-06-13 11:33罗明珊袁梦龙
微处理机 2010年3期
关键词:音频文件流式播放器

罗明珊,武 茜,袁梦龙,张 琳

(北京邮电大学先进网络技术实验室,北京100876)

1 引言

继语音通话、短信服务、数据通信之后,音乐无线下载及实时播放正在成为全球手机运营商提供的新兴服务之一,引发广泛的关注。与传统的基于个人电脑的音乐播放器相比,手机音乐播放器的优势在于其下载和播放方式的方便快捷,可以给用户带来轻松舒适的使用体验。以手机音乐播放器为媒介,运营商可以依靠其自身对移动通信网络服务的强大控制力,为顾客提供更好的服务。由于移动通信服务的灵活性和多样性,使其在增值业务方面也有较强的扩展性。

Symbian S60平台的MultimediaFramework(MMF)[1]API可以为上层应用程序提供多媒体服务,为用户创建和分发丰富多彩的音乐应用。作为一个多媒体处理单元的插件集,MMF提供了操作终端硬件的通用接口,支持不同的音频操作,可实现本地回放和流式回放两种模式,可播放多种音频格式。

在现有基于Symbian OS的多媒体播放器的相关文献中,讨论了基于Symbian平台的流媒体播放器移动客户端的设计原理[2],给出了指导性意见,并在结构、缓冲等方面给出了优化建议,在此基础上提出了用户界面的设计方案。但该文献没有给出多媒体技术的具体实现。本文设计并实现了基于Symbian平台的多媒体播放器[3],但其仅支持本地播放,并没涉及到流式播放的相关技术。

MMusic是一款基于MMF架构,用于播放多种音乐文件的多媒体播放软件。它不仅实现了音乐文件的本地播放,同时支持流式播放。除此之外,该音乐播放器还支持音乐下载、歌词下载及播放同步等功能。其界面美观、操作简单且具有多种功能。

2 系统总体框架设计

在设计系统框架时,首先明确了播放器需要实现的四项基本功能:①支持mp3、wmv、aac等多种格式的本地音频播放;②支持流式音频播放;③支持歌曲搜索及下载的功能;④支持歌词同步的功能。

MMusic播放器的程序实现基于Symbian S60平台的应用程序架构,采用多视图框架,根据不同的功能构造不同的视图。其视图包括播放界面(主界面)、搜索歌曲界面、音乐媒体库界面和电台列表界面。其中播放界面是整个播放器的核心界面,主要负责音频媒体的播放,包括本地播放和流式播放。根据播放模式的不同,动态选择相应的菜单和播放引擎。本地播放使用CPlayerAdapter引擎。该引擎使用音频播放类CMdaAudioPlayerUtility类及其相关的观察器MMdaAudioPlayerCallback来实现本地音频播放。流式播放则使用CPluginAdaper引擎来实现,它使用了 CMdaAudioOutputStream和 MMda AudioOutputStreamCallback类。

MMusic音乐播放器按功能可划分为六个模块:①UI模块,负责各个界面显示和界面间的切换,并对用户按键进行处理;②本地播放模块,可以提供本地音频文件播放及音量控制等服务;③流式播放模块,实现与服务器的交互与流式播放;④数据下载模块,负责音频数据的下载及存储;⑤歌词同步模块,保证音频播放与歌词播放的同步;⑥服务器模块,提供音乐文件和歌词等下载资源。不同模块的关系如图1所示。

图1 MMusic播放器功能关系图

3 关键技术的介绍

3.1 音频播放

音频播放功能可以通过MMF所提供的接口来实现。其中音频播放类CMdaAudioPlayerUtility类提供本地播放的API,而CMdaAudioOutputStream类则提供流式播放的 API[4]。

3.1.1 本地播放引擎

MMusic播放器把对音频文件的初始化、播放、暂停等操作封装在本地播放引擎CPlayer-Adapter中。该引擎包含支持音频回放操作和简单元数据读取操作的音频播放类CMdaAudio-PlayerUtility。由于它的所有操作都是异步的,需要一个客户端来监听音频播放操作。播放引擎CPlayerAdapter须继承MMdaAudioPlayerCallback接口类。该接口类提供了两个方法,MapcInitComplete()和MapcPlayComplete()。本地播放流程如图2所示。首先通过调用CMdaAudioPlayerUtility::NewFilePlayerL()函数构造并创建一个音频播放器的实例。当打开及初始化一个音频采样的工作结束后,系统自动调用MapcInit-Complete()方法,通知客户端创建实例的结果。若成功创建,则可调用 CMdaAudioPlayerUtility::Play()方法来播放音频文件。当播放某段音频采样操作完成后,系统再通过MapcPlayComplete()回调函数通知客户端播放已完成。

3.1.2 流式播放引擎

对于流式音频播放,则使用多媒体框架的CM-daAudioOutputStream API。CPluginAdaper为封装好的流式播放引擎,由它来调用流媒体播放的相关接口。本地内容播放和流式播放的主要不同在于文件打开方式、初始化方法及对音频数据流的处理方式。

要实现流式播放,在程序里需要编写一个实现了MMdaAudioOutputStreamCallback的客户端类。这个类提供三个回调函数,向客户端提示音频输出的流式过程结果,让程序能处理可能的错误。这些回调函数是MaoscOpenComplete()、MaoscBufferCopied()及 MaoscPlay-Complete(),它们都必须由CMdaAudioOutputStream类的使用类实现。因此,CPluginAdaper须继承观察类MMdaAudioOutputStreamCallback来得到流式播放过程的结果。

图2 本地播放流程图

在实现流式播放前,需要与服务器进行连接,获得待播放的音频数据流。在MMusic播放器里,使用套接字来实现服务端与客户端的通信。客户端首先需要连接到Symbian OS套接字服务器,然后打开一个套接字并指定TCP作为传输协议。接着从列表文件得到服务器的IP地址和端口,向服务器发送请求。等服务器作出响应后,读取响应的数据并进行分析,用来初始化播放引擎。客户端继续对服务端请求播放的音频数据。

得到要播放的音频数据流后,则开始流式播放。其播放流程如图3所示。首先初始化CMdaAudioOutputStream类。初始化完成后,Multimedia框架会调用MaoscOpenComplete()回调函数,指出音频输出已经可用。该框架所给出的参数是一个出错值,它指出初始化是否成功。如果成功,则给出 KErrNone。此处可以设置采样率和音量等。成功初始化后,则可以在客户端调用PlayL()函数来播放音频数据流。它调用FillBufferL()函数把数据往缓冲区填充,并使用CMdaAudioOutputStream::WriteL(const TdesC8&aData)进行播放。其中参数aData为缓冲区数据。WriteL()是一个异步函数。当复制了描述符aData中的数据到音频硬件之后,该框架将调用 MMda AudioOutputStreamCallback::MaoscBufferCopied()回调方法,通知客户端应用已收到aData并将其复制到播放流。此时,可以再调用FillBufferL()函数继续填充缓冲区,从而实现连续不断地流播放。

图3 流式播放流程图

3.2 音频文件下载及断点续传

MMusic使用超文本传输协议HTTP来实现音频文件和歌词的下载。HTTP是在TCP/IP协议上实现的应用层协议,用于在互联网上传输信息。它使用Socket在服务器和客户端之间进行数据传输。在Symbian OS版本中,提供了对HTTP客户端的API支持。

使用HTTP进行通信时,客户端需要建立一个HTTP客户端会话,在会话上处理与HTTP服务器的通信。在会话上建立HTTP通信事务,事务由请求和响应组成,在同一个会话上可以建立一个或多个事务。也可以同时建立多个会话,来实现不同的连接。

在创建HTTP引擎时,首先创建一个RHTTPSession类的对象,然后调用该类的Open()方法,打开这个新建立的会话。然后使用RHTTPTransaction类代表HTTP事务。事务是在HTTP客户端会话打开的。打开事务时,需制定事务使用的数据传输方法,GET或POST,同时传入要打开的URL。服务端处理完成后,返回响应数据。HTTP客户端通过对MHTTP-TransactionCallback的回递,处理响应结果和接收响应数据[5]。

歌曲的下载分两步来实现。首先把要搜索的歌曲名字用HTTP引擎发送到服务器,服务器返回XML格式的文件给客户端。该XML文件包含了搜索到的歌曲名字、下载地址、音频文件格式和大小等信息。客户端用Symbian自带的 XML解析器对文件进行解析,把解析后的歌曲信息存放在数组里。每个数组的元素为自定义的结构体,包含歌曲名,下载地址等内容。

解析完毕后,切换到列表界面。列表界面显示刚下载的XML文件的解析结果。用户可以根据自己的喜好选择要下载的歌曲。此时,客户端提取出歌曲下载的地址,用封装好的HTTP引擎向服务器发送下载请求。客户端首先判断待下载的文件是否已存在,如果不存在,则使用HTTP引擎普通下载模式下载音频文件。如果待下载的文件已存在,则获得现有文件大小,并把它作为参数传给HTTP引擎,发送到服务器端,实现断点续传。具体代码如下:

void CHTTPEngine::CountinueDownloadL(const TDesC8& aUri,TInt aStart){

TBool iBool=SetupConnectionL();

if(iBool==1){

TUriParser8 uri;//分析传入的URL地址

uri.Parse(aUri);

//从HTTP会话的字符串缓冲池中取出GET方法的字符串表示

RStringF method = iSession.StringPool().StringF(HTTP::EGET,RHTTPSession::GetTable());

//在HTTP会话上打开一个事务,传入URL、事务回调的引用、数据传输方法

iTransaction=iSession.OpenTransactionL(uri,*this,method);

RHTTPHeaders hdr=iTransaction.Request().GetHeaderCollection();//设置请求消息的消息头

SetHeaderL (hdr, HTTP::EUserAgent,KUserAgent);

SetHeaderL(hdr,HTTP::EAccept,KAccept);

TBuf8<100> rangeBuf;

rangeBuf.Copy(KDataRange);

rangeBuf.AppendNum(aStart);

rangeBuf.Append(KTo);

SetHeaderL(hdr,HTTP::ERange,rangeBuf);//把文件下载的起始位置添加到消息头,实现断点续传

iTransaction.SubmitL();//提出请求

}}

3.3 歌词同步

首先在用户终端进行本地搜索与正在播放的音乐文件名字相同的歌词文件。若搜索到符合条件的文件,则对其进行解析。把文件的每一行内容作为一个数组单元存放在数组里,数据的单元包括有播放时间和歌词内容。由CMdaAudioPlayerUtility类的GetPosition()函数获得当前音频文件的播放位置,与数组中记录的歌词文件的时间做对比,来实现歌词同步。若没有搜索到歌词文件,则用歌词下载引擎从服务器下载并解析。

4 软件实现及效果

根据播放器的整体架构设计,在Symbian平台上实现音乐媒体播放器,并在实际的移动通信网络中进行了测试。测试环境是中国移动GPRS/EDGE网络。测试手机为Nokia N95,操作系统为V9.2,用户界面为S60第三版。其ARM主频11 332MHz,内存160MB。在真机上进行测试时,本地音频文件播放流畅。而播放在线电台的内容时(即流式播放),其效果会受到网络状况的制约,但整体比较流畅。播放器在真机上的效果如图4所示。其中(a)显示的是播放器的功能菜单,(b)为本地播放和歌词同步的效果,(c)显示流式播放时连接服务器的状态,(d)为连接服务器成功后流式播放的效果,界面上可以显示当前的连接速度、音频文件的格式、流量等。

图4 软件效果图

5 结束语

MMusic音乐播放器很好的实现了音频播放、音乐下载、歌词同步等功能。在此基础上,还可以增加一些音频的效果,使用户有更好的视听感受。同时在歌词同步方面,程序还可以增加调整歌词的功能,当出现歌词不同步时,用户可以根据实际情况进行调整。

[1]Leigh Edwards Richard Barker.Series 60应用程序开发[M].北京:人民邮电出版社,2006.

[2]夏涛,简洪波.基于Symbian平台的移动流媒体客户端设计[J].微处理机,2008,29(3):76-78.

[3]袁静.基于SymbianOS的移动多媒体软件平台的研发与应用[D].四川:电子科技大学,2008.

[4]侯茂清.Symbian手机应用开发[M].北京:人民邮电出版社,2009.

[5]Lain Campbell.Symbian OS通信编程[M].北京:人民邮电出版社,2009.

猜你喜欢
音频文件流式播放器
流式大数据数据清洗系统设计与实现
辐流式二沉池的结构优化研究
Walkman诞生40周年 索尼适时发布NW-ZX500和NW-A100系列播放器
音频录编任我行
基于STM32的MP3播放器设计
Moon ACE播放器/放大器一体机
基于Android手机的音频文件取证技术研究
微球测速聚类分析的流式液路稳定性评估
播放器背板注塑模具设计
提取APP中的音频文件