Есть ли способ потокового воспроизведения выходного сигнала звуковой карты с нашего 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-клиент?
Pavucontrol - это недостающий элемент в этой головоломке! Я также настроил все правильно, и внешнее устройство (LG TV) показывало, что звук воспроизводится, но я не слышал никакого звука. Сегодня я установил pavucontrol, и когда я открыл его, я нашел возможность передавать звук через сервер DLNA. Опция DLNA отображается только тогда, когда есть звук, выводимый проигрывателем в pulseaudio.
Извините, я не могу помочь вам с 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 и затем быть доступным с вашего сетевого устройства.
Надеюсь, если вы еще не решили, что это дало вам несколько идей.
Одна идея, которую я должен был передать «тому, что я слышу» в 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-совместимыми устройствами.
ПРИМЕЧАНИЕ. Это решение работает, но Массимо предложил более новое и, вероятно, лучшее решение.
Вот ответ ПРИМЕЧАНИЕ. Это решение работает, но более новое и, вероятно, лучшее решение было предложенный 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 (визуализатор / контрольная точка).
ПРИМЕЧАНИЕ. Возможно, вам потребуется перезагрузить компьютер ( или перезапустить импульс), чтобы вещи начали работать.
Питон-скрипт от Адама - это то, что мне нужно. 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()
Не уверен, что это будет полезно для вас сейчас, но я написал сообщение о том, как заставить это работать на Ubuntu 12.10:
http://dpc.ucore.info/blog/2012/ 11/07 / DLNA-потокового-в-убунту-12-дот-10 /