Як налаштувати прямі аудіо потоки на сумісний з DLNA пристрій?


54

Чи є спосіб передавати прямий вихід звукової карти з нашого робочого столу amp64 12.04.1 LTS на зовнішній пристрій, сумісний з 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, 12.04 (після 'pacmd модуля навантаження-модуля-http-протокол-tcp'), я отримав позитивний досвід роботи з rygel + pulseaudio, 12.10 я отримав ті самі попередження "Недійсний запит на запит" .
Дмитро Сандалов

@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 "Про" для отримання додаткової інформації.

Коли був присутній рендер DLNA, ми можемо вибрати його з меню звуку як мийку виводу:

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


3
Чудовий додаток - дякую! Чудово працював на своїх пристроях, включаючи смарт-телевізор Samsung (UE40ES6100). Лише зауваження: нам також потрібна python-requestsзалежність, і ми могли вибрати рендерінг із звукових елементів керування за замовчуванням - не потрібно встановлювати pavucontrol.
Таккат

Радий, що тобі подобається. Я щойно оновив README. Дякую за підказку!
Массімо

2
Прекрасне рішення. Дякую. Але у мене є одне питання: у відтворенні VLC затримка відтворення на кілька секунд (10 секунд після натискання паузи). Це "особливість" DLNA чи є якийсь спосіб зменшити її? Тож DLNA не має сенсу для відтворення відео чи ігор? :(
JPT

2
Затримка виходить із заповнення HTTP-буфера. Він продовжує відтворювати потік у випадку, якщо у вашого зв’язку є проблеми (слабкий wifi тощо). Якщо ви хочете зменшити затримку, використовуйте кодек, якому потрібна значна смуга пропускання ( wav ), щоб швидше заповнити цей буфер. Підключення кабелів завжди допомагає. Інакше це дуже специфічно для впровадження прошивки ваших виробників. Наприклад, у мене з Косі затримка приблизно на 1 секунду. Sonos Play 1 з хвилею: 1 секунда, з mp3: 5 секунд. Всі підключені за допомогою кабелю. Але ви не позбудетесь цього повністю. Основна мета - музика та аудіокниги. Все, що не потрібно синхронізувати.
Массімо

1
@JPT та всі інші, які шукають спосіб виправити затримку (10 секунд для мене): За допомогою shairport-sync я запускаю мийку AirPlay на моєму RaspberryPi паралельно з раковиною DLNA і мушу сказати, що затримки значно коротші (~ 2 секунди для запуску; зупинка негайна). Це було сказано, велике спасибі Массімо, тому що, забуваючи про затримку, pulseaudio-dlna працює як шарм і насправді тривіально встановлювати! (AirPlay було трохи складніше налаштувати для мене.)
balu

8

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


Дякуємо, що поділилися цим. Як ви налаштували сервер DLNA? Для мене атм Ригель виходить з досить непридатних segfault.
Таккат

У мене просто нормальні налаштування. Я перейшов за тим самим посиланням, як ви згадували у своєму дописі. [GstLaunch] увімкнено = справжні запуски-елементи = audiotestsrc; audiotestsrc-title = Настільний прямий ефір! audiotestsrc-mime = audio / mpeg audiotestsrc-start = pulsesrc пристрій = upnp.monitor! lamemp3enc target = якість якості = 6
jumbli

Дивно. З Rhythmbox Invalid seek requestзрізні сегменти зникли, але я все ще потрапляю лише з Rygel. Медіа-каталоги є, але мій GST-потік завжди EOF.
Таккат

Чудове доповнення, воно дозволяє встановити раковину для кожного додатка, який може відтворювати аудіо! Я можу слухати музику на своєму великому стерео, а також зберігати відео чи звуки гри на своєму комп’ютері. Дякую!
навесні завантажено

Це вирішило мою проблему, коли всі були підключені та грали, але просто не було звуку!
easwee

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

Потім збережіть потік у аудіофайлі в цьому каталозі. Гуглінг для "аудіо звукової карти 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або що завгодно) і правильно встановлює тип mime.

Він працює з наступним (дуже простим) сценарієм:

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

ПРИМІТКА. Це рішення працює, але Массімо запропонував нове і, мабуть, краще рішення .

Ось відповідь на 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

Сценарій пітона від Адама - це саме те, що мені було потрібно. Блискуча. Rygel з gst-start не працює з одним із моїх рендерів, але цей сценарій працює з обома. У моєму випадку я беру вхід аудіопотоку із скезеліту (для сціскання) та надсилаю рендереру. Сценарій також працює в оригінальній формі, щоб приймати дані з монітора імпульсного аудіо, якщо це те, що потрібно.

Знаючи мало про щось із цього, мені вдалося внести кілька доповнень до сценарію, які:

i) дозвольте запускати його із сценарію оболонки та припинити його за допомогою SIGTERM / SIGKILL (оператор "крім" тепер включає "systemexit")

ii) дозволяє зупинити і перезапустити скрипт і повторно використовувати той самий порт (так як це був перезапущений скрипт, як правило, не вдалося сказати, що не може відкрити порт, якщо рендерінг все ще мав його відкритим) - (заява enable_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
Я знайшов кілька незначних проблем із цим сценарієм.
pastim

@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.