Como configuro os fluxos de áudio ao vivo para um dispositivo compatível com DLNA?

48

Existe uma maneira de transmitir a saída ao vivo da placa de som de nosso desktop 12.04.1 LTS amd64 para um dispositivo externo compatível com DLNA em nossa rede? Selecionar conteúdo de mídia em diretórios compartilhados usando Rygel, miniDLNA e uShare é sempre bom - mas até agora nós falhamos completamente em obter um fluxo de áudio ao vivo para um cliente via DLNA.

O Pulseaudio afirma ter um servidor de mídia DLNA / UPnP que, junto com Rygel, deveria fazer exatamente isso. Mas não conseguimos executá-lo.

Seguimos as etapas descritas em live.gnome.org , esta resposta aqui, e também em outro similar guia .

Em 12.04 LTS podemos selecionar o dispositivo de áudio local, ou o fluxo de GST-Launch no cliente DLNA, mas o Rygel exibe a seguinte mensagem e o cliente informa que atingiu o final da lista de reprodução:

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

Não havia como ouvir os fluxos de áudio ao vivo no cliente.

Somente após uma atualização de distribuição para 14.04 LTS , conseguimos selecionar uma transmissão ao vivo em nossos renderizadores DLNA a partir de configurações bem delineado na resposta abaixo . Ainda assim, precisávamos selecionar um fluxo estabelecido depois que começássemos o rygel e não pudéssemos enviar um novo fluxo para nossos dispositivos UPnP. Metadados de áudio não foram transmitidos.

Existem outras alternativas para enviar o áudio de nossa placa de som como transmissão ao vivo para um cliente DLNA?

    
por Takkat 12.09.2012 / 20:42

7 respostas

54

Pulseaudio-DLNA

Eu criei um pequeno servidor que descobre todos os representantes upnp em sua rede e os adiciona como repositores para pulseaudio. Assim você pode controlar cada aplicação via pavucontrol para jogar em seus dispositivos upnp.

Esse é o tipo de conforto que eu sempre quis quando lidava com dispositivos upnp no linux.

O aplicativo pode ser instalado a partir do código-fonte ou do pacote DEB que pode ser baixado do git , ou depois de adicionarmos o oficial do projeto < strong> ppa: qos / pulseaudio-dlna para as nossas fontes com:

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

Em seguida, executamos o pulseaudio-dlna a partir da linha de comando com as seguintes opções:

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

Veja também o pulseaudio-dlna "Sobre" para saber mais.

Quando havia um renderizador DLNA presente, podemos selecioná-lo no menu de som como um coletor de saída:

    
por Massimo 30.12.2014 / 17:06
7

Pavucontrol é o item que falta neste quebra-cabeça! Eu também tinha configurado tudo corretamente e o dispositivo externo (LG TV) estava mostrando que o som estava sendo reproduzido, mas eu não ouvi nenhum som. Hoje instalei o pavucontrol e quando o abri achei a opção de canalizar som através do servidor DLNA. A opção DLNA só é mostrada quando há saída de som de um player para pulseaudio.

    
por jumbli 22.12.2012 / 13:51
4

Sinto muito não poder ajudar você com o Rygel, mas pode haver uma alternativa que funcione para você.

O princípio é obter um programa para gravar o fluxo em um arquivo de áudio e, em seguida, iniciar o miniDLNA com uma configuração personalizada que aponta para o diretório em que o fluxo está.

Exemplo: digamos que estamos trabalhando em ~ / stream /. Crie ~ / 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

Em seguida, salve o fluxo em um arquivo de áudio nesse diretório. Pesquisando "FFmpeg grava áudio da placa de som", esse comando é obtido

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

mas eu não tive muita sorte com isso. Outra opção é vlc se você tem uma GUI disponível e isso não funciona.

Em seguida, inicialize o miniDLNA em outra janela de terminal:

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

deve localizar OutputStream.flac e, em seguida, ser acessível a partir do seu dispositivo de rede.

Espero que, se você ainda não o tenha resolvido, tenha algumas ideias.

    
por mtdevans 16.10.2012 / 20:51
4

Uma idéia que tive de transmitir "o que eu ouvi" para um renderizador DLNA (como WDTV) foi para servidor do fluxo com VLC como fluxo http com pulse://alsa_output.xxx.monitor como entrada e transcodificá-lo para MP3 ou FLAC. Então eu queria usar algum ponto de controle DLNA para permitir que o renderizador reproduzisse o fluxo. O VLC serve corretamente o fluxo transcodificado, mas não permite definir o tipo de mime, portanto, o renderizador se recusa a reproduzi-lo.

A próxima ideia foi escrever um servidor http em python que serve o fluxo. Ele obtém o fluxo de áudio do pulso com parec , codifica com flac (ou lame ou o que você quiser) e define o tipo de mímica corretamente.

Funciona com o seguinte script (muito simples):

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

Ajuste os parâmetros, execute-o e aponte o renderizador DLNA para sua máquina. Ele funcionou para mim com um WDTV como renderizador e um telefone Android com o BubbleUPnP como ponto de controle (você pode digitar o URL do fluxo ao adicionar um novo item à lista de reprodução manualmente). Mas deve funcionar com qualquer dispositivo compatível com DLNA.

    
por Adam 23.12.2013 / 02:07
4

NOTA: Esta solução funciona, mas uma solução mais recente e provavelmente melhor foi proposta por Massimo.

Aqui está uma resposta para o Ubuntu 14.04 (também testado e trabalhando em 15.04 ), para completar:

  1. instale os pacotes necessários: sudo apt-get install rygel rygel-preferences rygel-gst-launch

  2. crie o arquivo ~/.config/rygel.conf que contém o seguinte:

    [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. Execute os seguintes comandos a partir da linha de comando (estes podem ser colocados em um script, se desejado):

    pactl load-module module-http-protocol-tcp
    pactl load-module module-rygel-media-server 
    rygel &
    
  4. Execute o comando paprefs e verifique se as duas opções de DLNA estão ativadas (marcadas) na guia "Network Server".

  5. Reproduza algum áudio no seu computador. Execute o programa pavucontrol e, na guia "Reprodução", altere o dispositivo de saída para "DLNA / UPnP Streaming".

Neste ponto, você deve ser capaz de reproduzir os fluxos MPEG e FLAC de um cliente DLNA (renderer / control point).

NOTA: pode ser necessário reiniciar o computador (ou reiniciar o pulso) para que as coisas comecem a funcionar.

    
por Mark 20.06.2014 / 05:52
3

O script python de Adam é exatamente o que eu precisava. Brilhante. Rygel com gst-launch não funciona com um dos meus renderizadores, mas este script funciona com ambos. No meu caso eu estou tomando uma entrada de fluxo de áudio de squeezelite (para squeezebox) e enviando para um renderizador. O script também funciona na forma original para receber informações de um monitor pulseaudio, se necessário.

Sabendo pouco sobre isso eu consegui fazer algumas adições ao script que:

i) permitir que ele seja executado a partir de um script de shell e ser finalizado com um SIGTERM / SIGKILL (a instrução 'except' agora inclui 'systemexit')

ii) permite que o script seja interrompido e reiniciado e reutilize a mesma porta (como era o script reiniciado tendia a falhar dizendo que ele não poderia abrir a porta se o renderizador ainda tivesse aberto) - (o allow_reuse_address = Declaração verdadeira)

iii) faça uma versão que receba entrada de stdin e a reveja usando sox para a saída no formato wav (na porta 8082)

Então minha versão parece:

#!/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()
    
por pastim 05.06.2014 / 21:36
1

Não tenho certeza se isso será útil para você agora, mas escrevi um post sobre como fazer isso funcionar no Ubuntu 12.10:

link

    
por dpc.pw 07.11.2012 / 03:16