基于Symbian平台的流媒体播放器设计与实现
其播放流程如图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 引擎,发送到服务器端,实现断点续传。具体代码如下:
评论