65.9K
CodeProject 正在变化。 阅读更多。
Home

PRISMIQ 媒体播放器的音频管理器点唱机

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.57/5 (10投票s)

2004年6月3日

CPOL

8分钟阅读

viewsIcon

73861

downloadIcon

720

PRISMIQ 媒体播放器的桌面服务器和 Pocket PC 智能客户端。

服务器截图

Pocket PC 截图

引言

在过去几年里,多家公司推出了网络媒体播放器。这些媒体播放器允许您通过无线或有线网络连接,将音频、图片和视频从本地 PC 流式传输到您的家庭娱乐中心。例如:

背景

PRISMIQ 媒体播放器 Audio Manager 服务器和 Pocket PC 智能客户端旨在从桌面和无线 Pocket PC 控制 PRISMIQ 媒体播放器。PRISMIQ 提供文档,说明如何通过简单的命令接口控制其 Media Agent。他们还提供了一个 JSP 代码示例,该示例可以在包括 Pocket PC 在内的任何浏览器中运行。基于 PRISMIQ JSP 代码示例,PRISMIQ 媒体播放器的 Audio Manager 应运而生。

Audio Manager 在设计 Audio Manager 时考虑了以下重要标准:

  • 用户将能够将任意组合的歌曲或播放列表添加到音频队列。
  • 系统应支持多个客户端,并透明地更新每个客户端的更改。
  • 将支持桌面和 Pocket PC 客户端。
  • 客户端将与服务器应用程序通信,并且不需要一直在线即可控制音频流。
  • 更新客户端应快速,并尽量减少网络流量。

使用代码

Audio Manager 由两个独立的应用程序组成。服务器是一个用 C# 编写的桌面应用程序。服务器维护一个歌曲队列,它和客户端应用程序都从中追加歌曲。服务器与 PRISMIQ Media Agent 通信,将队列中的歌曲 ID 传输给 Media Agent。客户端是一个用 C# 和 compact framework 编写的 Pocket PC 应用程序。客户端包含与桌面服务器相同的功能,但不维护歌曲队列或与 Media Agent 通信。相反,客户端通过 UDP 网络请求将所有队列请求转发给服务器。客户端-服务器通信由一个字节命令后跟任何命令数据组成。命令如下:

服务器命令 数据 描述

  • 00 Skip 跳到下一首歌曲(由客户端发送)
  • 02 Add SongID 将歌曲添加到队列(由客户端发送)
  • 04 Get Queue Request 传输服务器队列(由客户端发送) 06 Play 播放队列中的第一首歌曲(由客户端发送)
  • 08 Pause 暂停当前歌曲(由客户端发送)
  • 0A Shuffle 随机播放服务器队列(由客户端发送)
  • FE Ping Request 请求服务器 ping(由客户端发送)

客户端命令 数据 描述

  • 01 Next Song 播放队列中的下一首歌曲(由服务器发送)
  • 05 Queue SongID1…SongIDn 队列中的歌曲 ID 转储(由服务器发送)
  • FF Ping QueueCRC SongElapse 从服务器发送的 ping,每秒发送一次,包含队列中所有歌曲 ID 的 CRC 以及当前歌曲的已用时间(以秒为单位)
  • *** SongID 是一个 32 位无符号整数
  • *** SongElapse 是一个 32 位有符号整数(如果为负数,则表示音频已暂停)

大多数命令都是不言自明的,但 ping 命令(由服务器每秒发送一次)包含其队列的 CRC。这允许客户端在开机后轻松验证其队列。如果服务器 ping CRC 与客户端队列的 CRC 不匹配,客户端将向服务器发送“Get Queue”命令。

XML 媒体文件

PRISMIQ 媒体管理器会生成两个 XML 数据文件:Media.xml 和 PlayList.xml,其中包含有关用户硬盘上的音频、视频和图片的信息。

音频条目的格式如下:

Media.xml

<xml> 
 <audio> 
  <title>moondance</title> 
  <id>1528298868</id> 
  <type>mp3</type> 
  <runningtime>4:14</runningtime> 
  <released>2003</released> 
  <genre>default</genre> 
  <bitrate>128 kbps</bitrate> 
  <path>C:\Music\Michael Buble\MICHAEL BUBLE</path> 
  <artist>Michael Buble</artist> 
  <album>MICHAEL BUBLE</album> 
  <tracknumber>2</tracknumber> 
  <filename0>C:\Music\Michael Buble\MICHAEL BUBLE\Michael Buble - moondance.mp3
  </filename0> 
 </audio> 
 <audio> 
  <title>Ka-Ching!</title> 
  <id>1625257760</id> 
  <type>mp3</type> 
  <runningtime>3:21</runningtime> 
  <genre>default</genre> 
  <bitrate>128 kbps</bitrate> 
  <path>C:\Music\Shania Twain\Up!</path> 
  <artist>Shania Twain</artist> 
  <album>Up!</album> 
  <tracknumber>12</tracknumber> 
    <filename0>C:\Music\Shania Twain\Up!\Shania Twain - Ka-Ching!.mp3
    </filename0> 
 </audio> 
</xml>

PlayList.xml

<xml>
    <playlist>
        <name>MICHAEL BUBLE</name>
        <type>audio</type>
        <sortcolumn>track number</sortcolumn>
        <sortdirection>Ascending</sortdirection>
        <entry>453215480</entry>
        <entry>1528298868</entry>
        <entry>529725513</entry>
        <entry>2590241737</entry>
        <entry>3769760375</entry>
        <entry>1551272395</entry>
        <entry>2438010674</entry>
        <entry>1502551820</entry>
        <entry>231886403</entry>
        <entry>512290532</entry>
        <entry>1973482017</entry>
        <entry>2603685597</entry>
        <entry>843667268</entry>
    </playlist>
    <playlist>
        <name>Up!</name>
        <type>audio</type>
        <sortcolumn>track number</sortcolumn>
        <sortdirection>Ascending</sortdirection>
        <entry>613994627</entry>
        <entry>2816411363</entry>
        <entry>2391023110</entry>
        <entry>1146468105</entry>
        <entry>2596739105</entry>
        <entry>780673557</entry>
        <entry>610118837</entry>
        <entry>810715573</entry>
        <entry>939504637</entry>
        <entry>2415083396</entry>
        <entry>1630180877</entry>
        <entry>1625257760</entry>
        <entry>2401281999</entry>
        <entry>3963164466</entry>
        <entry>3173191139</entry>
        <entry>3565712766</entry>
        <entry>1333699249</entry>
        <entry>4250617949</entry>
        <entry>3074224152</entry>
    </playlist>
</xml>

Media Agent 需要 Media.xml 的 <id></id> 标签中的 ID 来播放指定的歌曲。服务器和所有客户端都必须包含这些文件的副本,以便引用和排队歌曲。Pocket PC 客户端当前会在可执行文件目录中查找这些文件,而服务器的路径则可以设置。

程序代码和流程

服务器和客户端应用程序共享通用代码库,并且在用户角度和程序流程方面操作相似。主要区别在于:

  • .NET Compact Framework 与完整桌面框架之间的差异
  • 服务器与 PRISMIQ 媒体代理通信
  • 服务器或客户端命令

几点说明

  • Pocket PC 客户端应用程序需要 Compact Framework V1.1 SP2 或更高版本,可从 Microsoft 获取。
  • Pocket PC 客户端在模拟器下无法工作,因为 UDP 类在模拟器下似乎不起作用。

程序流程

每个应用程序加载 Media 和 Playlist XML 文件,并生成两个哈希表。一个用于歌曲(Media.xml),一个用于播放列表(playlist.xml)。树状视图以歌曲视图或播放列表视图显示这些哈希表的内容。

服务器与媒体代理建立 TCP 连接。

打开 UDP 客户端或服务器连接。服务器每秒开始发送 Ping 命令。客户端监听服务器的 Ping 命令。

启动一秒定时器。服务器使用此定时器向客户端发送 Ping 命令并更新已用时间。客户端使用此定时器作为超时机制,如果未在最后两秒内收到服务器 ping,则显示等待光标。

每个应用程序都等待以下事件之一发生:

  • 用户触发的事件(添加歌曲到队列、播放下一首或暂停)

用户通过“双击”(桌面)或“长按”(pocket PC)树状视图中的歌曲或播放列表将歌曲添加到队列。在服务器上,歌曲会添加到队列,然后计算并向所有客户端发送新的队列 CRC。在客户端上,歌曲将添加到本地队列,并计算本地队列 CRC。

将“添加歌曲”命令发送到服务器。

播放事件 - 在服务器上,队列中的第一首歌曲被发送到媒体服务器。在客户端上,“播放”命令被发送到服务器。“下一首”事件 - 在服务器上,队列中的下一首歌曲被发送到媒体服务器。计算队列 CRC。在客户端上,“下一首”命令被发送到服务器。

暂停事件(切换事件)- 在服务器上,将暂停或播放命令发送到 Media Agent。如果已暂停,则服务器 ping 中的已用时间变为负数。在客户端上,“暂停”命令被发送到服务器。

收到服务器或客户端命令 - 在服务器上,从客户端收到的绝大多数命令都镜像了上述用户事件,Get Queue 除外,Get Queue 会将整个歌曲队列发送给客户端。客户端每秒接收来自服务器的 ping 命令。ping 命令包含服务器队列 CRC 和歌曲已用时间。如果服务器 CRC 与客户端本地 CRC 不同,则从服务器请求歌曲队列。ping 命令还会使用已用时间更新统计信息页面。

媒体代理消息(仅服务器)- 媒体代理有两个服务器感兴趣的消息。歌曲结束消息告诉服务器排队下一首歌曲。歌曲未找到消息也会排队下一首歌曲。“下一首歌曲”命令发送给所有客户端。服务器和客户端都会移除队列的头部并重新计算其队列 CRC。

操作配置

Audio Manager 服务器 - 您必须启用媒体播放器代理以允许外部通信。文件 -> 设置会显示配置对话框:媒体播放器地址(Prismiq 媒体播放器的地址)、端口(媒体播放器端口,默认 = 2253)。

媒体服务器 - XML 文件:media.xml 和 playlist.xml 的位置。服务器地址(用于与客户端通信的地址):255.255.255.255 是默认值,可以是任何 UDP 广播地址或特定客户端地址(如果只有一个客户端)。端口(用于与客户端通信的端口):必须与客户端上设置的端口相同。工具栏按钮:播放列表(树状视图)、歌曲(树状视图)、播放下一首、暂停。要将媒体添加到队列,请双击树状视图中的任何歌曲或播放列表。

Audio Manager 客户端 Pocket PC - 您必须将 playlist.xml 和 media.xml 复制到 Pocket PC 上与可执行文件相同的目录。文件 -> 设置会显示配置对话框:地址(用于与服务器通信的地址):255.255.255.255 是默认值,可以是任何 UDP 广播地址或特定服务器地址(**推荐)。端口(用于与服务器通信的端口):必须与服务器上设置的端口相同。要将媒体添加到队列,请长按树状视图中的任何歌曲或播放列表。如果长按不能自动选择树状项,您需要将 Pocket PC 上的 Compact Framework 更新到版本 1.0 SP2。长按队列中的歌曲以显示歌曲详细信息。

关注点

链接

© . All rights reserved.