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


54

Есть ли способ потоковой передачи звуковой карты в режиме реального времени с нашего настольного компьютера 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?


Можете ли вы избежать потоковой передачи DLNA с вашего приемника? Мое решение состоит в том, чтобы передать поток pulseaudio по HTTP, см. Больше здесь: sandalov.org/blog/1441
DmitrySandalov

Извините, нет, я действительно хочу, чтобы DLNA работала, потому что DLNA широко применяется только на различных клиентах (телевизорах, AV-ресиверах, проигрывателях Blueray и т. Д.).
Таккат

Таккат, решение, о котором я говорю, решило проблему потоковой передачи на мой AVR. Если вы действительно хотите запустить сервер DLNA, у меня был положительный опыт работы с rygel + pulseaudio 12.04 (после 'pacmd load-module module-http-protocol-tcp'), 12.10 я получил те же предупреждения 'Invalid search request' ,
ДмитрийСандалов

@DmitrySandalov: было бы очень здорово, если бы вы поделились подробностями о том, как вам удалось настроить Rygel для прямой трансляции импульса и звука.
Таккат

Ответы:


63

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-рендер, мы можем выбрать его из звукового меню в качестве выходного приемника:

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


3
Отличное приложение - спасибо! Хорошо работал на моих устройствах, включая Samsung Smart TV (UE40ES6100). Просто примечание: мы также нуждались python-requestsв качестве зависимости, и мы могли выбрать рендерер из элементов управления аудио по умолчанию - не нужно устанавливать pavucontrol.
Таккат

Рад, что вам это нравится. Я только что обновил README. Спасибо за подсказку!
Массимо

2
Отличное решение. Благодарю. Но у меня есть один вопрос: задержка воспроизведения составляет несколько секунд (10 секунд после нажатия паузы в VLC). Это DLNA "особенность" или есть способ ее уменьшить? Так что DLNA не имеет смысла для воспроизведения видео или игр? :(
JPT

2
Задержка происходит из-за заполнения буфера HTTP. Он поддерживает воспроизведение потока, если у вас проблемы с подключением (слабый Wi-Fi и т. Д.). Если вы хотите уменьшить задержку, используйте кодек, которому требуется большая пропускная способность ( wav ), чтобы быстрее заполнить этот буфер. Кабельное соединение всегда помогает. В противном случае это очень зависит от реализации прошивки вашего производителя. Например, у меня задержка с Коци около 1 секунды. Sonos Воспроизведение 1 с wav: 1 секунда, с mp3: 5 секунд. Все подключено через кабель. Но вы не избавитесь от этого полностью. Основное назначение - музыка и аудиокниги. Все, что не должно быть синхронизировано.
Массимо

1
@JPT и все остальные, которые ищут способ исправить задержку (для меня 10 секунд ): Используя shairport-sync, я запускаю приемник AirPlay на моем RaspberryPi параллельно приемнику DLNA и должен сказать, что задержки намного короче (~ 2s, чтобы начать; остановка немедленно). Это, как говорится, большое спасибо Массимо, потому что, забывая о задержке, pulseaudio-dlna работает как шарм и действительно тривиально установить! (AirPlay было довольно
сложно

8

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


Спасибо за то, что поделился этим. Как вы настроили сервер DLNA? Для меня Ригель уходит с довольно бесполезными сегментами.
Таккат

У меня просто нормальные настройки. Я перешел по той же ссылке, что вы упомянули в своем посте. [GstLaunch] enabled = true launch-items = audiotestsrc; audiotestsrc-title = Desktop Live Streaming! audiotestsrc-mime = audio / mpeg audiotestsrc-launch = Pulsesrc устройство = upnp.monitor! lamemp3enc target = качество качество = 6
jumbli

Weird. С Rhythmbox segfaults исчезли, но я все еще получаю только Invalid seek requestот Rygel. Медиа-каталоги есть, но мой GST-поток всегда EOF.
Таккат

Отличное дополнение, оно позволяет установить приемник для каждого приложения, которое может воспроизводить аудио! Я могу слушать музыку на своем большом стерео и сохранять видео или звуки игр на своем компьютере. Спасибо!
скачено

Это решило мою проблему, когда все было подключено и играло, но отсутствовал только звук!
Пасхальное

4

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

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

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


1
Перспективный подход - спасибо - но он нуждается в дальнейшей доработке. С сегодняшним быстрым тестом с miniDLNA я не смог распознать потоковый файл моим DLNA-клиентом. Кроме того, потоки, создаваемые ffmpeg, кажутся довольно плохими (статический шум). Я на это и дам тебе знать.
Таккат

До сих пор мы могли генерировать звуковой файл flac или mp3 из аудио приемника с помощью ffmpeg или avconv. Однако этот файл не будет распознан miniDLNA, если мы не прекратим запись. Затем мы можем снова открыть этот файл на клиенте DLNA во время записи другого экземпляра, но поток всегда начинается с начала записи и останавливается в то время, когда мы начали прослушивание на клиенте. Есть идеи как это побороть?
Таккат

Итак, вы имеете в виду, как только вы прервали процесс ffmpeg, чтобы остановить запись, только тогда файл распознается miniDLNA? Кроме того, качество звука лучше? Я опробую его на своей машине и посмотрю, смогу ли я снова его запустить. (У меня было нечто подобное, работавшее в прошлом году для перекодирования фильмов на лету)
mtdevans

Да, во-первых. Во второй раз я могу получить доступ к нему с клиента, но он начинается с начала (т. Е. Всякий раз, когда я начинаю запись) и останавливается в середине (т. Е. После ровно времени между началом записи и началом приема на клиенте). Звук в порядке сейчас, пришлось отключить дуплекс.
Таккат

4

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


4

ПРИМЕЧАНИЕ. Это решение работает, но 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 Streaming».

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

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


3

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

1
Я обнаружил несколько незначительных проблем с этим сценарием.
пастим

@ Adam - После нескольких испытаний я обнаружил несколько незначительных проблем с этой программой. Однако самая большая проблема заключается в том, что потоковая передача прекращается с ошибкой 32 (сломанный канал) по истечении времени, которое прямо пропорционально количеству отправленных данных. Для потока качества 24/96000 это чуть более часа. В 24/192000 это чуть более 30 минут. Для качества CD чуть более 3 часов. При повторном выборе потока на устройстве визуализации поток начинается снова. Я полагаю, что решение может быть «кодированием по частям». Я задавался вопросом, выпустил ли кто-нибудь кусочную версию.
пастим

1

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

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


Спасибо, что поделились этим - это именно то, что до сих пор всегда терпело неудачу со мной. Исходя из дизайна этого сайта, мы хотели бы предложить вам описать шаги, которые вы предприняли (в дополнение к публикации ссылки на ваш блог), потому что ссылки могут со временем исчезать, что делает ваш ответ бесполезным. Я вернусь к вам, как только смогу это проверить.
Таккат

Вот мои наблюдения до сих пор: Следуя вашему руководству, вылетает Rygel с SEGFAULT при выборе аудиопотока от клиента в 12.04. В 12.10 мы не можем создать поток с помощью GST-Launch. Что-нибудь пропало?
Таккат

Вопрос был о 12.04, и этот ответ для Ubuntu 12.10, иначе я бы проголосовал. :)
Jdthood

Человек из будущего здесь: эта связь сгнила. : P
datashaman

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.