Comment configurer des flux audio en direct sur un périphérique compatible DLNA?


54

Existe-t-il un moyen de diffuser la sortie en direct de la carte son de notre bureau 12.04.1 LTS amd64 sur un périphérique externe compatible DLNA de notre réseau? La sélection de contenu multimédia dans des répertoires partagés à l'aide de Rygel, miniDLNA et uShare est toujours acceptable - mais jusqu'à présent, nous n'avons pas réussi à obtenir un flux audio en direct vers un client via DLNA.

Pulseaudio prétend avoir un serveur multimédia DLNA / UPnP qui, avec Rygel, est censé faire exactement cela. Mais nous n'avons pas réussi à le faire fonctionner.

Nous avons suivi les étapes décrites dans live.gnome.org , cette réponse ici, ainsi qu'un autre guide similaire .


Dans 12.04 LTS, nous pouvons sélectionner le périphérique audio local ou notre flux GST-Launch dans le client DLNA, mais Rygel affiche le message suivant et le client indique qu'il a atteint la fin de la liste de lecture:

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

Il n'y avait aucun moyen d'écouter des flux audio en direct sur le client.


Ce n’est qu’après une mise à niveau de la distribution vers 14.04 LTS que nous avons pu sélectionner un flux en direct sur nos rendus DLNA à partir des paramètres bien décrits dans la réponse ci-dessous . Néanmoins, nous avions besoin de sélectionner un flux établi après le démarrage de Rygel et étions incapables de transmettre un nouveau flux à nos périphériques UPnP. Les métadonnées audio n'ont pas été transmises.


Existe-t-il d'autres solutions pour envoyer le son de notre carte son sous forme de diffusion en direct à un client DLNA?


Pouvez-vous éviter la diffusion DLNA avec votre appareil récepteur? Ma solution est de passer le flux pulseaudio sur HTTP, voir plus ici: sandalov.org/blog/1441
DmitrySandalov

Désolé, je souhaite vraiment que DLNA fonctionne, car DLNA est largement implémenté sur plusieurs clients (téléviseurs, récepteurs AV, lecteurs Blueray, etc.).
Takkat

Takkat, la solution dont je parle a résolu le problème de la diffusion en continu sur mon AVR. Si vous voulez vraiment lancer un serveur DLNA, j’ai eu une expérience positive avec rygel + pulseaudio le 12.04 (après 'pacmd module de module de chargement-http-protocole-tcp'), le 12.10, j’ai reçu les mêmes avertissements «Demande de recherche invalide». .
DmitrySandalov

@DmitrySandalov: ce serait vraiment bien si vous partagiez des détails sur la façon dont vous avez réussi à configurer Rygel pour diffuser en direct la sortie pulseaudio.
Takkat

Réponses:


63

Pulseaudio-DLNA

J'ai créé un petit serveur qui découvre tous les moteurs de rendu upnp de votre réseau et les ajoute sous forme de puits à pulseaudio. Ainsi, vous pouvez contrôler chaque application via pavucontrol pour jouer sur vos appareils upnp.

C’est le genre de confort que j’ai toujours souhaité pour les appareils upnp sous linux.

L’application peut être installée à partir du paquet source ou du paquet DEB téléchargeable à partir de git , ou après avoir ajouté le ppa officiel du projet: qos / pulseaudio-dlna à nos sources avec:

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

Nous exécutons ensuite pulseaudio-dlna à partir de la ligne de commande avec les options suivantes:

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

Voir aussi le pulseaudio-dlna "About" pour plus.

Lorsqu'un rendu DLNA était présent, vous pouvez le sélectionner dans le menu Son en tant que récepteur de sortie:

entrez la description de l'image ici


3
Belle application - merci! A bien fonctionné sur mes appareils, y compris un téléviseur intelligent Samsung (UE40ES6100). Juste une remarque: nous avions également besoin python-requestsd'une dépendance et nous pouvions sélectionner le rendu à partir des contrôles audio par défaut - pas besoin d'installer pavucontrol.
Takkat

Content que tu aimes ça. Je viens de mettre à jour le fichier README. Merci pour l'allusion!
Massimo

2
Excellente solution. Merci. Mais j'ai une question: il y a un délai de lecture de plusieurs secondes (10 secondes après avoir appuyé sur pause dans VLC). S'agit-il d'une "fonctionnalité" DLNA ou existe-t-il un moyen de la réduire? Donc, DLNA n'a pas de sens pour la lecture vidéo ou les jeux? :(
JPT

2
Le délai provient du remplissage du tampon HTTP. Il garde le flux en cours au cas où votre connexion aurait des problèmes (wifi faible, etc.). Si vous souhaitez réduire le délai, utilisez un codec qui nécessite beaucoup de bande passante ( wav ) pour remplir ce tampon plus rapidement. La connexion par câble aide toujours. Sinon, cela est très spécifique à la mise en œuvre du firmware de votre fabricant. Par exemple, j'ai un délai avec Cocy environ 1 seconde. Sonos Play 1 avec wav: 1 seconde, avec mp3: 5 secondes. Tous connectés via un câble. Mais vous ne vous en débarrasserez pas complètement. Le but principal est la musique et les livres audio. Tout ce qui n'a pas besoin d'être synchronisé.
Massimo

1
@JPT et tous les autres à la recherche d'un moyen de régler le retard (10 secondes pour moi): À l'aide de shairport-sync, je lance un évier AirPlay sur mon RaspberryPi en parallèle de celui du DLNA et je dois dire que les retards sont beaucoup plus courts (~ 2s pour démarrer, l’arrêt est immédiat). Cela étant dit, merci beaucoup à Massimo car, oubliant le délai, pulseaudio-dlna fonctionne à merveille et est vraiment facile à installer! (AirPlay était un peu plus difficile à configurer pour moi.)
mercredi

8

Pavucontrol est l’élément manquant de ce puzzle! J'avais également tout configuré correctement et le périphérique externe (téléviseur LG) indiquait que le son était en cours de lecture, mais je n'ai entendu aucun son. Aujourd'hui, j'ai installé pavucontrol et, lorsque je l'ai ouvert, j'ai trouvé l'option de canaliser le son via le serveur DLNA. L’option DLNA n’est affichée que lorsqu’un son est reproduit par pulseaudio. entrez la description de l'image ici


Merci de partager cela. Comment avez-vous configuré le serveur DLNA? Pour moi, atm Rygel quitte avec des segfaults plutôt inutiles.
Takkat

Je viens de réglages normaux. J'ai suivi le même lien que vous avez mentionné dans votre message. [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

Bizarre. Avec Rhythmbox, les segfaults ont disparu mais je n’obtiens toujours que Invalid seek requestde Rygel. Les répertoires de médias sont là, mais mon flux GST est toujours EOF.
Takkat

Excellent ajout, il vous permet de définir un évier pour chaque application pouvant lire de l'audio! Je peux écouter de la musique sur ma grande chaîne stéréo et conserver des vidéos ou des sons de jeu sur mon ordinateur. Merci!
chargé de printemps le

Cela a résolu mon problème lorsque tout était connecté et en train de jouer, mais que le son manquait!
easwee

4

Je suis désolé de ne pouvoir vous aider du tout avec Rygel, mais il existe peut-être une alternative qui pourrait fonctionner pour vous.

Le principe est d'obtenir un programme pour enregistrer le flux dans un fichier audio, puis lancer miniDLNA avec une configuration personnalisée qui pointe vers le répertoire dans lequel se trouve le flux.

Exemple: Disons que nous travaillons dans ~ / stream /. Créer ~ / 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

Enregistrez ensuite le flux dans un fichier audio de ce répertoire. Googler pour "FFmpeg record sound card sound" a donné cette commande

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

mais je n'ai pas eu beaucoup de chance avec ça. Une autre option est vlc si vous avez une interface graphique disponible et cela ne fonctionne pas.

Ensuite, démarrez miniDLNA dans une autre fenêtre de terminal:

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

Il doit localiser OutputStream.flac, puis être accessible à partir de votre périphérique réseau.

Espérons que si vous ne l'avez pas déjà résolu, cela vous donnera quelques idées.


1
Une approche prometteuse - merci - mais il reste à préciser. Avec un test rapide avec miniDLNA aujourd'hui, je n'ai pas pu obtenir le fichier de flux reconnu par mon client DLNA. De plus, les flux produits par ffmpeg semblent plutôt médiocres (bruit statique). J'y suis et je vous tiens au courant.
Takkat

Jusqu'à présent, nous sommes en mesure de générer un fichier audio flac ou mp3 à partir du récepteur audio avec ffmpeg ou avconv. Cependant, ce fichier ne sera pas reconnu par miniDLNA à moins que nous arrêtions l'enregistrement. Ensuite, nous pouvons rouvrir ce fichier sur le client DLNA tout en enregistrant une autre instance, mais le flux commence toujours à partir du début de l’enregistrement et s’arrête au moment où nous avons commencé à écouter le client. Des idées comment surmonter cela?
Takkat

Alors, voulez-vous dire qu'une fois que vous avez interrompu le processus ffmpeg pour arrêter l'enregistrement, le fichier est-il reconnu par miniDLNA? De plus, la qualité audio est-elle meilleure? Je vais l'essayer sur ma machine et voir si je peux le remettre en marche. (J'avais quelque chose de similaire qui travaillait l'année dernière pour le transcodage de films à la volée)
mtdevans

Oui en premier lieu. Deuxième fois, je peux accéder au client, mais cela commence au début (c’est-à-dire chaque fois que je commence à enregistrer) et s’arrête au milieu (c.-à-d. Exactement après le temps écoulé entre le début de l’enregistrement et la réception sur le client). Le son fonctionne bien maintenant, il a fallu désactiver le mode duplex.
Takkat

4

Une des idées que je devais diffuser "ce que j’entendais" dans un moteur de rendu DLNA (comme WDTV) était de servir le flux avec VLC comme flux http avec pulse://alsa_output.xxx.monitorcomme entrée et de le transcoder au format MP3 ou FLAC. Ensuite, je voulais utiliser un point de contrôle DLNA pour laisser le moteur de rendu lire le flux. VLC sert correctement le flux transcodé, mais il ne permet pas de définir le type mime, de sorte que le moteur de rendu refuse de le lire.

L'idée suivante était d'écrire un serveur http en python qui sert plutôt le flux. Il obtient le flux audio d'impulsion avec parec, le code avec flac( lameou ce que vous voulez) et définit correctement le type MIME.

Cela fonctionne avec le script suivant (très simple):

#!/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()

Ajustez les paramètres, exécutez-le et pointez le moteur de rendu DLNA sur votre machine. Cela fonctionnait pour moi avec un WDTV en tant que moteur de rendu et un téléphone Android avec BubbleUPnP en tant que point de contrôle (vous pouvez taper l'URL du flux lorsque vous ajoutez manuellement un nouvel élément à la liste de lecture). Mais cela devrait fonctionner avec tous les périphériques compatibles DLNA.


4

REMARQUE: cette solution fonctionne, mais Massimo a proposé une solution plus récente et probablement meilleure .

Voici une réponse pour Ubuntu 14.04 (également testé et fonctionnant le 15.04 ), par souci de complétude:

  1. installer tous les paquets nécessaires: sudo apt-get install rygel rygel-preferences rygel-gst-launch

  2. créez le fichier ~/.config/rygel.confcontenant les éléments suivants:

    [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. Exécutez les commandes suivantes à partir de la ligne de commande (vous pouvez les insérer dans un script si vous le souhaitez):

    pactl load-module module-http-protocol-tcp
    pactl load-module module-rygel-media-server 
    rygel &
    
  4. Exécutez la paprefscommande et assurez-vous que les deux options DLNA sont activées (cochées) dans l'onglet "Serveur réseau".

  5. Jouez de l'audio sur votre ordinateur. Exécutez le pavucontrolprogramme et, dans l'onglet "Lecture", réglez le périphérique de sortie sur "Diffusion DLNA / UPnP".

À ce stade, vous devriez pouvoir lire les flux MPEG et FLAC à partir d’un client DLNA (convertisseur de rendu / point de contrôle).

REMARQUE: vous devrez peut-être redémarrer votre ordinateur (ou redémarrer pulse) pour que tout commence à fonctionner.


3

Le script python d'Adam est exactement ce dont j'avais besoin. Brillant. Rygel avec gst-launch ne fonctionne pas avec l'un de mes moteurs de rendu, mais ce script fonctionne avec les deux. Dans mon cas, je prends une entrée de flux audio de squeezelite (pour squeezebox) et l’envoie à un moteur de rendu. Le script fonctionne également dans sa forme originale pour prendre les entrées d’un moniteur pulseaudio si c’est ce qui est nécessaire.

En connaissant peu de tout cela, j'ai réussi à ajouter quelques éléments au script qui:

i) autoriser son exécution depuis un script shell et se terminer par un SIGTERM / SIGKILL (la déclaration "sauf" inclut désormais "systemexit")

ii) permet d'arrêter le script, de le redémarrer et de réutiliser le même port (car il s'agissait du script redémarré qui avait tendance à échouer en indiquant qu'il ne pouvait pas ouvrir le port s'il était toujours ouvert) - (l'instruction allow_reuse_address = True)

iii) créer une version qui prend une entrée de stdin et la ré-échantillonne en utilisant sox pour une sortie au format wav (sur le port 8082)

Donc, ma version ressemble à:

#!/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()

1
J'ai trouvé quelques problèmes mineurs avec ce script.
Pastim

@Adam - Après plusieurs essais, j'ai trouvé quelques problèmes mineurs avec ce programme. Cependant, le plus gros problème est que la diffusion en continu s'arrête avec l'erreur 32 (canal cassé) après une durée directement proportionnelle à la quantité de données envoyée. Pour un flux de qualité 24/96 000, cela représente un peu plus d’une heure. Au 24/192000 c'est un peu plus de 30 minutes. Pour la qualité du CD un peu plus de 3 heures. En sélectionnant à nouveau le flux sur le rendu, le flux redémarre. Je crois que la solution peut être un «encodage en bloc». Je me demandais si quelqu'un avait produit une version en morceaux.
pastim

1

Je ne sais pas si cela vous sera utile maintenant, mais j’ai écrit dans un post sur comment le faire fonctionner sur Ubuntu 12.10:

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


Merci de partager cela - c’est exactement ce qui jusqu’à présent a toujours échoué avec moi. Depuis la conception de ce site, nous aimerions vous encourager à décrire les étapes que vous avez suivies (en plus de simplement poster le lien vers votre blog), car les liens peuvent disparaître avec le temps, laissant ainsi votre réponse inutile. Je vous recontacterai dès que j'ai pu tester cela.
Takkat

Voici mes observations jusqu'à présent: suivre votre guide bloque Rygel avec SEGFAULT lors de la sélection du flux audio à partir du client dans 12.04. En 12.10, nous ne pouvons pas créer de flux avec GST-Launch. Quelque chose manque?
Takkat

La question portait sur 12.04 et cette réponse est pour Ubuntu 12.10, sinon je voterais. :)
jeudi

Personne du futur ici: ce lien a pourri. : P
datashaman

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.