Как настроить прямые аудиопотоки на устройстве, совместимом с DLNA?

Есть ли способ потоковой передачи выходного сигнала звуковой карты с нашего настольного компьютера 12.04.1 LTS amd64 на внешнее устройство, совместимое с DLNA, в нашей сети? Выбор медиа-контента в общих каталогах с использованием Rygel, miniDLNA и uShare всегда удобен, но до сих пор мы полностью не смогли передать живой аудиопоток клиенту через DLNA.

Pulseaudio утверждает, что имеет медиа-сервер DLNA / UPnP, который вместе с Ригелем должен делать именно это. Но мы не смогли запустить его.

Мы следовали шагам, изложенным в live.gnome.org , , этот ответ здесь, а также в другом аналогичном руководстве .


В 12.04 LTS мы можем выбрать локальное аудиоустройство или наш поток GST-Launch в клиенте DLNA, но Rygel отображает следующее сообщение, и клиент заявляет, что он достиг конца из списка воспроизведения:

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

Не было возможности прослушивать живые аудиопотоки на клиенте.


Только после обновления дистрибутива до 14.04 LTS мы смогли выбрать прямой эфир на наших DLNA-рендерерах из настроек , описанных в ответе ниже . Тем не менее, нам нужно было выбрать установленный поток после того, как мы запустили rygel и не смогли отправить новый поток на наши устройства UPnP. Аудио метаданные не были переданы.


Существуют ли другие альтернативы для отправки аудио нашей звуковой карты в качестве живого потока на клиент DLNA?

54
задан 13 April 2017 в 15:24

7 ответов

Pulseaudio-DLNA

Я создал небольшой сервер, который обнаруживает все рендеры upnp в вашей сети и добавляет их в качестве приемников в pulseaudio. Таким образом, вы можете контролировать каждое приложение через pavucontrol для воспроизведения на ваших устройствах upnp.

Это тот комфорт, который я всегда хотел иметь при работе с устройствами upnp под linux.

Приложение может быть установлено из исходного кода или из пакета DEB , загружаемого из git , или после того, как мы добавили официальный проект ppa: qos / pulseaudio-dlna к нашим источникам:

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

Затем мы запускаем pulseaudio-dlna из командной строки со следующими параметрами:

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

См. также pulseaudio-dlna «О программе» [ 114] для более.

Когда присутствовал DLNA-рендеринг, мы можем выбрать его из звукового меню в качестве выходного приемника:

enter image description here

0
ответ дан 13 April 2017 в 15:24

Pavucontrol - недостающий элемент в этой головоломке! Я также все правильно настроил, и внешнее устройство (LG TV) показывало, что звук воспроизводится, но я не слышал звука. Сегодня я установил pavucontrol и, открыв его, нашел возможность передавать звук через сервер DLNA. Опция DLNA отображается только при наличии звука, выводимого с проигрывателя на pulseaudio. enter image description here

0
ответ дан 13 April 2017 в 15:24

Python-скрипт от Адама - это как раз то, что мне нужно. Brilliant. Rygel с gst-launch не работает с одним из моих рендеров, но этот скрипт работает с обоими. В моем случае я беру входной аудиопоток из squeezelite (для squeezebox) и отправляю рендереру. Сценарий также работает в исходном виде, чтобы получать данные от монитора импульса, если это то, что нужно.

Немного зная обо всем этом, мне удалось внести некоторые дополнения в сценарий, которые:

i) позволяют запускать его из сценария оболочки и завершать с помощью SIGTERM / SIGKILL («кроме») оператор теперь включает 'systemexit')

ii) позволяет скрипту останавливаться и перезапускаться и повторно использовать тот же порт (так как это был перезапущенный скрипт, который имел тенденцию давать сбой, говоря, что он не может открыть порт, если средство визуализации он все еще оставался открытым) - (оператор allow_reuse_address = True)

iii) сделать версию, которая принимает входные данные из stdin и повторно выбирает ее, используя sox для вывода в формате wav (на порту 8082)

Итак, моя версия выглядит так:

#!/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()
0
ответ дан 13 April 2017 в 15:24

Мне жаль, что я не могу помочь вам с Ригелем, но может быть альтернатива, которая может работать для вас.

Принцип заключается в том, чтобы получить программу для записи потока в аудиофайл, а затем запустить miniDLNA с пользовательской конфигурацией, которая указывает на каталог, в котором находится поток.

Пример: скажем, мы работаем в ~ / stream /. Создайте ~ / 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

Затем сохраните поток в аудиофайл в этом каталоге. Поиск в Google для записи звука звуковой карты FFmpeg дал эту команду

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

, но мне не очень повезло с ней. Другой вариант - vlc, если у вас есть графический интерфейс, и это не работает.

Затем загрузите miniDLNA в другом окне терминала:

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

Он должен найти OutputStream.flac и затем быть доступным с вашего сетевого устройства.

Будем надеяться, что если вы еще не решили эту проблему, это даст вам несколько идей.

0
ответ дан 13 April 2017 в 15:24

Одна идея, которую мне пришлось передать «то, что я слышу» на рендерер DLNA (например, WDTV), состояла в том, чтобы серверный поток был обработан с VLC как поток http с входным сигналом pulse://alsa_output.xxx.monitor и транскодировать его в MP3 или FLAC. Затем я хотел использовать некоторую контрольную точку DLNA, чтобы позволить рендереру воспроизводить поток. VLC правильно обслуживает транскодированный поток, но не позволяет установить тип MIME, поэтому средство визуализации отказывается его воспроизводить.

Следующей идеей было написать http-сервер на python, который вместо этого будет обслуживать поток. Он получает аудиопоток от импульса с помощью parec, кодирует его с помощью flac (или lame, или как вам угодно) и правильно устанавливает тип пантомимы.

Он работает со следующим (очень простым) скриптом:

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

Настройте параметры, запустите его и укажите DLNA-рендер на вашем компьютере. У меня это работало с WDTV в качестве средства рендеринга и телефоном Android с BubbleUPnP в качестве контрольной точки (Вы можете ввести URL потока при добавлении нового элемента в список воспроизведения вручную). Но он должен работать с любыми устройствами, совместимыми с DLNA.

0
ответ дан 13 April 2017 в 15:24

ПРИМЕЧАНИЕ. Это решение работает, но Массимо предложил более новое и, вероятно, лучшее решение .

Вот ответ для Ubuntu 14.04 (также протестирован и работает на 15.04 ), для полноты:

  1. установите все необходимые пакеты: sudo apt-get install rygel rygel-preferences rygel-gst-launch

  2. создайте файл ~/.config/rygel.conf, который содержит следующее:

    [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. Выполните следующие команды из командной строки (эти при желании может быть помещен в сценарий):

    pactl load-module module-http-protocol-tcp
    pactl load-module module-rygel-media-server 
    rygel &
    
  4. Запустите команду paprefs и убедитесь, что обе опции DLNA включены (отмечены) на вкладке «Сетевой сервер» .

  5. Воспроизвести аудио на своем компьютере. Запустите программу pavucontrol и на вкладке «Воспроизведение» измените устройство вывода на «Потоковая передача DLNA / UPnP».

На этом этапе вы сможете воспроизводить потоки MPEG и FLAC с клиента DLNA (средство визуализации / контрольная точка).

ПРИМЕЧАНИЕ: вам может потребоваться перезагрузить компьютер (или перезапустить импульс), чтобы все заработало.

0
ответ дан 13 April 2017 в 15:24

Не уверен, будет ли это полезно для вас сейчас, но я написал пост о том, как заставить это работать в Ubuntu 12.10:

http://dpc.ucore.info/blog/ 2012/11 / 07 / DLNA-потокового-в-убунту-12-дот-10 /

0
ответ дан 13 April 2017 в 15:24

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

Похожие вопросы: