微波EDA网,见证研发工程师的成长!
首页 > 应用设计 > 消费类电子 > 基于Symbian平台的流媒体播放器关键技术简介

基于Symbian平台的流媒体播放器关键技术简介

时间:03-01 来源:3721RD 点击:

了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中的数据到音频硬件之后,该框架将调用MMdaAudioOutputStreamCallback: : 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 的回递,处理响应结果和接收响应数据。

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

每个数组的元素为自定义的结构体,包含歌曲名,下载地址等内容。

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

3. 3 歌词同步

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

4 软件实现及效果

根据播放器的整体架构设计,在Symbian 平台上实现音乐媒体播放器,并在实际的移动通信网络中进行了测试。测试环境是中国移

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top