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

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

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

Мы выполнили шаги, изложенные в 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?

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 "About" для более подробной информации.

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

введите описание изображения здесь

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

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

Вот ответ для 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 (средство визуализации / контрольная точка).

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

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

Принцип заключается в том, чтобы получить программу для записи потока в аудиофайл, а затем запустить 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 и затем быть доступным с вашего сетевого устройства.

Надеюсь, если вы еще не решили, что это даст вам несколько идей.

Одна идея, которую я должен был передать "то, что я слышу" на рендерер 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.

Скрипт 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()

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

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

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