【问题标题】:Usage of Coherence (or GUPnP)? to stream A/V?使用一致性(或 GUPnP)?流式传输 A/V?
【发布时间】:2014-01-29 05:59:42
【问题描述】:

在寻找通过 uPnP 流式传输音频/视频的解决方案一段时间后,Coherence 似乎是最有希望的选择:例如:http://coherence.beebits.net/browser/trunk/Coherence/coherence/backends/gstreamer_renderer.py 似乎是直接将文件播放到 HDMI 电视所需的选项加密狗。

奇怪的是,在安装了 Ubuntu coherence 包之后,在 Python 终端中运行 import coherence 并没有真正显示类似这个模块的任何内容。 bpython 中的 Tab 补全显示:

>>> 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?

【问题讨论】:

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


    【解决方案1】:

    关于 python 上的 GUPnP:它没有被广泛使用,而且绝对没有足够好的文档记录,但它应该可以工作。下面是一个使用 GUPnP 控制点列出 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-box push model”),媒体服务器部分没有那么复杂,但仍然需要完成。

    您可能感兴趣的一个项目是 dleyna:它基于 GUPnP,并试图让这个客户端的工作更容易一些。请参阅Jens' articlePushHost 的文档。但是 dleyna 是一组 D-Bus 服务,而不是库,因此您必须确定它是否适合您的目的。

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

    【讨论】:

    • 奇怪的是,您的示例显示了网络上的另一台计算机,但从未显示 Tronsmart 设备。我需要先指定协议/端口吗?查看我更新的问题,我用来查看设备的本地 IP 的代码。
    • 您不需要事先知道 IP 地址:UPnP 的要点之一是 SSDP 可以让我们发现设备。我真的不明白你的脚本试图做什么......我想它可能会尝试自己做发现部分​​?这似乎没什么用:所有 UPnP 堆栈(如 GUPnP)都已经完成了它,而且要做好很多工作,脚本甚至还没有接近完成。
    • gupnp-universal-cp(来自 gupnp-tools)可能是仔细检查设备是否是标准 UPnP 设备的好方法。这并没有让您更接近能够进行 2 盒推送,但至少您会看到它是否似乎是一个 UPnP 设备。
    猜你喜欢
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    • 1970-01-01
    • 2018-11-04
    相关资源
    最近更新 更多