Как настроить прямые аудиопотоки на 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

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

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

Есть ли другие альтернативы для отправки звука нашей звуковой карты в виде прямого потока на DLNA-клиент?

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

6 ответов

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

7
ответ дан 25 May 2018 в 06:35
  • 1
    Спасибо за то, что поделился этим. Как вы настроили сервер DLNA? Для меня атакует Райгель с довольно бесполезными секретами. – Takkat 22 December 2012 в 20:31
  • 2
    У меня только обычные настройки. Я выполнил ту же ссылку, что и в вашем сообщении. [GstLaunch] enabled = true launch-items = audiotestsrc; audiotestsrc-title = Desktop Live Streaming! audiotestsrc-mime = аудио / mpeg audiotestsrc-launch = pulsesrc device = upnp.monitor! lamemp3enc target = качество качества = 6 – jumbli 22 December 2012 в 22:10
  • 3
    Weird. С Rhythmbox исчезновения segfaults исчезли, но я все еще получаю Invalid seek request от Rygel. Медиа-каталоги есть, но мой GST-поток всегда EOF. – Takkat 22 December 2012 в 22:50
  • 4
    Отличное дополнение, это позволяет вам устанавливать приемник для каждого приложения, которое может воспроизводить аудио! Я могу слушать музыку на своей большой стереосистеме и записывать видео или звуки на своем компьютере. Благодаря! – springloaded 27 February 2018 в 19:02

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

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

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

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

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

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

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

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

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

4
ответ дан 25 May 2018 в 06:35
  • 1
    Перспективный подход - спасибо, но он нуждается в дальнейшей доработке. С быстрым тестом с miniDLNA сегодня я не смог получить файл потока, распознанный моим клиентом DLNA. Кроме того, потоки, создаваемые ffmpeg, кажутся довольно плохими (статический шум). Я нахожусь в этом и дам вам знать. – Takkat 17 October 2012 в 02:02
  • 2
    До сих пор мы можем генерировать flac или mp3 аудиофайл из аудиозахвата с помощью ffmpeg или avconv. Однако этот файл не будет распознан miniDLNA, если мы не прекратим запись. После этого мы снова можем открыть этот файл на клиенте DLNA при записи другого экземпляра, но поток всегда начинается с начала записи и останавливается в то время, когда мы начали прослушивание на клиенте. Любые идеи, как преодолеть это? – Takkat 27 October 2012 в 20:32
  • 3
    Итак, вы имеете в виду, как только вы нарушили процесс ffmpeg, чтобы остановить запись, только тогда файл распознается miniDLNA? Кроме того, качество звука лучше? Я попробую его на своей машине и посмотрю, смогу ли я снова это сделать. (У меня было что-то подобное в прошлом году для перекодировки фильмов на лету) – mtdevans 27 October 2012 в 21:34
  • 4
    Да, в первую очередь. Во второй раз я могу получить его от клиента, но он начинается с начала (т. Е. Всякий раз, когда я начинаю запись) и останавливается посередине (т. Е. Точно через время между началом записи и началом приема на клиенте). Звук в порядке, пришлось отключить дуплекс. – Takkat 27 October 2012 в 21:37

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

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

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

#!/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
ответ дан 25 May 2018 в 06:35

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

Вот ответ ПРИМЕЧАНИЕ. Это решение работает, но более новое и, вероятно, лучшее решение было предложенный Massimo. (также проверенный и работающий 15.04), для полноты:

установите все необходимые пакеты: sudo apt-get install rygel rygel-preferences rygel-gst-launch создайте файл ~/.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=
Выполнить следующие команды из командной строки (они могут быть помещены в скрипт, если это необходимо):
pactl load-module module-http-protocol-tcp
pactl load-module module-rygel-media-server 
rygel &
Запустите команду paprefs и убедитесь, что обе опции DLNA включены (отмечены) на вкладке «Сетевой сервер». Воспроизводите некоторые аудио на вашем компьютере. Запустите программу pavucontrol, а на вкладке «Воспроизведение» измените устройство вывода на «DLNA / UPnP Streaming».

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

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

4
ответ дан 25 May 2018 в 06:35

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

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

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

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

iii) make версия, которая принимает входные данные из 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()
3
ответ дан 25 May 2018 в 06:35
  • 1
    Я нашел несколько незначительных проблем с этим скриптом. – pastim 10 June 2014 в 02:22
  • 2
    @Adam - После нескольких испытаний я обнаружил несколько незначительных проблем с этой программой. Однако самая большая проблема заключается в том, что потоковая передача останавливается с ошибкой 32 (Broken pipe) после времени, которое прямо пропорционально количеству отправленных данных. Для потока качества 24/96000 это чуть больше часа. В 24/192000 это чуть более 30 минут. Для качества CD несколько более 3 часов. Выбрав поток снова на рендерере, поток снова начнется. Я считаю, что решение может быть «закодированным кодированием». Я задавался вопросом, выпустил ли кто-нибудь отдельную версию. – pastim 10 June 2014 в 02:30

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

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

1
ответ дан 25 May 2018 в 06:35
  • 1
    Спасибо, что поделились этим - именно то, что до сих пор всегда со мной не справлялось. С дизайном этого сайта мы хотели бы предложить вам изложить шаги, которые вы предприняли (помимо публикации ссылки на свой блог), потому что ссылки могут со временем исчезнуть, оставив ваш ответ бесполезным. Я вернусь к вам, как только смогу проверить это. – Takkat 7 November 2012 в 13:27
  • 2
    Вот мои наблюдения до сих пор: после того, как ваш гид выдает Rygel с SEGFAULT при выборе аудиопотока от клиента в 12.04. В 12.10 мы не можем создать поток с GST-Launch. Что-нибудь не хватает? – Takkat 8 November 2012 в 17:41
  • 3
    Вопрос был около 12,04, и этот ответ для Ubuntu 12.10, иначе я бы проголосовал. :) – jdthood 28 November 2012 в 21:24
  • 4
    Человек из будущего здесь: эта ссылка сгнила. :П – datashaman 14 August 2015 в 23:29
  • 5
    web.archive.org/web/20140823094620/http://dpc.ucore.info/blog/&hellip – dpc.pw 26 August 2015 в 05:25

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

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