使用Coherence(或GUPnP)?流A / V?

时间:2014-01-29 05:59:43

标签: python network-protocols upnp coherence-toolkit gupnp

通过uPnP寻找流式音频/视频解决方案后,Coherence似乎是最有前途的选择:例如:http://coherence.beebits.net/browser/trunk/Coherence/coherence/backends/gstreamer_renderer.py似乎是直接播放文件所需的内容HDMI电视加密狗。

奇怪的是,在安装Ubuntu coherence包之后,在Python终端中运行import coherence并没有真正显示这个模块。 bpython中的标签完成显示:

>>> coherence.
┌───────────────────────────────────────────────────────────────────────────┐
│SERVER_ID           Version             platform                           │
│sys                 twisted_version     twisted_web_version                │
└───────────────────────────────────────────────────────────────────────────┘

这些子模块似乎只是提供有关系统的信息。如何导入和使用Coherence将桌面或视频流式传输到uPnP屏幕?是否有基本的入门指南?

更新

看起来GUPnP能够链接到Python:

>>> from gi.repository import GUPnP
>>> GUPnP.ControlPoint.new()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: new() takes exactly 2 arguments (0 given)

这显然是在调用此处记录的函数: https://developer.gnome.org/gupnp/unstable/GUPnPControlPoint.html

不幸的是,文档没有关于如何流式传输到视频接收器的完整示例 - 具体来说,它是如何通过网络发送视频文件的?

更新:这是我用来检测设备的第一步:

import socket
import threading
import time

Addr = None;
StartLock = threading.Lock()

def DoUDP():
    global Addr
    global StartLock
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #Internet, UDP
    s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
    while 1:
        s.sendto('0:0',('192.168.0.255',63630))
        data,addr = s.recvfrom(1024)
        print data
        print 'from', addr
        Addr = addr
        try:
            StartLock.release()
        except:
            pass
        time.sleep(1)
        return

StartLock.acquire()
print 'starting...'
udpthread = threading.Thread(target=DoUDP)
udpthread.start();

#... knowing address of the device... send stuff?

1 个答案:

答案 0 :(得分:3)

关于python上的GUPnP:它没有被广泛使用,并且肯定没有很好地记录,但它应该工作。以下是使用GUPnP ControlPoint列出wlan0网络上可用设备的快速示例:

from gi.repository import GLib, GUPnP

def device_available (cp, proxy):
   print ("Found " + proxy.get_friendly_name ())

ctx = GUPnP.Context.new (None, "wlan0", 0)
cp = GUPnP.ControlPoint.new (ctx, "upnp:rootdevice")
cp.set_active (True)
cp.connect ("device-proxy-available", device_available)

GLib.MainLoop ().run ()

“流式传输到渲染器”的问题在于,您实际上需要两件事:控制点告诉渲染器您想要播放的内容,以及在渲染器请求时为实际媒体提供服务的中介服务器 - 如果这些被集成到一个(称为“2盒推模型”)中,mediaserver部分不是那么复杂,但仍需要完成。

您可能感兴趣的一个项目是dleyna:它基于GUPnP并尝试使这个客户端工作更容易一些。请参阅Jens' articlePushHost的文档。然而,dleyna是一套D-Bus服务,而不是图书馆,所以你必须决定它是否适合你的目的。

另外,您当然可以运行正常的mediaserver(如rygel)并使用控制点(如gupnp-tools中的gupnp-av-cp)来选择要播放的媒体和应该播放它的渲染器。