Wie richte ich Live-Audiostreams für ein DLNA-kompatibles Gerät ein?

54

Gibt es eine Möglichkeit, die Live-Ausgabe der Soundkarte von unserem 12.04.1 LTS amd64-Desktop auf ein DLNA-kompatibles externes Gerät in unserem Netzwerk zu streamen? Das Auswählen von Medieninhalten in freigegebenen Verzeichnissen mithilfe von Rygel, miniDLNA und uShare ist immer in Ordnung. Bisher konnten wir jedoch keinen Live-Audiostream über DLNA an einen Client übertragen.

Pulseaudio behauptet, über einen DLNA / UPnP-Medienserver zu verfügen, der zusammen mit Rygel genau dies tun soll. Aber wir konnten es nicht zum Laufen bringen.

Wir haben die in live.gnome.org , dieser Antwort hier und auch in einem ähnlichen Handbuch beschriebenen Schritte befolgt .


In 12.04 LTS können wir das lokale Audiogerät oder unseren GST-Launch-Stream im DLNA-Client auswählen, aber Rygel zeigt die folgende Meldung an und der Client gibt an, dass das Ende der Wiedergabeliste erreicht ist:

(rygel:7380): Rygel-WARNING **: rygel-http-request.vala:97: Invalid seek request

Es gab keine Möglichkeit, Live-Audio-Streams auf dem Client anzuhören.


Erst nach einem Distributions-Upgrade auf 14.04 LTS konnten wir einen Live-Stream auf unseren DLNA-Renderern aus den Einstellungen auswählen, die in der folgenden Antwort dargestellt sind . Dennoch mussten wir nach dem Start von rygel einen etablierten Stream auswählen und konnten keinen neuen Stream auf unsere UPnP-Geräte übertragen. Audio-Metadaten wurden nicht übertragen.


Gibt es andere Alternativen, um das Audio unserer Soundkarte als Live-Stream an einen DLNA-Client zu senden?

Takkat
quelle
Können Sie DLNA-Streaming mit Ihrem Empfangsgerät vermeiden? Meine Lösung besteht darin, den pulseaudio-Stream über HTTP weiterzuleiten.
Weitere
Entschuldigung, nein, ich möchte wirklich, dass DLNA funktioniert, da DLNA nur auf verschiedenen Clients (Fernsehern, AV-Receivern, Blueray-Playern usw.) weit verbreitet ist.
Takkat
Takkat, die Lösung, über die ich spreche, hat das Problem des Streamings zu meinem AVR gelöst. Wenn Sie wirklich einen DLNA-Server starten möchten, hatte ich am 12.04 (nach 'pacmd load-module module-http-protocol-tcp') eine positive Erfahrung mit rygel + pulseaudio. Am 12.10 erhielt ich die gleichen Warnungen über ungültige Suchanfragen .
DmitrySandalov
@DmitrySandalov: Es wäre wirklich cool, wenn Sie Details darüber mitteilen würden, wie es Ihnen gelungen ist, Rygel so einzurichten, dass die pulseaudio-Ausgabe live übertragen wird.
Takkat

Antworten:

63

Pulseaudio-DLNA

Ich habe einen kleinen Server erstellt, der alle upnp-Renderer in Ihrem Netzwerk erkennt und sie als Senken zu pulseaudio hinzufügt. So können Sie jede Anwendung über pavucontrol steuern, um auf Ihren Upnp-Geräten zu spielen.

Das ist die Art von Komfort, die ich immer wollte, wenn es um Upnp-Geräte unter Linux ging.

Die Anwendung kann von der Quelle oder vom DEB-Paket installiert werden, das von git heruntergeladen werden kann , oder nachdem wir das offizielle ppa: qos / pulseaudio-dlna des Projekts zu unseren Quellen hinzugefügt haben :

sudo apt-get update && sudo apt-get install pulseaudio-dlna

Anschließend führen wir pulseaudio-dlna über die Befehlszeile mit folgenden Optionen aus:

pulseaudio-dlna [--host <host>] [--port <port>] [--encoder <encoder>] [--renderer-urls <urls>] [--debug]
pulseaudio-dlna [-h | --help | --version]

Siehe auch die pulseaudio-dlna "About" für mehr.

Wenn ein DLNA-Renderer vorhanden war, können wir ihn aus dem Sound-Menü als Ausgabesenke auswählen:

Bildbeschreibung hier eingeben

Massimo
quelle
3
Tolle Bewerbung - Danke! Funktionierte gut auf meinen Geräten, darunter ein Samsung Smart TV (UE40ES6100). Nur ein Hinweis: Wir brauchten auch python-requestsals Abhängigkeit und konnten den Renderer aus den Standard-Audio-Steuerelementen auswählen - keine Notwendigkeit, Pavucontrol zu installieren.
Takkat
Froh, dass Sie es mögen. Ich habe gerade die README aktualisiert. Danke für den Tipp!
Massimo
2
Großartige Lösung. Vielen Dank. Aber ich habe eine Frage: Es gibt eine Wiedergabeverzögerung von mehreren Sekunden (10 Sekunden nach Drücken von Pause in VLC). Ist dies ein DLNA "Feature" oder gibt es eine Möglichkeit, es zu reduzieren? Also macht DLNA für die Videowiedergabe oder das Spielen keinen Sinn? :(
JPT
2
Die Verzögerung ergibt sich aus dem Füllen des HTTP-Puffers. Der Stream wird weiterhin abgespielt, falls Probleme mit Ihrer Verbindung auftreten (schwaches WLAN usw.). Wenn Sie die Verzögerung verringern möchten, verwenden Sie einen Codec, der viel Bandbreite ( wav ) benötigt, um diesen Puffer schneller zu füllen. Kabelverbindung hilft immer. Ansonsten ist dies sehr spezifisch für die Firmware-Implementierung Ihres Herstellers. ZB habe ich mit Cocy eine Verspätung von ca. 1 Sekunde. Sonos Play 1 mit wav: 1 Sekunde, mit mp3: 5 Sekunden. Alle über Kabel verbunden. Aber du wirst es nicht ganz los. Hauptzweck ist Musik und Hörbücher. Alles was nicht synchron sein muss.
Massimo
1
@JPT und alle anderen, die nach einer Möglichkeit suchen, die Verzögerung zu beheben (10s für mich): Mit shairport-sync führe ich auf meinem RaspberryPi parallel zur DLNA-Senke eine AirPlay-Senke aus und muss sagen, dass die Verzögerungen viel kürzer sind (~ 2s zum Starten; das Stoppen erfolgt sofort). Trotzdem vielen Dank an Massimo, denn pulseaudio-dlna wirkt, ohne die Verzögerung zu berücksichtigen, wie ein Zauber und ist wirklich trivial zu installieren! (AirPlay war für mich etwas schwieriger einzurichten.)
balu
8

Pavucontrol ist der fehlende Gegenstand in diesem Puzzle! Ich hatte auch alles richtig eingestellt und das externe Gerät (LG TV) zeigte an, dass der Ton abgespielt wurde, aber ich hörte keinen Ton. Heute habe ich pavucontrol installiert und als ich es öffnete, fand ich die Option, Sound über den DLNA-Server zu leiten. Die DLNA-Option wird nur angezeigt, wenn von einem Player Ton an pulseaudio ausgegeben wird. Bildbeschreibung hier eingeben

Durcheinander
quelle
Vielen Dank für das Teilen. Wie haben Sie den DLNA-Server eingerichtet? Für mich hat atm Rygel mit eher wenig hilfreichen Fehlern gekündigt.
Takkat
Ich habe gerade normale Einstellungen. Ich bin demselben Link gefolgt, den Sie in Ihrem Beitrag erwähnt haben. [GstLaunch] enabled = true launch-items = audiotestsrc; audiotestsrc-title = Desktop-Live-Streaming! audiotestsrc-mime = audio / mpeg audiotestsrc-launch = pulseSrc device = upnp.monitor! lamemp3enc target = quality quality = 6
jumbli
Seltsam. Mit Rhythmbox sind die Störungen verschwunden, aber ich komme immer noch nur Invalid seek requestvon Rygel. Medienverzeichnisse sind da, aber mein GST-Stream ist immer EOF.
Takkat
Eine großartige Ergänzung, mit der Sie für jede App, die Audio abspielen kann, eine Senke festlegen können! Ich kann Musik auf meiner großen Stereoanlage hören und Videos oder Spielsounds auf meinem Computer behalten. Vielen Dank!
Springloaded
Dies löste mein Problem, als alles verbunden und abgespielt war, aber nur der Ton fehlte!
Easwee
4

Es tut mir leid, dass ich dir bei Rygel überhaupt nicht helfen kann, aber es könnte eine Alternative geben, die für dich funktionieren könnte.

Das Prinzip ist, dass Sie ein Programm zum Aufzeichnen des Streams auf eine Audiodatei erstellen und dann miniDLNA mit einer benutzerdefinierten Konfiguration starten, die auf das Verzeichnis verweist, in dem sich der Stream befindet.

Beispiel: Angenommen, wir arbeiten in ~ / stream /. Erstellen Sie ~ / stream / minidlna.conf

network_interface=wlan0
media_dir=/home/<user>/stream/
friendly_name=Live Audio Stream
db_dir=/home/<user>/stream/
album_art_names=Cover.jpg/cover.jpg/AlbumArtSmall.jpg/albumartsmall.jpg/AlbumArt.jpg/albumart.jpg/Album.jpg/album.jpg/Folder.jpg/folder.jpg/Thumb.jpg/thumb.jpg
inotify=no
enable_tivo=no
strict_dlna=no
notify_interval=900
serial=12345678
model_number=1

Speichern Sie dann den Stream in einem Audiofile in diesem Verzeichnis. Die Suche nach "FFmpeg-Soundkarten-Audio aufnehmen" ergab diesen Befehl

ffmpeg -f alsa -i default -acodec flac ~/stream/OutputStream.flac

aber ich hatte nicht viel glück damit. Eine andere Option ist vlc, wenn Sie eine GUI zur Verfügung haben und dies nicht funktioniert.

Starten Sie dann miniDLNA in einem anderen Terminalfenster:

minidlna -d -f ~/stream/minidlna.conf -P ~/stream/minidlna.pid

Es sollte OutputStream.flac finden und dann von Ihrem Netzwerkgerät aus erreichbar sein.

Hoffentlich hast du ein paar Ideen, wenn du es noch nicht gelöst hast.

mtdevans
quelle
1
Vielversprechender Ansatz - danke - aber es muss noch verfeinert werden. Bei einem kurzen Test mit miniDLNA konnte ich heute die Stream-Datei nicht von meinem DLNA-Client erkennen lassen. Außerdem scheinen die von ffmpeg erzeugten Streams eher schlecht zu sein (statisches Rauschen). Ich bin dabei und lass es dich wissen.
Takkat
Bisher können wir mit ffmpeg oder avconv eine flac- oder mp3-Audiodatei aus der Audio-Senke erzeugen. Diese Datei wird jedoch von miniDLNA nur erkannt, wenn wir die Aufnahme beenden. Anschließend können wir diese Datei auf dem DLNA-Client erneut öffnen, während Sie eine andere Instanz aufzeichnen. Der Stream beginnt jedoch immer mit dem Beginn der Aufzeichnung und endet zu dem Zeitpunkt, zu dem wir mit dem Abhören des Clients begonnen haben. Irgendwelche Ideen, wie man das überwindet?
Takkat
Meinst du, wenn du den ffmpeg-Prozess abgebrochen hast, um die Aufnahme zu beenden, wird die Datei erst dann von miniDLNA erkannt? Ist auch die Audioqualität besser? Ich werde es auf meinem Computer ausprobieren und sehen, ob ich es wieder zum Laufen bringen kann. (Ich hatte letztes Jahr etwas Ähnliches für das Transcodieren von Filmen im
laufenden Betrieb
Ja an erster Stelle. Das zweite Mal kann ich vom Client aus darauf zugreifen, aber es beginnt von vorne (dh wann immer ich mit der Aufnahme begonnen habe) und endet in der Mitte (dh genau nach der Zeit zwischen dem Start der Aufnahme und dem Empfang auf dem Client). Audio ist jetzt in Ordnung, musste Duplex deaktivieren.
Takkat
4

Eine Idee, die ich "was ich höre" zu einem DLNA-Renderer (wie WDTV) streamen musste, war, den Stream mit VLC als http-Stream mit pulse://alsa_output.xxx.monitorals Eingabe zu servern und ihn in MP3 oder FLAC umzucodieren. Dann wollte ich einen DLNA-Kontrollpunkt verwenden, um den Renderer den Stream abspielen zu lassen. VLC stellt den transkodierten Stream korrekt bereit, lässt jedoch nicht zu, dass der MIME-Typ festgelegt wird, sodass der Renderer die Wiedergabe verweigert.

Die nächste Idee war, einen http-Server in Python zu schreiben, der stattdessen den Stream bedient. Es erhält den Audiostream vom Puls mit parec, codiert ihn mit flac( lameoder was auch immer Sie wollen) und stellt den MIME-Typ korrekt ein.

Es funktioniert mit dem folgenden (sehr einfachen) Skript:

#!/usr/bin/python

import BaseHTTPServer
import SocketServer
import subprocess

PORT = 8080
# run "pactl list short |grep monitor" to see what monitors are available
# you may add a null sink for streaming, so that what is streamed is not played back locally
# add null sink with "pactl load-module module-null-sink"
MONITOR = 'null.monitor'
MIMETYPE = 'audio/flac'
ENCODER = 'flac - -c --channels 2 --bps 16 --sample-rate 44100 --endian little --sign signed'
BUFFER = 65536

class Handler(BaseHTTPServer.BaseHTTPRequestHandler):
def do_HEAD(s):
    print s.client_address, s.path, s.command
    s.send_response(200)
    s.send_header('content-type', MIMETYPE)
    s.end_headers()
def do_GET(s):
    s.do_HEAD()
    pa = subprocess.Popen('parec -d {} | {}'.format(MONITOR, ENCODER), shell = True, bufsize = BUFFER, stdout = subprocess.PIPE)
    while True:
        data = pa.stdout.read(1024)
        if len(data) == 0: break
        s.wfile.write(data)
    print 'stream closed'


httpd = SocketServer.TCPServer(("", PORT), Handler)

print "listening on port", PORT

try:
httpd.serve_forever()
except KeyboardInterrupt:
pass

httpd.server_close()

Passen Sie die Parameter an, führen Sie sie aus und richten Sie den DLNA-Renderer auf Ihren Computer. Es funktionierte für mich mit einem WDTV als Renderer und einem Android-Telefon mit BubbleUPnP als Kontrollpunkt (Sie können die Stream-URL eingeben, wenn Sie der Wiedergabeliste manuell ein neues Element hinzufügen). Es sollte jedoch mit allen DLNA-kompatiblen Geräten funktionieren.

Adam
quelle
4

HINWEIS: Diese Lösung funktioniert, aber von Massimo wurde eine neuere und wahrscheinlich bessere Lösung vorgeschlagen.

Hier ist eine Antwort für Ubuntu 14.04 (ebenfalls getestet und am 15.04 lauffähig ), der Vollständigkeit halber :

  1. Installiere alle benötigten Pakete: sudo apt-get install rygel rygel-preferences rygel-gst-launch

  2. Erstellen Sie die Datei ~/.config/rygel.conf, die Folgendes enthält:

    [GstLaunch]
    enabled=true
    title=@REALNAME@'s stream
    launch-items=myaudioflac;myaudiompeg
    
    myaudioflac-title=FLAC audio on @HOSTNAME@
    myaudioflac-mime=audio/flac
    myaudioflac-launch=pulsesrc device=upnp.monitor ! flacenc quality=8
    
    myaudiompeg-title=MPEG audio on @HOSTNAME@
    myaudiompeg-mime=audio/mpeg
    myaudiompeg-launch=pulsesrc device=upnp.monitor ! lamemp3enc target=quality quality=6
    
    [Playbin]
    enabled=true
    title=Audio/Video playback on @REALNAME@'s computer
    
    [general]
    interface=
    upnp-enabled=true
    
    [MediaExport]
    uris=
    
  3. Führen Sie die folgenden Befehle über die Befehlszeile aus (diese können bei Bedarf in ein Skript eingefügt werden):

    pactl load-module module-http-protocol-tcp
    pactl load-module module-rygel-media-server 
    rygel &
    
  4. Führen Sie den paprefsBefehl aus und stellen Sie sicher, dass beide DLNA-Optionen auf der Registerkarte "Netzwerkserver" aktiviert (markiert) sind.

  5. Spielen Sie Audio auf Ihrem Computer ab. Führen Sie das pavucontrolProgramm aus und ändern Sie auf der Registerkarte "Wiedergabe" das Ausgabegerät in "DLNA / UPnP-Streaming".

Zu diesem Zeitpunkt sollten Sie in der Lage sein, die MPEG- und FLAC-Streams von einem DLNA-Client (Renderer / Kontrollpunkt) abzuspielen.

ANMERKUNG: Möglicherweise müssen Sie Ihren Computer neu starten (oder den Puls neu starten), damit die Arbeit beginnen kann.

Kennzeichen
quelle
3

Das Python-Skript von Adam ist genau das, was ich brauchte. Brillant. Rygel mit gst-launch funktioniert nicht mit einem meiner Renderer, aber dieses Skript funktioniert mit beiden. In meinem Fall nehme ich einen Audio-Stream-Eingang von Squeezelite (für Squeezebox) und sende ihn an einen Renderer. Das Skript funktioniert auch in der ursprünglichen Form, um Eingaben von einem Pulseaudio-Monitor zu erhalten, falls dies erforderlich ist.

Da ich nichts davon wusste, konnte ich einige Ergänzungen zum Skript vornehmen, die:

i) erlauben, dass es von einem Shell-Skript ausgeführt und mit einem SIGTERM / SIGKILL beendet wird (die 'except'-Anweisung enthält jetzt' systemexit ')

ii) Ermöglicht das Stoppen und Neustarten des Skripts und die erneute Verwendung desselben Ports (da das neu gestartete Skript fehlgeschlagen ist und den Port nicht öffnen konnte, wenn der Renderer ihn noch geöffnet hatte) - (die allow_reuse_address = True-Anweisung)

iii) erstelle eine Version, die die Eingabe von stdin aufnimmt und sie mit sox erneut abtastet, um sie im wav-Format auszugeben (auf Port 8082)

Meine Version sieht also so aus:

#!/usr/bin/python

import BaseHTTPServer
import SocketServer
import subprocess

PORT = 8082

MIMETYPE = 'audio/x-wav'
BUFFER = 65536

class Handler(BaseHTTPServer.BaseHTTPRequestHandler):
  def do_HEAD(s):
    print s.client_address, s.path, s.command
    s.send_response(200)
    s.send_header('content-type', MIMETYPE)
    s.end_headers()
  def do_GET(s):
    s.do_HEAD()
    pa = subprocess.Popen('sox -t raw -r 96000 -b 24 -L -e signed -c 2 - -t wav -r 44100 -b 16 -L -e signed -c 2 - ', shell = True, bufsize = BUFFER, stdout = subprocess.PIPE)
    while True:
        data = pa.stdout.read(1024)
        if len(data) == 0: break
        s.wfile.write(data)
    print 'stream closed'

SocketServer.TCPServer.allow_reuse_address = True
httpd = SocketServer.TCPServer(("", PORT), Handler)

print "listening on port", PORT

try:
 httpd.serve_forever()

except (KeyboardInterrupt, SystemExit):
 pass

httpd.server_close()
pastim
quelle
1
Ich habe ein paar kleinere Probleme mit diesem Skript gefunden.
Pastim
@Adam - Nach mehreren Versuchen fand ich ein paar kleinere Probleme mit diesem Programm. Das größte Problem ist jedoch, dass das Streaming nach einer Zeit, die in direktem Verhältnis zur gesendeten Datenmenge steht, mit Fehler 32 (Pipe unterbrochen) beendet wird. Für einen Stream mit 24/96000 Qualität ist dies etwas mehr als eine Stunde. Am 24/192000 sind es etwas mehr als 30 Minuten. Für CD-Qualität etwas mehr als 3 Stunden. Durch erneutes Auswählen des Streams im Renderer wird der Stream erneut gestartet. Ich glaube, die Lösung könnte "Chunked Encoding" sein. Ich habe mich gefragt, ob jemand eine Chunked-Version produziert hat.
Pastim
1

Ich bin mir nicht sicher, ob dies für Sie jetzt nützlich sein wird, aber ich habe einen Beitrag darüber geschrieben, wie dies unter Ubuntu 12.10 funktioniert:

http://dpc.ucore.info/blog/2012/11/07/dlna-streaming-in-ubuntu-12-dot-10/

dpc.pw
quelle
Vielen Dank, dass Sie dies geteilt haben - genau das ist bisher bei mir immer gescheitert. Aufgrund des Designs dieser Website möchten wir Sie dazu ermutigen, die von Ihnen unternommenen Schritte zu erläutern (zusätzlich zum einfachen Veröffentlichen des Links in Ihrem Blog), da Links mit der Zeit möglicherweise verschwinden und Ihre Antwort unbrauchbar wird. Ich melde mich bei Ihnen, sobald ich dies testen konnte.
Takkat
Hier sind meine bisherigen Beobachtungen: Nach dem Absturz Ihres Guides stürzt Rygel mit SEGFAULT ab, wenn Sie in 12.04 den Audiostream vom Client auswählen. In 12.10 können wir mit GST-Launch keinen Stream erstellen. Fehlt etwas?
Takkat
Die Frage war um 12.04 und diese Antwort ist für Ubuntu 12.10, sonst würde ich sie abstimmen. :)
jdthood
Person aus der Zukunft hier: Dieser Link ist verfault. : P
datashaman