微波EDA网,见证研发工程师的成长!
首页 > 应用设计 > 消费类电子 > UPnP媒体播放器的研究与实现

UPnP媒体播放器的研究与实现

时间:11-20 来源:与非网 点击:

extern void Decode(int*Dposition):当外界调用该函数时开始解码,Dposition则指示对应于公共缓冲区的解码位置。

  此外还有pause,resume,stop等函数,均对应于原播放器的相应功能。将已实现的媒体解码库添加到生成的UPnP框架,再在UPnP框架中相应的位置调用库文件中的函数以实现解码、播放控制。

  3.3 播放控制功能实现

  添加媒体解码库后。还需添加:数据流实时控制能力、根据播放器的状态发布消息。详细过程如下:

  (1)设置传输地址当控制节点从媒体服务器选定一首歌时,则触发设置传输地址(由媒体传输服务提供)这一动作。这时,如果播放器正在播放,首先要停止播放器的解码动作,为新歌曲的播放做准备。接下来,在播放器获得所选定歌曲的地址后(由控制节点提供),直接从媒体服务器中下载这首歌曲,在此项目中,播放器采用HTTP GET下载。下载前,还需对该URL进行判断,查看下载的是否为播放列表,如果是播放列表,就不能将其直接传给播放器,而要继续从播放列表提供的地址中得到第1首歌的URL,再从媒体服务器中下载。最后,调用函数SetLastChange发布自己的状态信息。

  (2)数据流实时控制在下载的大小达到一定长度时,触发传输控制服务中Play这一动作,这时,主线程创建一个解码线程,该线程调用媒体解码库中的 decodestart(char*pBuffer)函数,对存放在公用缓冲区中的数据进行解码并播放,进行同步控制,以免当网络出现拥塞或系统内存不足时,缓冲区中的播放指针超过下载指针而导致意外。如果选定的是含有多首歌曲的播放列表,则过程类似,只不过在一首歌曲播放完时会自动从媒体服务器端下载另一首歌曲,一边下载,一边播放。当用户点击next,previous时,首先检查之前保存的URL是否为播放列表,若不是,则输出错误信息;若是,则停止播放器的解码动作,撤销当前解码线程,为新歌的播放做准备。由播放列表得到下一首歌的地址和端口号,开始下载数据,并创建新的解码线程,最后,发布状态信息。

  所有的实际操作,如play,stop,pause,…,均与UPnP无关,它只实现消息传递。控制节点负责接收命令传递给播放器,再由播放器中的媒体解码库完成解码、播放、暂停、停止等功能。媒体服务器、控制节点、媒体播放器的互动如图1所示。

  4 测试与分析

  系统开发完成后,在两台同处于一个局域网的台式机上进行测试,测试流程如下:首先在一台机上启动Intel UP-nP工具集中的AVWizard程序,该程序其实就是媒体服务器和控制节点的合体,它既能提供媒体服务器的各种功能,也可提供控制点的功能。在另一台机上启动媒体播放器,AVWizard首先扫描网络中有无它所支持的设备,发现媒体播放器后,获得该播放器的设备描述文档,并显示播放器的名称。用 AvWizard选定一首MP3,并将地址发送给指定的媒体播放器(UPnP MediaRender)。播放器开始从媒体服务器指定的地址下载MP3,下载到一定长度时开始播放,详细过程描述如下:

  由图2可知,当AVWizard选定一首歌曲时,播放器输出为:"Invoke:UPnPAVTransport_SetAVTransportURI…"。触发播放器中媒体传输服务中的设置传输地址这一动作.告诉播放器所需下载的媒体所在的URL和端口号,接着在AV Wizard中点击play时,可以看到图3中播放器输出为:"Invoke:UP-nPAVTransport_Play(0,1)",触发播放器媒体传输服务中的play动作,开始下载要播放的内容,同时,播放器开始创建解码线程,输出:"Create thread success!!",则表示解码线程创建成功,在该解码线程中调用媒体解码库中的函数。媒体解码库出:"…The main proccess start…player_init",初始化媒体解码库,解码并开始播放音乐。

5 结论

  由此可见,该媒体播放器实现成功,但存在不足之处:由于直接在Intel公司开源UPnP开发工具DeviceBuilder生成的代码上进行开发,所以界面不够友好。实现媒体播放器的创新点如下:(1)直接在Intel生成的UPnP框架上进行开发,与现有的许多使用开源UPnP SDK开发相比,无需进行设备初始化和注册工作,亦无需对UPnP的工作过程进行手动操作,使开发者的注意力可以完全集中在所需添加的服务上,无需关注繁琐的协议通信细节,简化UPnP应用的设计开发;但缺点是由于目前业界有许多SDK开发包具有类似的功能,直接使用生成的UPnP框架不利于按需更换协议库。(2)可在不同的操作系统上生成相应的协议框架,屏蔽开发平台的差异,方便开发人员在合适的平台上实现所需的服务。(3)服务本身也可以作为模块添加到应用程序中,如媒体解码库就是作为一个独立的模块添加,实现松散耦合的应用程序和组件,可根据不断变化的情况和需求来实现服务,为媒体播放器的功能扩展提供了很好的基础。 (编辑:吕勇)

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

网站地图

Top