Использование 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), чтобы выбрать носитель, который вы хотите воспроизвести, и средство визуализации, которое должно его воспроизводить.

Другие вопросы по тегам