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

51

Existe-t-il un moyen de diffuser la sortie en direct de la carte son depuis notre bureau 12.04.1 LTS amd64 vers un périphérique externe compatible DLNA sur notre réseau? La sélection du contenu multimédia dans les répertoires partagés à l'aide de Rygel, miniDLNA et uShare est toujours une bonne chose - mais jusqu'à présent, nous n'avons pas réussi à envoyer un flux audio en direct à 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, et aussi dans 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 déclare avoir atteint la fin de la liste de lecture:

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

Il n’existait 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 moteurs de rendu DLNA à partir de paramètres décrit ci-dessous réponse . Cependant, nous devions sélectionner un flux établi après le lancement de rygel et l’impossibilité de transférer un nouveau flux vers nos périphériques UPnP. Les métadonnées audio n'ont pas été transmises.

Existe-t-il d’autres alternatives pour envoyer l’audio de notre carte son en direct à un client DLNA?

    
posée Takkat 12.09.2012 - 20:42
la source

7 réponses

56

Pulseaudio-DLNA

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

C'est le genre de confort dont j'ai toujours rêvé lorsque je travaillais avec des appareils UPNP sous Linux.

L'application peut être installée à partir du package source ou DEB téléchargeable à partir de git , ou après avoir ajouté le responsable du projet < strong> ppa: 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 également la pulseaudio-dlna "À propos de" pour en savoir plus.

En présence d’un moteur de rendu DLNA, nous pouvons le sélectionner dans le menu son comme récepteur de sortie:

    
réponse donnée Massimo 30.12.2014 - 17:06
la source
7

Pavucontrol est l’élément manquant de ce puzzle! J'avais également tout configuré correctement et l'appareil externe (LG TV) montrait que le son était en cours de lecture mais je n'entendais 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 ne s'affiche que lorsqu'un son est émis par un lecteur vers pulseaudio.

    
réponse donnée jumbli 22.12.2012 - 13:51
la source
4

Je suis désolé je ne peux pas vous aider avec Rygel du tout, mais il peut y avoir une alternative qui pourrait fonctionner pour vous.

Le principe est d'obtenir un programme pour enregistrer le flux sur un fichier audio, puis lancez 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éez ~ / 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 dans ce répertoire. Googler pour "FFmpeg record sound card audio" 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 est que 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 devrait localiser OutputStream.flac, puis être accessible depuis votre périphérique réseau.

J'espère que si vous ne l'avez pas déjà fait, cela vous a donné quelques idées.

    
réponse donnée mtdevans 16.10.2012 - 20:51
la source
4

Une idée que je devais diffuser "ce que j'entendais" à un moteur de rendu DLNA (comme WDTV) était de gérer le flux avec VLC en tant que flux http avec pulse://alsa_output.xxx.monitor en entrée et le transcoder en MP3 ou FLAC. Ensuite, je voulais utiliser un point de contrôle DLNA pour laisser le moteur de rendu jouer le flux. VLC ne diffuse pas correctement le flux transcodé, mais 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 le flux à la place. Il obtient le flux audio d'impulsion avec parec , l'encode avec flac (ou lame ou tout ce que vous voulez) et définit le type MIME correctement.

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

#!/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 a fonctionné pour moi avec un WDTV comme moteur de rendu et un téléphone Android avec BubbleUPnP comme point de contrôle (vous pouvez taper l'URL du flux lorsque vous ajoutez un nouvel élément à la liste de lecture manuellement). Mais il devrait fonctionner avec tous les périphériques compatibles DLNA.

    
réponse donnée Adam 23.12.2013 - 02:07
la source
4

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

Voici une réponse pour Ubuntu 14.04 (également testée et fonctionnant sur 15.04 ), pour être complet:

  1. installez les paquetages nécessaires: sudo apt-get install rygel rygel-preferences rygel-gst-launch

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

    [GstLaunch]
    enabled=true
    [email protected]@'s stream
    launch-items=myaudioflac;myaudiompeg
    
    myaudioflac-title=FLAC audio on @[email protected]
    myaudioflac-mime=audio/flac
    myaudioflac-launch=pulsesrc device=upnp.monitor ! flacenc quality=8
    
    myaudiompeg-title=MPEG audio on @[email protected]
    myaudiompeg-mime=audio/mpeg
    myaudiompeg-launch=pulsesrc device=upnp.monitor ! lamemp3enc target=quality quality=6
    
    [Playbin]
    enabled=true
    title=Audio/Video playback on @[email protected]'s computer
    
    [general]
    interface=
    upnp-enabled=true
    
    [MediaExport]
    uris=
    
  3. Exécutez les commandes suivantes à partir de la ligne de commande (celles-ci peuvent être placées 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 commande paprefs et vérifiez 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 programme pavucontrol et, dans l'onglet "Lecture", remplacez le périphérique de sortie par "DLNA / UPnP Streaming".

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

REMARQUE: vous devrez peut-être redémarrer votre ordinateur (ou redémarrer votre impulsion) pour que les choses commencent à fonctionner.

    
réponse donnée Mark 20.06.2014 - 05:52
la source
3

Le script python d'Adam est juste 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 un flux audio provenant de squeezelite (pour squeezebox) et l'envoie à un moteur de rendu. Le script fonctionne également sous sa forme originale pour saisir les données d’un moniteur pulseaudio si cela est nécessaire.

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

i) lui permettre d’être exécuté à partir d’un script shell et se terminer par un SIGTERM / SIGKILL (l’instruction 'except' inclut désormais 'systemexit')

ii) permet d'arrêter et de redémarrer le script et de réutiliser le même port (comme c'était le cas, le script redémarré avait tendance à ne pas pouvoir ouvrir le port si le moteur de rendu était toujours ouvert) - (the allow_reuse_address = Déclaration vraie)

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

Ma version ressemble donc à:

#!/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()
    
réponse donnée pastim 05.06.2014 - 21:36
la source
1

Je ne suis pas sûr que ce soit utile pour vous maintenant, mais j'ai écrit un article à ce sujet sur le fonctionnement de Ubuntu 12.10:

lien

    
réponse donnée dpc.pw 07.11.2012 - 03:16
la source

Lire d'autres questions sur les étiquettes