Использование Coherence (или GUPnP)? потоковое аудио / видео?
После некоторого поиска решения для потоковой передачи аудио / видео через uPnP, Coherence кажется наиболее перспективным вариантом: например: http://coherence.beebits.net/browser/trunk/Coherence/coherence/backends/gstreamer_renderer.py Кажется, что py - это то, что требуется для воспроизведения файла непосредственно на ключ телевизора HDMI.
Как ни странно, после установки пакета согласования Ubuntu, запустив import coherence
в терминале Python действительно не показывать ничего подобного этому модулю. Завершение вкладки в 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 ответ
О GUPnP на python: он широко не используется и определенно недостаточно документирован, но должен работать. Вот краткий пример перечисления доступных устройств в сети wlan0 с помощью GUPnP ControlPoint:
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 ()
Проблема с "потоковой передачей в рендерер" заключается в том, что на самом деле вам нужны две вещи: контрольная точка, которая сообщает рендереру, что вы хотите воспроизвести, и медиасервер, который обслуживает фактические носители, когда рендерер запрашивает их - если они интегрированы. в одну (называемую "модель с двумя блоками"), часть медиасервера не так сложна, но это все еще необходимо сделать.
Один проект, который вас может заинтересовать - это dleyna: он основан на GUPnP и пытается немного облегчить работу на стороне клиента. Смотрите статью и документацию Дженса для PushHost. Однако dleyna - это набор служб D-Bus, а не библиотека, поэтому вам придется решить, соответствует ли она вашим целям.
В качестве альтернативы вы можете, конечно, запустить обычный медиасервер (например, rygel) и использовать контрольную точку (например, gupnp-av-cp из gupnp-tools), чтобы выбрать носитель, который вы хотите воспроизвести, и средство визуализации, которое должно его воспроизводить.