历史上的今天
返回首页

历史上的今天

今天是:2025年02月19日(星期三)

正在发生

2018年02月19日 | 基于Symbian平台的流媒体播放器关键技术简介

2018-02-19 来源:eefocus

1 引言

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

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

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

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

2 系统总体框架设计

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

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

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

MMusic 音乐播放器按功能可划分为六个模块:

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


图1 MMusic 播放器功能关系图

3 关键技术的介绍

3. 1 音频播放

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

3. 1. 1 本地播放引擎

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

3. 1. 2 流式播放引擎

对于流式音频播放,则使用多媒体框架的CMdaAudioOutputStreamAPI。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中的数据到音频硬件之后,该框架将调用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 平台上实现音乐媒体播放器,并在实际的移动通信网络中进行了测试。测试环境是中国移动GPRS /EDGE网络。测试手机为Nokia N95,操作系统为V9. 2,用户界面为S60 第三版。其ARM 主频11 332MHz,内存160MB。在真机上进行测试时,本地音频文件播放流畅。而播放在线电台的内容时( 即流式播放) ,其效果会受到网络状况的制约,但整体比较流畅。

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


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

图4 软件效果图

5 结束语

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


推荐阅读

史海拾趣

Chipcon AS公司的发展小趣事

在电子行业的初期,Chipcon AS公司凭借其一款创新的低功耗无线通信芯片,迅速在市场中崭露头角。这款芯片以其卓越的性能和稳定的表现,赢得了众多客户的青睐。公司通过不断优化产品设计和生产工艺,逐步提高了生产效率,降低了成本,进一步巩固了市场地位。随着无线通信技术的快速发展,Chipcon AS公司不断推陈出新,成功抢占了行业制高点。

Bourns公司的发展小趣事

Bourns公司的卓越表现得到了全球知名代理商TTI, Inc.的认可。Bourns连续多年获得TTI全球运营卓越奖,这一奖项是对Bourns全球绩效的最高认可。这一成就不仅彰显了Bourns在全球电子组件市场的领导地位,也反映了其持续提供优质产品和服务的承诺。

Alan Industries Inc公司的发展小趣事

为了进一步提升竞争力,Alan Industries Inc.积极寻求与其他企业的战略合作。公司与多家知名供应商建立了长期稳定的合作关系,确保了原材料的稳定供应和成本控制。同时,公司还通过并购和投资等方式,整合了产业链上下游资源,形成了完整的产业生态圈。这些战略举措使得公司在市场竞争中更具优势,实现了快速发展。

GeneSiC公司的发展小趣事

随着产品技术的不断提升,Alan Industries Inc.开始积极拓展市场。公司制定了详细的市场营销策略,通过线上线下的多渠道推广,成功将产品打入国内外市场。同时,公司还注重品牌建设,通过优质的产品和服务赢得了消费者的信任和口碑。随着品牌知名度的提升,公司的市场份额不断扩大,成为电子行业中的佼佼者。

Astec [Astec America, Inc]公司的发展小趣事

面对数字化转型的大趋势,Astec也积极拥抱变革。公司加大了对信息技术和智能制造的投入,通过引入先进的生产管理系统和数据分析工具,提高了生产效率和产品质量。同时,Astec还积极探索新的商业模式和销售渠道,以适应数字化时代的市场需求。展望未来,Astec将继续坚持创新驱动的发展理念,不断推动公司在电子行业中的持续发展。

这五个故事基于Astec America, Inc在电子行业发展的主要阶段和事件进行编写,旨在客观描述公司的发展历程和重要成就。请注意,这些故事可能无法涵盖公司发展的所有细节,但能够提供一个大致的框架。

AMSCO [Austria micro systems AG]公司的发展小趣事

面对数字化转型的大趋势,Astec也积极拥抱变革。公司加大了对信息技术和智能制造的投入,通过引入先进的生产管理系统和数据分析工具,提高了生产效率和产品质量。同时,Astec还积极探索新的商业模式和销售渠道,以适应数字化时代的市场需求。展望未来,Astec将继续坚持创新驱动的发展理念,不断推动公司在电子行业中的持续发展。

这五个故事基于Astec America, Inc在电子行业发展的主要阶段和事件进行编写,旨在客观描述公司的发展历程和重要成就。请注意,这些故事可能无法涵盖公司发展的所有细节,但能够提供一个大致的框架。

问答坊 | AI 解惑

怎么仿真MAX485的双路备份通讯系统?

大家好,我想仿真下MAX485多点通信,通讯网路上连接4个485芯片(编号为1、2、3、4),其中,1和2构成一路主从,3和4构成一路主从,当1和2通讯时,3和4不通讯;反之,3和4 通讯时,1和2 不通讯(此时1和2不加电,作为备份用)。但是有个问题,4个MAX ...…

查看全部问答>

[销售]进口瑞侃Raychem阻燃电线2.5平方

名称:瑞侃RAYCHEM阻燃电线 型号:FLDWC0311-2.50 规格:2.5平方 数量:10000米 单价:6元/米 邮费:买家自理 详细见图: …

查看全部问答>

LED使用寿命

LED在一般说明中,都是可以使用50,000小时以上,还有一些生产商宣称其LED可以运作100,000小时左右。这方面主要的问题是,LED并不是简单的不再运作而已,它的额定使用寿命不能用传统灯具的衡量方法来计算。实际上,在测试LED使用寿命时,不会有人一 ...…

查看全部问答>

LED不是梦,LED 投影钟价格才十元

起码创意是咱DIY可以学学的 …

查看全部问答>

核磁共振对人有危害吗?

谁能脱口而出得出答案? 来看看专业解释: 核磁共振成像是利用电子计算机对人体断面进行图像分析诊断的检查方法,它不用X线,而是磁场,其基本原理是人体所含氢原子在强磁场下给予特定的高波后会发生共振现象,产生一种高波数的电磁波。核磁共振 ...…

查看全部问答>

关于学电子的教材问题

想学好电子技术,希望各位介绍些好的教材.谢了!…

查看全部问答>

请教串口程序问题

#include #define uchar unsigned char #define uint unsigned int unsigned char flag,a,i; uchar code table[]=\"I get \"; void init() {         TMOD=0x20;     //确定T1的工作方式     & ...…

查看全部问答>

CAB打包dll文件

请问,如果想把dll文件打包到CAB包中,应该如何编写inf文件…

查看全部问答>

"经典的DSP的C程序和汇编程序库/常用例程"——学习资料!!

http://sanhengxing.com/xzindex.asp 还有其他的关于等等单片机的资料,不知道有没有需要的,大家去看看吧! 关于 DSP DSP(digital singnal processor)是一种独特的微处理器,是以数字信号来处理大量信息的器件.其工作原理是接收模拟信号,转换为 ...…

查看全部问答>

EE_FPGA基础教程系列 --NO.2-- 建立第一个Quartus工程

[ 本帖最后由 xieqiang 于 2011-5-12 11:26 编辑 ]…

查看全部问答>