用Java或C#实现UPnP AV远程控制

4
我需要创建一种远程控制器,可以与UPnP媒体服务器交互。
我读到了有三种UPnP AV堆栈应用程序:媒体服务器、媒体渲染器和控制点。起初,我认为我想要编程的是控制点,然而,在浏览了几个库的文档后,我发现控制点仍然希望在运行控制点的设备上使用外部软件播放服务器提供的媒体文件(不像媒体渲染器会自己播放文件)。
我理解得正确吗,还是完全错误?
此外,我找不到任何看起来足够易于使用的库。这可能是由于我的技能差,但我也感觉许多库的文档非常糟糕和不完整。
我记不清我遇到的所有库,但它们包括经常提到的名称,如Cling、Fraunhofer FOKUS和CyberLink。我阅读了他们网站上的大部分内容,包括一些文档,但无法真正找出如何按照我想要的方式使用它们。
我只需要“连接到服务器,索引媒体列表,以便我可以跳转到任何曲目,并且只给我播放、停止、暂停、下一曲、上一曲和控制音量的可能性。然而,文件应该是在服务器端播放。”
您是否知道有任何适用于Java或C#的这样的好东西? 非常感谢您的帮助。 :)
1个回答

1
起初,我认为控制点是我想要编程的内容,但是,在浏览了几个库的文档后,我发现控制点仍然希望在运行控制点的设备上使用外部软件(而不是媒体渲染器自己播放文件)来播放服务器提供的媒体文件。
为了与UPnP AV兼容,软件应用程序或硬件设备必须包括至少一个UPnP AV设备(MediaServer、ControlPoint或MediaRenderer)及其强制性服务。有些应用程序提供多个设备,因此,在实践中可能找不到逻辑分离。通常,视频播放器只实现ControlPoint服务以浏览服务器并下载其内容(内容甚至可以位于另一台服务器上)。
我只需要一个能让我连接到服务器、索引媒体列表,以便我可以跳转到任何曲目,并且只给我播放、停止、暂停、下一首、上一首和控制音量的可能性。然而,文件应该在服务器端播放。

UPnP 定义了多个服务,设备(例如媒体服务器)必须实现这些服务(例如,MediaServer 必须提供 DirectoryService)。每个服务都有强制和可选操作(例如,可以通过 Browse 方法浏览目录服务)。 要实现您想要的功能,服务器必须实现 UPnP MediaServer(用于浏览其内容)和 UPnP MediaRenderer(用于控制播放)。UPnP ControlPoint 充当一种远程控制器。它用于浏览服务器并选择用于播放文件的服务器。

浏览请求如下所示(ObjectID 0 始终表示树的根):

<Browse xmlns:u =" urn:schemas-upnp-org:service:ContentDirectory:1 ">
<ObjectID>0</ObjectID>
<Filter></Filter>
<RequestedCount>0</RequestedCount>
<StartingIndex >0</StartingIndex>
<SortCriteria ></ SortCriteria>
<BrowseFlag> BrowseDirectChildren </BrowseFlag >
</u:Browse>

服务器会返回一个类似于以下内容的响应:
<DIDL-Lite>
<item id="1" parentID ="0" restricted ="1">
<upnp:class>object.item.videoItem </upnp:class>
<dc:title>Video file</dc:title>
<upnp:artist>John Doe</upnp:artist>
<upnp:genre>Action</ upnp:genre>
<upnp:director>John Doe Jr.</upnp:director>
<res protocolInfo="http-get:*:video/mpeg:*" resolution ="352x288">
http://10.20.30.40:12345/ExportContent?id=1
</res>
</item>
</DIDL-Lite >

在这种情况下,服务器只有一个视频项(通常,服务器将有多个包含许多项的文件夹)。res元素包含有关资源本身的信息(其位置在哪里,必须使用哪种传输协议,mime类型等)。在您的情况下,服务器甚至可以回答“localhost”作为地址,从而防止下载文件。您的服务器的MediaRenderer部分仍应能够访问它。

我不记得我遇到的所有库,但它们经常包括Clint、Fraunhofer FOKUS和CyberLink等经常提到的名称。

个人而言,我会推荐使用 CyberLink for Java。我曾经用它来实现媒体服务器,但它也足以用于实现控制点或媒体渲染器。此外,您还应该获取一个UPnP开发工具,例如 UPnP开发工具(最初是英特尔UPnP工具) Linux的GUPnP工具。 GUPnP还为C语言提供了UPnP库。这些开发工具允许您调用和调试UPnP命令,并在开发过程中非常有用。另一个有用的资源是UPnP联盟提供的 UPnP设备描述


非常感谢您详细的回答。我将使用foobar2000作为我的媒体服务器+渲染器,所以这方面应该已经解决了。我已经尝试过开发者工具,并且可以使用它们来控制foobar的播放。为了澄清事情,这是一个大学项目,最终我应该能够使用手势控制媒体服务器/渲染器,使用Kinect。我应该使用的Kinect工具仅在Windows中运行,因此我认为最好也在Windows中创建UPnP-CP。 - kah
然而,我的教授建议我不要使用UPnP库,而是应该使用已有的遥控器来控制foobar2000,并使用Wireshark之类的工具来嗅探它们交换的流量。他认为,我可以编写一个程序来创建并发送与我嗅探到的类似的XML文件。 到目前为止,我还没有彻底尝试过这种方法,但所有的结果都很难解释。 我应该提到,我仍然不太了解UPnP,我认为我的教授也不太了解。 - kah
那么您会建议使用已经存在的库来创建堆栈,尽管可能有更高的学习曲线,还是自己编写更好?我只需要像播放、暂停、下一首、上一首这样的命令。然而,正如您所提到的,所有UPnP设备都必须实现多个服务,那么这将会相当困难吧? - kah
所有的UPnP XML文件都封装在SOAP消息中。因此,您可以编写自己的XML文件,将它们放入SOAP消息中并将其发送到foobar2000。但是,您需要了解许多UPnP的细节才能这样做。一个库隐藏了所有这些细节,所以我个人会使用一个库而不是自己编写所有东西。我使用了CyberLink库,但最近我发现另一个名为Cling的Java库,它有非常详尽的开发者文档:链接 - crnv
由于您只需要调用操作,所以第3.2章对您来说非常相关。包含这些操作的服务称为AVTransport(是MediaRenderer设备的一部分)。您无需实现其他操作或服务,因为您的应用程序仅使用UPnP AV而不提供其功能给其他UPnP设备。 - crnv
哇,非常感谢。我会在周末更深入地研究一下 :) - kah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接