Bagaimana cara mengatur streaming audio langsung ke perangkat yang mendukung DLNA?

54

Apakah ada cara untuk mengalirkan output langsung dari kartu suara dari desktop amd64 LTS 12.04.1 kami ke perangkat eksternal yang mendukung DLNA di jaringan kami? Memilih konten media dalam direktori bersama menggunakan Rygel, miniDLNA, dan uShare selalu baik - tetapi sejauh ini kami sepenuhnya gagal mendapatkan streaming audio langsung ke klien melalui DLNA.

Pulseaudio mengklaim memiliki server media DLNA / UPnP yang bersama-sama dengan Rygel seharusnya melakukan hal ini. Tapi kami tidak bisa menjalankannya.

Kami mengikuti langkah-langkah yang dijelaskan dalam live.gnome.org , jawaban ini di sini, dan juga dalam panduan serupa lainnya .


Dalam 12,04 LTS kita dapat memilih perangkat audio lokal, atau aliran GST-Launch kami di klien DLNA tetapi Rygel menampilkan pesan berikut dan klien menyatakan itu mencapai akhir daftar putar:

(rygel:7380): Rygel-WARNING **: rygel-http-request.vala:97: Invalid seek request

Tidak ada cara untuk mendengarkan streaming audio langsung pada klien.


Hanya setelah peningkatan distribusi ke 14,04 LTS kami dapat memilih streaming langsung pada penyaji DLNA kami dari pengaturan yang dijabarkan dengan baik di bawah ini . Namun, kami perlu memilih aliran yang ditetapkan setelah kami mulai rygel dan tidak dapat mendorong aliran baru ke perangkat UPnP kami. Metadata audio tidak ditransmisikan.


Apakah ada alternatif lain untuk mengirim audio kartu suara kami sebagai siaran langsung ke klien DLNA?

Takkat
sumber
Bisakah Anda menghindari streaming DLNA dengan perangkat penerima Anda? Solusi saya adalah melewati aliran pulseaudio melalui HTTP, lihat lebih lanjut di sini: sandalov.org/blog/1441
DmitrySandalov
Maaf, tidak, saya benar-benar ingin DLNA berfungsi karena DLNA hanya diterapkan secara luas pada berbagai klien (TV, penerima AV, pemutar Blueray, dll.).
Takkat
Takkat, solusi yang saya bicarakan menyelesaikan masalah streaming ke AVR saya. Jika Anda benar-benar ingin meluncurkan server DLNA, saya punya pengalaman positif dengan rygel + pulseaudio di 12,04 (setelah 'pacmd load-module module-http-protocol-tcp'), pada jam 12.10 saya menerima peringatan 'Invalid seek request' yang sama .
DmitrySandalov
@DmitrySandalov: akan sangat keren jika Anda berbagi detail tentang bagaimana Anda berhasil mengatur Rygel untuk live streaming output pulseaudio.
Takkat

Jawaban:

63

Pulseaudio-DLNA

Saya membuat server kecil yang menemukan semua penyaji upnp di jaringan Anda dan menambahkannya sebagai sink ke pulseaudio. Jadi, Anda dapat mengontrol setiap aplikasi melalui pavucontrol untuk bermain di perangkat upnp Anda.

Itulah jenis kenyamanan yang selalu saya inginkan ketika berhadapan dengan perangkat upnp di linux.

Aplikasi dapat diinstal dari sumber atau paket DEB yang dapat diunduh dari git , atau setelah kami menambahkan ppa resmi proyek : qos / pulseaudio-dlna ke sumber kami dengan:

sudo apt-get update && sudo apt-get install pulseaudio-dlna

Kami kemudian menjalankan pulseaudio-dlna dari baris perintah dengan opsi berikut:

pulseaudio-dlna [--host <host>] [--port <port>] [--encoder <encoder>] [--renderer-urls <urls>] [--debug]
pulseaudio-dlna [-h | --help | --version]

Lihat juga pulseaudio-DLNA "Tentang" untuk lebih lanjut.

Ketika ada hadiah DLNA renderer, kita dapat memilihnya dari menu suara sebagai output sink:

masukkan deskripsi gambar di sini

Massimo
sumber
3
Aplikasi hebat - terima kasih! Bekerja dengan baik pada perangkat saya termasuk Samsung Smart TV (UE40ES6100). Hanya sebuah catatan: kami juga diperlukan python-requestssebagai dependensi dan kami dapat memilih renderer dari kontrol audio default - tidak perlu menginstal pavucontrol.
Takkat
Senang kamu menyukainya. Saya baru saja memperbarui README. Terima kasih atas petunjuknya!
Massimo
2
Solusi bagus Terima kasih. Tapi saya punya satu pertanyaan: Ada penundaan pemutaran beberapa detik (10 detik setelah menekan jeda dalam VLC). Apakah ini "fitur" DLNA atau apakah ada cara untuk menguranginya? Jadi DLNA tidak masuk akal untuk pemutaran video atau bermain game? :(
JPT
2
Penundaan berasal dari pengisian buffer HTTP. Ini membuat streaming tetap berjalan jika koneksi Anda bermasalah (wifi lemah, dll.). Jika Anda ingin mengurangi penundaan, gunakan codec yang membutuhkan banyak bandwidth ( wav ) untuk mengisi buffer itu lebih cepat. Koneksi kabel selalu membantu. Kalau tidak, ini sangat spesifik untuk implementasi firmware pabrikan Anda. Misalnya saya mengalami keterlambatan dengan Cocy sekitar 1 detik. Sonos Mainkan 1 dengan wav: 1 detik, dengan mp3: 5 detik. Semua terhubung melalui kabel. Tetapi Anda tidak akan menyingkirkannya sepenuhnya. Tujuan utamanya adalah buku musik dan audio. Segala sesuatu yang tidak perlu disinkronkan.
Massimo
1
@JPT dan semua orang mencari cara untuk memperbaiki penundaan (10-an untuk saya): Menggunakan shairport-sync saya menjalankan AirPlay sink pada RaspberryPi saya secara paralel dengan wastafel DLNA dan harus mengatakan bahwa penundaan jauh lebih pendek (~ 2s untuk memulai; berhenti segera). Yang sedang berkata, terima kasih banyak kepada Massimo karena, melupakan keterlambatan, pulseaudio-DLNA bekerja seperti pesona dan benar-benar sepele untuk menginstal! (AirPlay sedikit lebih sulit untuk diatur untuk saya.)
balu
8

Pavucontrol adalah item yang hilang dalam puzzle ini! Saya juga mengatur semuanya dengan benar dan perangkat eksternal (LG TV) menunjukkan bahwa suara sedang diputar tetapi saya tidak mendengar suara apa pun. Hari ini saya menginstal pavucontrol dan ketika saya membukanya saya menemukan opsi untuk menyalurkan suara melalui server DLNA. Opsi DLNA hanya ditampilkan ketika ada output suara dari pemain ke pulseaudio. masukkan deskripsi gambar di sini

jumbli
sumber
Terima kasih telah berbagi ini. Bagaimana Anda mengatur server DLNA? Bagi saya atm Rygel berhenti dengan segfault yang agak tidak membantu.
Takkat
Saya baru saja pengaturan normal. Saya mengikuti tautan yang sama seperti yang Anda sebutkan di posting Anda. [GstLaunch] enabled = true launch-items = audiotestsrc; audiotestsrc-title = Desktop Live Streaming! audiotestsrc-mime = audio / mpeg audiotestsrc-launch = perangkat pulsesrc = upnp.monitor! target lamemp3enc = kualitas kualitas = 6
jumbli
Aneh. Dengan Rhythmbox segfaults telah menghilang tetapi saya masih hanya mendapatkan Invalid seek requestdari Rygel. Direktori media ada di sana tetapi GST-stream saya selalu EOF.
Takkat
Selain hebat, ini memungkinkan Anda mengatur wastafel untuk setiap aplikasi yang dapat memutar audio! Saya dapat mendengarkan musik di stereo besar saya, dan menyimpan video atau suara game di komputer saya. Terima kasih!
springloaded
Ini menyelesaikan masalah saya ketika semua terhubung dan diputar tetapi hanya suara yang hilang!
easwee
4

Maaf saya tidak bisa membantu Anda dengan Rygel sama sekali, tetapi mungkin ada alternatif yang mungkin cocok untuk Anda.

Prinsipnya adalah dapatkan program untuk merekam streaming ke audiofile, kemudian jalankan miniDLNA dengan konfigurasi khusus yang menunjuk ke direktori yang di dalamnya streaming.

Contoh: Katakanlah kita sedang bekerja di ~ / stream /. Buat ~ / 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

Kemudian simpan streaming ke audiofile di direktori itu. Googling untuk "audio kartu suara rekaman FFmpeg" menghasilkan perintah ini

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

tapi aku tidak beruntung dengan itu. Pilihan lain adalah vlc adalah Anda memiliki GUI yang tersedia dan ini tidak berfungsi.

Kemudian boot miniDLNA di jendela terminal lain:

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

Itu harus menemukan OutputStream.flac dan kemudian dapat diakses dari perangkat jaringan Anda.

Semoga jika Anda belum menyelesaikannya, itu memberi Anda beberapa ide.

mtdevans
sumber
1
Pendekatan yang menjanjikan - terima kasih - tetapi perlu penyempurnaan lebih lanjut. Dengan tes cepat dengan miniDLNA hari ini saya tidak bisa mendapatkan file stream yang dikenali oleh klien DLNA saya. Selain itu aliran yang dihasilkan oleh ffmpeg tampaknya agak buruk (noise statis). Saya melakukannya dan memberi tahu Anda.
Takkat
Sejauh ini kami dapat menghasilkan file audio flac atau mp3 dari wastafel audio dengan ffmpeg atau avconv. Namun file ini tidak akan dikenali oleh miniDLNA kecuali kami berhenti merekam. Kemudian kita dapat membuka file ini lagi pada klien DLNA sambil merekam contoh lain tetapi aliran selalu dimulai dari awal rekaman dan berhenti pada saat ketika kami mulai mendengarkan pada klien. Adakah cara mengatasinya?
Takkat
Jadi, maksud Anda setelah Anda menghentikan proses ffmpeg untuk berhenti merekam, baru kemudian file tersebut dikenali oleh miniDLNA? Juga, apakah kualitas audio lebih baik? Saya akan mencobanya di mesin saya dan melihat apakah saya bisa menjalankannya lagi. (Saya memiliki pekerjaan serupa tahun lalu untuk transcoding film on the fly)
mtdevans
Ya di tempat pertama. Kedua kalinya saya dapat mengaksesnya dari klien tetapi dimulai dari awal (yaitu setiap kali saya mulai merekam) dan berhenti di tengah (mis. Setelah tepat waktu antara mulai merekam dan mulai menerima pada klien). Audio baik-baik saja sekarang, harus menonaktifkan dupleks.
Takkat
4

Satu ide saya harus streaming "apa yang saya dengar" ke DLNA renderer (seperti WDTV) adalah ke server aliran dengan VLC sebagai aliran http dengan pulse://alsa_output.xxx.monitorsebagai input dan transcode ke MP3 atau FLAC. Lalu saya ingin menggunakan beberapa titik kontrol DLNA untuk membiarkan renderer bermain dengan stream. VLC memang melayani aliran transkode dengan benar, tetapi tidak memungkinkan untuk mengatur tipe mime, sehingga pemberi render menolak untuk memainkannya.

Gagasan berikutnya adalah untuk menulis server http dengan python yang melayani aliran sebagai gantinya. Ini mendapatkan aliran audio dari pulsa dengan parec, menyandikannya dengan flac(atau lameatau apa pun yang Anda inginkan) dan mengatur jenis mime dengan benar.

Ini bekerja dengan skrip (sangat sederhana) berikut:

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

Sesuaikan parameter, jalankan, dan arahkan renderer DLNA ke mesin Anda. Ini bekerja untuk saya dengan WDTV sebagai penyaji dan ponsel Android dengan BubbleUPnP sebagai titik kontrol (Anda dapat mengetikkan URL aliran saat menambahkan item baru ke daftar putar secara manual). Tetapi itu harus bekerja dengan perangkat yang sesuai DLNA.

Adam
sumber
4

CATATAN: Solusi ini berfungsi, tetapi solusi yang lebih baru dan mungkin lebih baik telah diusulkan oleh Massimo.

Inilah jawaban untuk Ubuntu 14.04 (juga diuji dan berfungsi pada 15.04 ), untuk kelengkapan:

  1. instal paket yang dibutuhkan: sudo apt-get install rygel rygel-preferences rygel-gst-launch

  2. buat file ~/.config/rygel.confyang berisi berikut ini:

    [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. Jalankan perintah berikut dari commandline (ini bisa dimasukkan ke dalam skrip jika diinginkan):

    pactl load-module module-http-protocol-tcp
    pactl load-module module-rygel-media-server 
    rygel &
    
  4. Jalankan paprefsperintah, dan pastikan kedua opsi DLNA diaktifkan (dicentang) pada tab "Network Server".

  5. Mainkan beberapa audio di komputer Anda. Jalankan pavucontrolprogram, dan pada tab "Playback", ubah perangkat output menjadi "DLNA / UPnP Streaming".

Pada titik ini, Anda harus dapat memutar stream MPEG dan FLAC dari klien DLNA (renderer / titik kontrol).

CATATAN: Anda mungkin perlu me-restart komputer Anda (atau me-restart pulsa) agar hal-hal mulai bekerja.

Menandai
sumber
3

Skrip python dari Adam adalah apa yang saya butuhkan. Cemerlang. Rygel dengan peluncuran gst tidak berfungsi dengan salah satu penyaji saya, tetapi skrip ini berfungsi dengan baik. Dalam kasus saya, saya mengambil input stream audio dari squeezelite (untuk squeezebox) dan mengirim ke renderer. Script juga berfungsi dalam bentuk asli untuk mengambil input dari monitor pulseaudio jika itu yang diperlukan.

Mengetahui sedikit tentang semua ini, saya berhasil membuat beberapa tambahan pada skrip yang:

i) mengizinkannya dijalankan dari skrip shell dan diakhiri dengan SIGTERM / SIGKILL (pernyataan 'kecuali' sekarang termasuk 'systemexit')

ii) memungkinkan skrip untuk dihentikan dan dimulai kembali dan menggunakan kembali port yang sama (karena skrip yang direstart cenderung gagal mengatakan tidak dapat membuka port jika renderer masih membuka) - (allow_reuse_address = Pernyataan benar)

iii) membuat versi yang mengambil input dari stdin dan membuat sampel menggunakan sox untuk output dalam format wav (pada port 8082)

Jadi versi saya terlihat seperti:

#!/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()
pastim
sumber
1
Saya telah menemukan beberapa masalah kecil dengan skrip ini.
Pastim
@ Adam - Setelah beberapa percobaan saya menemukan beberapa masalah kecil dengan program ini. Namun, masalah terbesar adalah streaming berhenti dengan kesalahan 32 (pipa rusak) setelah waktu yang berbanding lurus dengan jumlah data yang dikirim. Untuk aliran kualitas 24/96000 ini hanya lebih dari satu jam. Pada 24/192000 dibutuhkan waktu lebih dari 30 menit. Untuk kualitas CD agak lebih dari 3 jam. Dengan memilih aliran lagi pada perender aliran mulai lagi. Saya percaya solusinya mungkin 'chunked encoding'. Saya bertanya-tanya apakah ada yang telah menghasilkan versi chunked.
Pastim
1

Tidak yakin apakah ini akan berguna untuk Anda sekarang, tetapi saya menulis posting tentang cara agar ini berfungsi di Ubuntu 12.10:

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

dpc.pw
sumber
Terima kasih telah berbagi ini - persis apa yang sejauh ini selalu gagal dengan saya. Dari desain situs ini kami ingin mendorong Anda untuk menguraikan langkah-langkah yang Anda ambil (selain hanya memposting tautan ke blog Anda) karena tautan mungkin hilang seiring waktu sehingga meninggalkan jawaban Anda tidak berguna. Saya akan menghubungi Anda segera setelah saya bisa menguji ini.
Takkat
Inilah pengamatan saya sejauh ini: Mengikuti panduan Anda membuat Rygel lumpuh dengan SEGFAULT saat memilih aliran audio dari klien di 12,04. Di 12.10 kami tidak dapat membuat aliran dengan GST-Launch. Ada yang hilang?
Takkat
Pertanyaannya adalah sekitar 12,04 dan jawaban ini untuk Ubuntu 12.10, kalau tidak saya akan memilih itu. :)
jdthood
Orang dari masa depan di sini: tautan itu telah membusuk. : P
datashaman