DLNA uyumlu bir cihaza canlı ses akışlarını nasıl ayarlarım?


54

Ses kartının canlı çıkışını 12.04.1 LTS amd64 masaüstünden ağımızdaki DLNA uyumlu bir harici cihaza aktarmanın bir yolu var mı? Rygel, miniDLNA ve uShare kullanarak paylaşılan dizinlerdeki medya içeriğini seçmek her zaman iyidir - ancak şu ana kadar DLNA üzerinden bir müşteriye canlı bir ses akışı alamadık.

Pulseaudio, Rygel ile birlikte bunu yapması gereken bir DLNA / UPnP medya sunucusuna sahip olduğunu iddia ediyor. Ama biz onu çalıştıramadık.

Live.gnome.org , bu yanıtı burada ve benzer başka bir kılavuzda belirtilen adımları takip ettik .


Gelen 12.04 LTS yerel ses aygıtı veya DLNA istemcisi bizim GST-Lansman akışı seçebilir ancak Rygel aşağıdaki iletiyi görüntüler ve istemci çalma listesinin sonuna gelmiş devletler:

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

İstemcide canlı ses akışlarını dinlemenin bir yolu yoktu.


Sadece 14.04 LTS'ye yükselttikten sonra , DLNA oluşturucularımızda aşağıdaki cevabı güzel bir şekilde verilen ayarlardan bir canlı yayın seçebildik . Yine de, rygel başlattıktan sonra kurulan bir akış seçmemiz gerekti ve UPnP cihazlarımıza yeni bir akış gönderemedik. Ses meta verileri iletilmedi.


Ses kartımızın sesini bir DLNA istemcisine canlı akış olarak göndermek için başka alternatifler var mı?


Alıcı cihazınızla DLNA akışını önleyebilir misiniz? Benim çözümüm pulseaudio akışını HTTP üzerinden geçirmek, burada daha fazlasını görün: sandalov.org/blog/1441
DmitrySandalov 31:12

Üzgünüz, hayır, gerçekten DLNA'nın çalışmasını istiyorum çünkü DLNA yalnızca çeşitli istemcilerde (TV'ler, AV alıcıları, Blueray oynatıcılar, vb.) Yaygın olarak kullanılıyor.
Takkat

Takkat, bahsettiğim çözüm AVR'ime akış sorununu çözdü. Gerçekten bir DLNA sunucusu başlatmak istiyorsanız, 12.04'te ('pacmd yük modülü modülü-http-protokol-tcp' sonrası) rygel + pulseaudio ile olumlu bir deneyim yaşadım, 12.10'da aynı 'Geçersiz arama isteği' uyarılarını aldım .
DmitrySandalov

@DmitrySandalov: Pulseaudio çıkışını canlı yayınlamak için Rygel'i nasıl kuracağınızla ilgili ayrıntıları paylaştıysanız çok iyi olurdu.
Takkat

Yanıtlar:


63

Pulseaudio-DLNA

Ağınızdaki tüm uppp işleyicilerini keşfeden ve onları pulseaudio'ya batarya olarak ekleyen küçük bir sunucu yarattım. Böylelikle upnp cihazlarınızda oynamak için her uygulamayı pavucontrol ile kontrol edebilirsiniz.

Linux altında upnp cihazlarla uğraşırken her zaman istediğim konfor bu.

Uygulama, git'ten indirilebilir kaynak veya DEB paketinden veya projenin resmi ppa'sı: qos / pulseaudio-dlna'yı kaynaklarımıza ekledikten sonra kurulabilir :

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

Daha sonra pulseaudio-dlna'yı komut satırından aşağıdaki seçeneklerle çalıştırırız:

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

Daha fazla bilgi için pulseaudio-dlna "Hakkında" bölümüne de bakın .

Bir DLNA oluşturucu mevcut olduğunda, bunu ses menüsünden çıkış havuzu olarak seçebiliriz:

görüntü tanımını buraya girin


3
Harika bir uygulama - teşekkür ederim! Samsung Smart TV (UE40ES6100) dahil cihazlarımda iyi çalıştı. Sadece bir not: python-requestsbir bağımlılık olarak da ihtiyacımız vardı ve oluşturucuyu varsayılan ses kontrollerinden seçebildik - pavucontrol yüklemeye gerek yok.
Takkat

Beğendiğine sevindim. Ben sadece README'yi güncelledim. İpucu için teşekkürler!
Massimo

2
Harika bir çözüm. Teşekkürler. Ancak bir sorum var: Birkaç saniye çalma gecikmesi var (VLC'de duraklatmaya bastıktan 10 saniye sonra). Bu bir DLNA "özelliği" mi, yoksa azaltmanın bir yolu var mı? Öyleyse DLNA, video oynatma veya oyun oynamanın anlamı yok mu? :(
JPT

2
Gecikme, HTTP tamponunu doldurmaktan geliyor. Bağlantınızla ilgili sorunlarınız varsa (zayıf wifi vb.) Akışı oynatmaya devam eder. Gecikmeyi azaltmak istiyorsanız, bu tamponu daha hızlı doldurmak için çok fazla bant genişliğine ( wav ) ihtiyaç duyan bir codec bileşeni kullanın . Kablo bağlantısı her zaman yardımcı olur. Aksi halde bu durum üreticinizin üretici yazılımı uygulamasına özeldir. Örneğin Cocy ile yaklaşık 1 saniye gecikme var. Sonos Çal 1 ile wav: 1 saniye, mp3 ile: 5 saniye. Hepsi kablo ile bağlı. Ama ondan tamamen kurtulmazsın. Ana amaç müzik ve sesli kitaplar. Senkronize olması gerekmeyen her şey.
Massimo

1
@JPT ve gecikmeyi düzeltmenin bir yolunu arayan herkes (benim için 10 saniye): Shairport-sync kullanarak RaspberryPi'mde DLNA lavabosuna paralel bir AirPlay lavabo kullanıyorum ve gecikmelerin çok daha kısa olduğunu söylemeliyim (~ Başlatmak için 2s; durma hemen) Olduğu söyleniyor, Massimo'ya çok teşekkürler, çünkü gecikmeyi unutmak, pulseaudio-dlna cazibeye benziyor ve kurulumu gerçekten çok önemli! (AirPlay benim için ayarlamak biraz zordu.)
balu

8

Pavucontrol bu bilmecedeki eksik öğedir! Ayrıca her şeyi doğru ayarlamıştım ve harici cihaz (LG TV) sesin çalındığını gösteriyordu ama hiçbir ses duymadım. Bugün pavucontrol'ü yükledim ve açtığımda DLNA sunucusu üzerinden ses kanallarını bulma seçeneğini buldum. DLNA seçeneği yalnızca bir oynatıcıdan pulseaudio'ya ses çıkışı olduğunda gösterilir. görüntü tanımını buraya girin


Bunu paylaştığın için teşekkür ederim. DLNA sunucusunu nasıl kurdunuz? Benim için atm Rygel faydasız kesimlerle bıraktı.
Takkat

Sadece normal ayarlarım var. Yazınıza yazdığınız bağlantıyı takip ettim. [GstLaunch] enable = true launch-items = audiotestsrc; audiotestsrc-title = Masaüstü Canlı Yayını! audiotestsrc-mime = ses / mpeg audiotestsrc-launch = pulsesrc aygıtı = upnp.monitor! lamemp3enc target = kalite kalitesi = 6
jumbli

Tuhaf. Rhythmbox ile segfaults ortadan kayboldu ama ben hala Rygel'den geliyorum Invalid seek request. Medya dizinleri var ama GST akışım her zaman EOF.
Takkat

Harika bir ek, ses çalabilecek her uygulama için bir lavabo ayarlamanızı sağlar! Büyük stereo sistemimde müzik dinleyebilir, bilgisayarımda video veya oyun sesi tutabilirim. Teşekkürler!
yaylı olarak

Hepsi birbirine bağlanırken ve çalınırken bu benim sorunumu çözdü ama sadece ses yoktu!
easwee

4

Üzgünüm, Rygel'de size hiç yardımcı olamadım, ancak sizin için işe yarayabilecek bir alternatif olabilir.

İlke, akışı bir ses dosyasına kaydetmek için bir program elde etmek, ardından miniDLNA'yı, akışın içinde bulunduğu dizine işaret eden özel bir yapılandırma ile başlatmaktır.

Örnek: ~ / stream / içinde çalıştığımızı söyleyin. ~ / Stream / minidlna.conf dosyası oluşturun

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

Ardından akışı bu dizindeki bir ses dosyasına kaydedin. "FFmpeg kayıt ses kartı sesi" googling bu komutu verdi

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

ama buna pek şansım yoktu. Başka bir seçenek vlc kullanılabilir bir GUI'niz var ve bu çalışmıyor.

Sonra miniDLNA'yı başka bir terminal penceresinde başlatın:

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

Bu olmalıdır OutputStream.flac bulun ve sonra ağ aygıtından erişilebilir.

Umarım çözemediyseniz, size birkaç fikir verilir.


1
Gelecek vaat eden yaklaşım - teşekkür ederim - ama daha da iyileştirilmesi gerekiyor. Bugün miniDLNA ile yapılan hızlı bir test ile DLNA istemcim tarafından tanınan akış dosyasını bulamadım. Ayrıca, ffmpeg tarafından üretilen akışlar oldukça zayıf görünüyor (statik gürültü). Ben varım ve bilmene izin ver.
Takkat

Şimdiye kadar ffmpeg veya avconv ile ses lavabosundan bir flac veya mp3 ses dosyası oluşturabiliyoruz. Ancak, kayıttan çıkmadığımız sürece bu dosya miniDLNA tarafından tanınmaz. Daha sonra başka bir örnek kaydederken bu dosyayı tekrar DLNA istemcisinde açabiliriz, ancak akış her zaman kaydın başlangıcından başlar ve istemciyi dinlemeye başladığımız zaman durur. Bunun üstesinden nasıl gelinir?
Takkat

Yani, kaydı durdurmak için ffmpeg işleminden ayrıldıktan sonra sadece miniDLNA tarafından tanınan dosya mı demek istiyorsunuz? Ayrıca, ses kalitesi daha iyi mi? Makinemde deneyeceğim ve tekrar başarabilir miyim diye bir bakayım. (Geçen yıl filmleri dönüştürmek için film çalışması gibi benzer bir şey vardı)
mtdevans

Evet ilk etapta. İkincisinde müşteriden anlayabilirim ama baştan başlar (yani, kaydetmeye başladığımda) ve ortada durur (yani, tam olarak kayıt başlangıcı ile müşteriyi almaya başlamak arasındaki sürenin sonunda). Ses şimdi iyi, çift yönlü devre dışı bırakmak zorunda kaldı.
Takkat

4

Bir DLNA oluşturucuya (WDTV gibi) "duyduğum şeyi" yayınlamak zorunda olduğum bir fikir, VLC ile akışa http akışı pulse://alsa_output.xxx.monitorolarak giriş yapmak ve MP3 ya da FLAC'a dönüştürmektir. Sonra, işleyicinin akışını çalmasını sağlamak için bazı DLNA kontrol noktalarını kullanmak istedim. VLC, kodlanmış akımı doğru bir şekilde sunar, ancak mime tipinin ayarlanmasına izin vermez, bu nedenle, oynatıcı çalmayı reddeder.

Bir sonraki fikir, yerine akışa hizmet veren python'da bir http sunucusu yazmaktı. Ses akışını darbeden alır, ile pareckodlar flac(veya lameveya ne istersen) ve mime tipini doğru ayarlar.

Aşağıdaki (çok basit) betiği ile çalışır:

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

Parametreleri ayarlayın, çalıştırın ve DLNA oluşturucuyu makinenize doğrultun. Oluşturucu olarak bir WDTV ve kontrol noktası olarak BubbleUPnP'li bir Android telefon ile çalıştı (akış listesine URL'yi, çalma listesine manuel olarak yeni bir öğe eklerken yazabilirsiniz). Ancak herhangi bir DLNA uyumlu cihazla çalışması gerekir.


4

NOT: Bu çözüm işe yarar, ancak Massimo tarafından daha yeni ve muhtemelen daha iyi bir çözüm önerilmiştir.

İşte Ubuntu 14.04 ( 15.04 üzerinde de test edilmiş ve çalışıyor ) için bir cevap :

  1. Gerekli paketleri kurun: sudo apt-get install rygel rygel-preferences rygel-gst-launch

  2. ~/.config/rygel.confaşağıdakileri içeren dosyayı oluşturun :

    [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. Komut satırından aşağıdaki komutları yürütün (istenirse bunlar bir komut dosyasına eklenebilir):

    pactl load-module module-http-protocol-tcp
    pactl load-module module-rygel-media-server 
    rygel &
    
  4. paprefsKomutu çalıştırın ve "Ağ Sunucusu" sekmesinde her iki DLNA seçeneğinin de etkinleştirildiğinden (işaretli olduğundan) emin olun.

  5. Bilgisayarınızda biraz ses çalın. pavucontrolProgramı çalıştırın ve "Playback" sekmesinde, çıktı aygıtını "DLNA / UPnP Streaming" olarak değiştirin.

Bu noktada, bir DLNA istemcisinden (oluşturucu / kontrol noktası) MPEG ve FLAC akışlarını oynatabilirsiniz.

NOT: işlerin başlaması için bilgisayarınızı yeniden başlatmanız (veya darbeyi yeniden başlatmanız) gerekebilir.


3

Adam'ın python senaryosu tam ihtiyacım olan şeydi. Parlak. Gst-launch ile Rygel, işleyicilerimden biriyle çalışmıyor, ancak bu senaryo her ikisi ile de çalışıyor. Benim durumumda, sıkmakelitten (sıkmak için) bir ses akışı girişi alıyorum ve bir işleyiciye gönderiyorum. Senaryo ayrıca, gerekirse bir pulseaudio monitöründen girdi almak için orijinal formda çalışır.

Bunlardan herhangi biri hakkında çok az şey bildiğimde, senaryoya bazı eklemeler yapmayı başardım:

i) bir kabuk betiğinden çalıştırılmasına ve bir SIGTERM / SIGKILL ile sonlandırılmasına izin ver ('artık' ifadesi şimdi 'systemexit'i içerir')

ii) betiğin durdurulmasına ve yeniden başlatılmasına ve aynı bağlantı noktasını yeniden kullanmasına izin verir (yeniden başlatılan komut dosyası, oluşturucu hala açıksa, bağlantı noktasını açamayacağını söyleyerek başarısız olma eğilimindeydi) - (allow_reuse_address = True deyimi)

iii) stdin'den girdi alan ve sox kullanarak çıktısını wav formatında (port 8082'de) çıkaran bir versiyonunu yapar.

Yani benim versiyonum şöyle gözüküyor:

#!/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
Bu komut dosyasıyla ilgili birkaç küçük sorun buldum.
pastim

@Adam - Birkaç denemeden sonra bu programla ilgili birkaç küçük sorun buldum. Bununla birlikte, en büyük sorun, gönderilen veri miktarıyla doğrudan orantılı bir süre sonra akışın 32 numaralı hatayla (Kırık boru) durmasıdır. 24/96000 kalite akış için bu sadece bir saatten fazladır. 24 / 192000'de 30 dakikadan biraz fazladır. CD kalitesi için 3 saatten biraz fazla. Oluşturucuda tekrar akışı seçerek akış yeniden başlar. Çözümün 'yığın kodlama' olabileceğine inanıyorum. Kimsenin parçalı versiyonunu üretip üretmediğini merak ettim.
pastim

1

Bunun sizin için yararlı olup olmayacağından emin değilim, ancak bunun Ubuntu 12.10'da çalışmasını sağlamak için bir yazı yazdım:

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


Bunu paylaştığınız için teşekkür ederiz - şu ana kadar hep benimle başarısızlığa uğradı. Bu sitenin tasarımından, attığınız adımları ana hatlarıyla belirtmenizi tavsiye ederiz (bağlantıyı yalnızca blogunuza göndermenin yanı sıra) çünkü bağlantılar zaman içinde kaybolabilir ve bu nedenle cevabınızı faydasız bırakabilirsiniz. Bunu test edebildiğim anda size geri döneceğim.
Takkat

İşte şimdiye kadar gözlemlerim: 12.04'te müşteriden ses akışını seçerken rehberinizin ardından SEGFAULT ile Rygel'i çökertti. 12.10'da GST-Launch ile bir yayın oluşturamıyoruz. Eksik bir şey var mı?
Takkat

Soru yaklaşık 12.04 idi ve bu cevap Ubuntu 12.10 içindi, yoksa ben oylardım. :)
jdthood

Burada gelecekten kişi: bu bağlantı çürümüş. : P
datashaman

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.