2014-01-29 44 views
1

Coherence似乎是最有希望的選擇:例如:http://coherence.beebits.net/browser/trunk/Coherence/coherence/backends/gstreamer_renderer.py似乎是將文件直接播放到HDMI電視適配器所需的一段時間後,通過uPnP流式傳輸音頻/視頻的解決方案。連貫性(或GUPnP)的用法?流A/V?

奇怪的是,在安裝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? 

回答

3

關於GUPnP Python的:它沒有廣泛使用,絕對不會記錄不夠好,但它應該工作。下面是使用爲wlan0網絡上列出了可用的設備一個GUPnP控制點的一個簡單的例子:

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' article和文檔PushHost。然而,dleyna是一組D-Bus服務,而不是圖書館,因此您必須決定它是否適合您的目的。

或者,你當然可以有一個正常的mediaserver(如rygel)運行並使用控制點(如gupnp-tools中的gupnp-av-cp)來選擇要播放的媒體和應播放的播放器。

+0

奇怪的是,您的示例顯示了網絡上的另一臺計算機,但從未使用Tronsmart設備。我需要先指定一個協議/端口嗎?查看我更新的問題,我用來查看設備的本地IP的代碼。 – NoBugs

+0

您不需要事先知道IP地址:UPnP的其中一點是SSDP讓我們發現設備。我真的不明白你的腳本試圖做什麼......我想它可能會嘗試自己做發現部分​​?這看起來並不有用:它已經由所有UPnP堆棧(如GUPnP)完成,並且正確地做出很多工作,但該腳本甚至沒有完成。 – jku

+0

gupnp-universal-cp(來自gupnp-tools)可能是仔細檢查設備是否爲標準UPnP設備的好方法。這不會讓你更接近於能夠進行2盒推送,但至少你會看到它是否是UPnP設備。 – jku