symbian文章播放器_Symbian平台上实现流媒体播放器

1导言

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

在现有的基于Symbian OS的多媒体播放器文献中,论述了基于Symbian平台的流媒体播放器移动客户端的设计原理,给出了指导性意见,并在结构和缓冲方面给出了优化建议,在此基础上提出了用户界面的设计方案。然而,该文件没有给出多媒体技术的具体实现。本文设计并实现了一个基于Symbian平台的多媒体播放器,但是它只支持本地播放,并没有涉及流媒体播放的相关技术。

MMusic是一款基于MMF架构的多媒体播放软件,用来播放各种音乐文件。它不仅实现了音乐文件的本地播放,还支持流媒体播放。此外,音乐播放器还支持音乐下载、歌词下载和播放同步。它界面美观,操作简单,功能多样。

2系统总体框架设计

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

MMusic player的程序实现了基于Symbian S60平台的应用架构,采用多视图框架根据不同的功能构造不同的视图。其视图包括播放界面(主界面)、搜索歌曲界面、音乐媒体库界面和电台列表界面。播放界面是整个播放器的核心界面,主要负责播放音频媒体,包括本地播放和流式播放。

根据不同的播放模式,动态选择相应的菜单和播放引擎。本地播放使用CPlayerAdapter引擎。该引擎使用音频播放类CMdaAudioPlayerUTIlity类及其相关的观察器MMdaAudioPlayerCallback来实现本地音频播放。流是通过使用CPluginAdaper引擎实现的,该引擎使用CMdaAudioOutputSTream和MMdaAudioOutputStreamCallback类。

MMusic音乐播放器根据其功能可分为六个模块:

UI模块,负责各个界面的显示和界面之间的切换,处理用户按键;本地播放模块,可以提供本地音频文件播放和音量控制服务;流媒体播放模块,实现与服务器的交互和流媒体播放;数据下载模块,负责下载和存储音频数据;歌词同步模块,保证音频播放和歌词播放同步;服务器模块,提供音乐文件、歌词等下载资源。不同模块之间的关系如图1所示。

图1多媒体播放器功能关系图

3关键技术介绍

3.1音频播放

通过MMF提供的接口可以实现音频播放功能。其中,音频播放类CMdaAudioPlayerUtility类提供本地播放的API,CMdaAudioOutputStream类提供流播放的API。

3.1.1个本地播放引擎

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

3.1.2流式播放引擎

对于流式音频播放,我们使用开放核心的CMdaAudioOutputStreamAPI。CPluginAdaper是一个打包的流媒体引擎,调用流媒体播放的相关接口。本地内容播放和流式播放的主要区别在于文件打开方式、初始化方式和音频数据流的处理方式。

要实现流式播放,需要在程序中编写一个实现MMdaAudioOutputStreamCallback的客户端类。

这个类提供了三个回调函数来提示客户端音频输出的流处理结果,以便程序可以处理可能的错误。这些回调函数是MaoscOpenComplete()、MaoscBufferCopied()和MaoscPlay-Complete(),它们必须由CMdaAudioOutputStream类的usage类实现。因此,CPluginAdaper必须继承观察类MMdaAudioOutputStreamCallback才能获得流式回放过程的结果。

图2本地回放流程图

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

得到要播放的音频数据流后,开始流式播放。

播放过程如图3所示。首先初始化CMdaAudioOutputStream类。初始化完成后,多媒体框架将调用MaoscOpenComplete()回调函数,指示音频输出可用。框架给出的参数是一个错误值,表示初始化是否成功。如果成功,就给KErrNONe。在这里你可以设置采样率,音量等等。初始化成功后,可以在客户端调用PlayL()函数来播放音频数据流。它调用FillBufferL()函数用数据填充缓冲区,并通过使用cmdaaudioutputstream:writel(constdes c8 adata)来播放它。其中参数aData是缓冲数据。

WriteL()是一个异步函数。当描述符aData中的数据被复制到音频硬件时,框架将调用mmdaaudioutputstreamcallback:MaocBufferCopied()的回调方法来通知客户端应用程序aData已被接收并复制到播放流中。此时,可以调用FillBufferL()函数继续填充缓冲区,从而实现连续流。

图3流式播放流程图

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

MMusic使用超文本传输协议HTTP来下载音频文件和歌词。HTTP是基于TCP /IP协议的应用层协议,用于在互联网上传输信息。它使用套接字在服务器和客户端之间传输数据。

在Symbian OS版本中,提供了对HTTP客户端的API支持。

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

创建HTTP引擎时,首先创建一个RHTTPSession类的对象,然后调用该类的Open()方法打开新建立的会话。然后使用RHTTPTransaction类来表示HTTP事务。事务是在HTTP客户端会话中打开的。在打开一个事务的时候,需要让事务使用的数据传输方法,GET或者POST,传入要打开的URL。服务器完成处理后,返回响应数据。HTTP客户端处理响应结果,并通过对MHTTP-TransactionCallback的反馈接收响应数据。

歌曲的下载分两步实现。首先通过HTTP引擎将待搜索的歌曲名称发送给服务器,服务器将XML格式的文件返回给客户端。XML文件包含搜索到的歌曲名称、下载地址、音频文件格式和大小。客户端使用Symbian自己的XML解析器来解析文件,并将解析后的歌曲信息存储在数组中。

每个数组的元素都是用户自定义的结构,包括歌名、下载地址等等。

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

3.3歌词的同步

首先,在用户终端上本地搜索与正在播放的音乐文件同名的歌词文件。如果找到一个合格的文件,它将被解析。将文件的每一行作为数组单元存储在数组中,数据单元包括播放时间和歌词内容。通过CMdaAudioPlayerUtility类的GetPosition()函数获取当前音频文件的播放位置,并与数组中记录的歌词文件的时间进行比较,实现歌词同步。如果没有找到歌词文件,歌词下载引擎将从服务器下载歌词文件并进行分析。

4软件实现及效果

根据播放器的总体架构设计,在Symbian平台上实现了音乐媒体播放器,并在实际的移动通信网络中进行了测试。测试环境是中国移动GPRS /EDGE网络。测试手机是诺基亚N95,操作系统是V9。2,而且用户界面是S60第三版。它的ARM频率为11 332MHz,内存为160MB。在真机上测试时,本地音频文件播放流畅。不过在播放在线电台的内容(也就是流媒体)时,效果会受到网络条件的限制,但总体还是比较流畅的。

播放器在真机上的效果如图4所示。其中,(a)显示播放器的功能菜单,(b)显示本地播放和歌词同步的效果,(c)显示流媒体播放时连接服务器的状态,(d)显示连接服务器成功后流媒体播放的效果。界面可以显示当前的连接速度,音频文件的格式,流量等等。

(a)播放器功能菜单(b)本地播放和歌词同步的效果(c)流媒体播放时连接服务器的状态(d)成功连接服务器后流媒体播放的效果。

图4软件效果图

5结束语

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