Làm cách nào để thiết lập luồng âm thanh trực tiếp đến thiết bị tuân thủ DLNA?


54

Có cách nào để truyền phát đầu ra trực tiếp của soundcard từ máy tính để bàn amd64 12.04.1 LTS sang thiết bị bên ngoài tuân thủ DLNA trong mạng của chúng tôi không? Chọn nội dung đa phương tiện trong các thư mục được chia sẻ bằng Rygel, miniDLNA và uShare luôn ổn - nhưng cho đến nay chúng tôi hoàn toàn thất bại trong việc truyền luồng âm thanh trực tiếp đến máy khách thông qua DLNA.

Pulseaudio tuyên bố có máy chủ phương tiện DLNA / UPnP cùng với Rygel được cho là làm việc này. Nhưng chúng tôi không thể chạy được.

Chúng tôi đã làm theo các bước được nêu trong live.gnome.org , câu trả lời này ở đây và cũng trong một hướng dẫn tương tự khác .


Trong 12.04 LTS, chúng tôi có thể chọn thiết bị âm thanh cục bộ hoặc luồng GST-Launch của chúng tôi trong ứng dụng khách DLNA nhưng Rygel hiển thị thông báo sau và ứng dụng khách nói rằng nó đã đến cuối danh sách phát:

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

Không có cách nào để nghe các luồng âm thanh trực tiếp trên máy khách.


Chỉ sau khi nâng cấp phân phối lên 14.04 LTS, chúng tôi mới có thể chọn luồng trực tiếp trên trình kết xuất DLNA của mình từ các cài đặt được nêu rõ trong câu trả lời bên dưới . Tuy nhiên, chúng tôi cần chọn một luồng đã thiết lập sau khi chúng tôi bắt đầu rygel và không thể đẩy một luồng mới đến các thiết bị UPnP của chúng tôi. Siêu dữ liệu âm thanh không được truyền đi.


Có sự thay thế nào khác để gửi âm thanh của soundcard của chúng tôi dưới dạng phát trực tiếp đến máy khách DLNA không?


Bạn có thể tránh truyền phát DLNA với thiết bị thu của bạn không? Giải pháp của tôi là truyền luồng pulseaudio qua HTTP, xem thêm tại đây: sandalov.org/blog/1441
DmitrySandalov

Xin lỗi, không, tôi thực sự muốn DLNA hoạt động vì chỉ DLNA được triển khai rộng rãi trên nhiều máy khách khác nhau (TV, máy thu AV, máy nghe nhạc Blueray, v.v.).
Takkat

Takkat, giải pháp mà tôi đang nói về việc giải quyết vấn đề truyền phát tới AVR của tôi. Nếu bạn thực sự muốn khởi chạy máy chủ DLNA, tôi đã có trải nghiệm tích cực với rygel + pulseaudio vào ngày 12.04 (sau 'pacmd load-module module-http-Protocol-tcp'), vào ngày 12.10 tôi đã nhận được cảnh báo 'Yêu cầu tìm kiếm không hợp lệ' .
DmitrySandalov

@DmitrySandalov: sẽ thật tuyệt nếu bạn chia sẻ chi tiết về cách bạn đã thành công để thiết lập Rygel để phát trực tiếp đầu ra pulseaudio.
Takkat

Câu trả lời:


63

Pulseaudio-DLNA

Tôi đã tạo một máy chủ nhỏ phát hiện ra tất cả các trình kết xuất upnp trong mạng của bạn và thêm chúng dưới dạng chìm vào pulseaudio. Vì vậy, bạn có thể kiểm soát mọi ứng dụng thông qua pavucontrol để chơi trên các thiết bị upnp của mình.

Đó là loại thoải mái tôi luôn muốn khi giao dịch với các thiết bị upnp trong linux.

Ứng dụng có thể được cài đặt từ nguồn hoặc gói DEB có thể tải xuống từ git hoặc sau khi chúng tôi đã thêm ppa chính thức của dự án : qos / pulseaudio-dlna vào các nguồn của chúng tôi bằng:

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

Sau đó chúng tôi chạy pulseaudio-dlna từ dòng lệnh với các tùy chọn sau:

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

Xem thêm pulseaudio-dlna "Giới thiệu" để biết thêm.

Khi có trình kết xuất DLNA, chúng ta có thể chọn nó từ menu âm thanh làm phần chìm đầu ra:

nhập mô tả hình ảnh ở đây


3
Ứng dụng tuyệt vời - cảm ơn bạn! Hoạt động tốt trên các thiết bị của tôi, bao gồm cả Samsung Smart TV (UE40ES6100). Chỉ cần một lưu ý: chúng tôi cũng cần python-requestslàm phụ thuộc và chúng tôi có thể chọn trình kết xuất từ ​​các điều khiển âm thanh mặc định - không cần cài đặt pavucontrol.
Takkat

Vui vì bạn thích nó. Tôi vừa cập nhật README. Cảm ơn các gợi ý!
Massimo

2
Giải pháp tuyệt vời. Cảm ơn. Nhưng tôi có một câu hỏi: Có độ trễ phát lại vài giây (10 giây sau khi nhấn tạm dừng trong VLC). Đây có phải là "tính năng" DLNA hay có cách nào để giảm bớt nó không? Vì vậy, DLNA không có ý nghĩa cho phát lại video hoặc chơi game? :(
JPT

2
Sự chậm trễ đến từ việc lấp đầy bộ đệm HTTP. Nó giữ cho luồng phát trong trường hợp kết nối của bạn có vấn đề (wifi yếu, v.v.). Nếu bạn muốn giảm độ trễ, hãy sử dụng codec cần nhiều băng thông ( wav ) để lấp đầy bộ đệm đó nhanh hơn. Kết nối cáp luôn giúp. Nếu không, điều này là rất cụ thể để thực hiện phần mềm nhà sản xuất của bạn. Ví dụ, tôi có độ trễ với Cocy khoảng 1 giây. Sonos Play 1 với wav: 1 giây, với mp3: 5 giây. Tất cả được kết nối qua cáp. Nhưng bạn sẽ không thoát khỏi nó hoàn toàn. Mục đích chính là âm nhạc và sách âm thanh. Tất cả mọi thứ không cần phải đồng bộ.
Massimo

1
@JPT và mọi người khác đang tìm cách khắc phục độ trễ (10 giây cho tôi): Sử dụng shairport-sync Tôi đang chạy một chiếc AirPlay trên RaspberryPi song song với bồn rửa DLNA và phải nói rằng độ trễ ngắn hơn nhiều (~ 2s để bắt đầu, dừng lại là ngay lập tức). Điều đó đang được nói, cảm ơn rất nhiều đến Massimo bởi vì, quên đi sự chậm trễ, pulseaudio-dlna hoạt động như một lá bùa và thực sự là không đáng để cài đặt! (AirPlay khá khó khăn hơn để thiết lập cho tôi.)
balu

8

Pavucontrol là vật phẩm còn thiếu trong trò chơi ghép hình này! Tôi cũng đã thiết lập mọi thứ chính xác và thiết bị bên ngoài (TV LG) đang hiển thị rằng âm thanh đang được phát nhưng tôi không nghe thấy bất kỳ âm thanh nào. Hôm nay tôi đã cài đặt pavucontrol và khi tôi mở nó, tôi thấy tùy chọn kênh âm thanh thông qua máy chủ DLNA. Tùy chọn DLNA chỉ được hiển thị khi có đầu ra âm thanh từ trình phát đến pulseaudio. nhập mô tả hình ảnh ở đây


Cảm ơn vì đã chia sẻ. Làm thế nào bạn thiết lập máy chủ DLNA? Đối với tôi atm Rygel thoát với các segfaults khá vô ích.
Takkat

Tôi chỉ có các thiết lập bình thường. Tôi đã theo cùng một liên kết như bạn đã đề cập trong bài đăng của mình. [GstLaunch] enable = true launch-items = audiotestsrc; audiotestsrc-title = Desktop Live Streaming! audiotestsrc-mime = audio / mpeg audiotestsrc-launch = pulkesrc device = upnp.monitor! mục tiêu lamemp3enc = chất lượng chất lượng = 6
jumbli

Kỳ dị. Với Rhybeatbox, các segfaults đã biến mất nhưng tôi vẫn chỉ nhận được Invalid seek requesttừ Rygel. Các thư mục phương tiện ở đó nhưng luồng GST của tôi luôn là EOF.
Takkat

Ngoài ra, nó còn cho phép bạn đặt một bồn rửa cho mỗi ứng dụng có thể phát âm thanh! Tôi có thể nghe nhạc trên âm thanh nổi lớn của mình và giữ video hoặc âm thanh trò chơi trên máy tính của mình. Cảm ơn!
tải vào

Điều này đã giải quyết vấn đề của tôi khi tất cả được kết nối và chơi nhưng chỉ thiếu âm thanh!
Easwee

4

Tôi xin lỗi tôi không thể giúp bạn với Rygel, nhưng có thể có một sự thay thế có thể phù hợp với bạn.

Nguyên tắc là lấy một chương trình để ghi lại luồng vào một audiofile, sau đó khởi chạy miniDLNA với một cấu hình tùy chỉnh trỏ đến thư mục của luồng đó.

Ví dụ: Giả sử chúng tôi đang làm việc trong ~ / stream /. Tạo ~ / 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

Sau đó lưu luồng vào một audiofile trong thư mục đó. Googling cho "FFmpeg ghi âm thanh thẻ âm thanh" mang lại lệnh này

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

nhưng tôi đã không gặp nhiều may mắn với nó. Một tùy chọn khác là vlc là bạn có sẵn GUI và điều này không hoạt động.

Sau đó khởi động miniDLNA trong một cửa sổ đầu cuối khác:

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

sẽ xác định vị trí OutputStream.flac và sau đó có thể truy cập từ thiết bị mạng của bạn.

Hy vọng rằng nếu bạn chưa giải quyết được nó sẽ cho bạn một vài ý tưởng.


1
Cách tiếp cận đầy hứa hẹn - cảm ơn bạn - nhưng nó cần được sàng lọc thêm. Với một thử nghiệm nhanh với miniDLNA ngày hôm nay, tôi không thể nhận được tệp luồng được nhận bởi máy khách DLNA của mình. Ngoài ra, các luồng được tạo bởi ffmpeg dường như khá kém (nhiễu tĩnh). Tôi đang ở đó và cho bạn biết.
Takkat

Cho đến nay chúng ta có thể tạo tệp âm thanh flac hoặc mp3 từ phần chìm âm thanh với ffmpeg hoặc avconv. Tuy nhiên, tập tin này sẽ không được miniDLNA nhận ra trừ khi chúng tôi bỏ ghi âm. Sau đó, chúng ta có thể mở lại tệp này trên máy khách DLNA trong khi ghi phiên bản khác nhưng luồng luôn bắt đầu từ khi bắt đầu ghi và dừng tại thời điểm chúng tôi bắt đầu nghe trên máy khách. Bất kỳ ý tưởng làm thế nào để vượt qua điều này?
Takkat

Vì vậy, ý bạn là một khi bạn đã phá vỡ quy trình ffmpeg để dừng ghi, chỉ khi đó tệp mới được nhận ra bởi miniDLNA? Ngoài ra, chất lượng âm thanh có tốt hơn không? Tôi sẽ dùng thử trên máy của mình và xem liệu tôi có thể dùng lại được không. (Tôi đã có một cái gì đó tương tự hoạt động vào năm ngoái để chuyển mã phim khi đang di chuyển)
mtdevans

Vâng, ngay từ đầu. Lần thứ hai tôi có thể nhận nó từ máy khách nhưng nó bắt đầu từ đầu (tức là bất cứ khi nào tôi bắt đầu ghi) và dừng ở giữa (tức là sau chính xác thời gian giữa bắt đầu ghi và bắt đầu nhận trên máy khách). Âm thanh bây giờ đã ổn, phải tắt song công.
Takkat

4

Một ý tưởng tôi phải truyền "những gì tôi nghe thấy" đến trình kết xuất DLNA (như WDTV) là gửi máy chủ với VLC dưới dạng luồng http với pulse://alsa_output.xxx.monitorđầu vào và chuyển mã sang MP3 hoặc FLAC. Sau đó, tôi muốn sử dụng một số điểm kiểm soát DLNA để cho trình kết xuất phát luồng taht. VLC không phục vụ luồng chuyển mã chính xác, nhưng nó không cho phép đặt loại mime, vì vậy trình kết xuất từ ​​chối phát nó.

Ý tưởng tiếp theo là viết một máy chủ http bằng python phục vụ luồng thay thế. Nó nhận được luồng âm thanh từ xung với parec, mã hóa nó bằng flac( lamehoặc bất cứ thứ gì bạn muốn) và đặt loại mime chính xác.

Nó hoạt động với kịch bản (rất đơn giản) sau:

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

Điều chỉnh các tham số, chạy nó và trỏ trình kết xuất DLNA vào máy của bạn. Nó hoạt động với tôi với WDTV là trình kết xuất và điện thoại Android có BubbleUPnP làm điểm kiểm soát (Bạn có thể nhập URL luồng khi thêm mục mới vào danh sách phát theo cách thủ công). Nhưng nó nên hoạt động với bất kỳ thiết bị tuân thủ DLNA nào.


4

LƯU Ý: Giải pháp này hoạt động, nhưng một giải pháp mới hơn và có thể tốt hơn đã được Massimo đề xuất.

Đây là câu trả lời cho Ubuntu 14.04 (cũng đã được thử nghiệm và hoạt động vào ngày 15.04 ), để hoàn thiện:

  1. cài đặt bất kỳ gói cần thiết: sudo apt-get install rygel rygel-preferences rygel-gst-launch

  2. tạo tập tin ~/.config/rygel.confcó chứa như sau:

    [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. Thực hiện các lệnh sau từ dòng lệnh (chúng có thể được đưa vào tập lệnh nếu muốn):

    pactl load-module module-http-protocol-tcp
    pactl load-module module-rygel-media-server 
    rygel &
    
  4. Chạy paprefslệnh và đảm bảo rằng cả hai tùy chọn DLNA đều được bật (đã chọn) trên tab "Máy chủ mạng".

  5. Phát một số âm thanh trên máy tính của bạn. Chạy pavucontrolchương trình và trên tab "Phát lại", thay đổi thiết bị đầu ra thành "DLNA / UPnP Streaming".

Tại thời điểm này, bạn sẽ có thể phát các luồng MPEG và FLAC từ máy khách DLNA (điểm kết xuất / điểm kiểm soát).

LƯU Ý: bạn có thể cần phải khởi động lại máy tính (hoặc khởi động lại xung) để mọi thứ bắt đầu hoạt động.


3

Kịch bản python từ Adam là những gì tôi cần. Xuất sắc. Rygel với gst-launch không hoạt động với một trong các trình kết xuất của tôi, nhưng tập lệnh này hoạt động với cả hai. Trong trường hợp của tôi, tôi đang lấy đầu vào luồng âm thanh từ bóp (đối với squeezebox) và gửi đến trình kết xuất. Kịch bản cũng hoạt động ở dạng ban đầu để lấy đầu vào từ màn hình pulseaudio nếu đó là những gì cần thiết.

Biết rất ít về bất kỳ điều này, tôi đã xoay sở để thực hiện một số bổ sung cho kịch bản:

i) cho phép nó được chạy từ tập lệnh shell và được kết thúc bằng SIGTERM / SIGKILL (câu lệnh 'ngoại trừ' hiện bao gồm 'systemexit')

ii) cho phép dừng tập lệnh và khởi động lại và sử dụng lại cùng một cổng (vì đó là tập lệnh được khởi động lại có xu hướng không nói rằng nó không thể mở cổng nếu trình kết xuất vẫn mở) - (câu lệnh allow_Vuse_address = True)

iii) tạo một phiên bản lấy đầu vào từ stdin và định dạng lại bằng cách sử dụng sox để xuất ở định dạng wav (trên cổng 8082)

Vì vậy, phiên bản của tôi trông như:

#!/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
Tôi đã tìm thấy một vài vấn đề nhỏ với kịch bản này.
pastim

@Adam - Sau nhiều thử nghiệm, tôi đã tìm thấy một vài vấn đề nhỏ với chương trình này. Tuy nhiên, vấn đề lớn nhất là việc phát trực tuyến dừng với lỗi 32 (Đường ống bị hỏng) sau một thời gian tỷ lệ thuận với lượng dữ liệu được gửi. Đối với luồng chất lượng 24/96000, điều này chỉ hơn một giờ. Tại 24/192000, chỉ mất hơn 30 phút. Đối với chất lượng CD có phần hơn 3 giờ. Bằng cách chọn lại luồng trên trình kết xuất, luồng bắt đầu lại. Tôi tin rằng giải pháp có thể là 'mã hóa chunked'. Tôi tự hỏi nếu có ai đã sản xuất một phiên bản chunked.
pastim

1

Không chắc bây giờ nó có hữu ích cho bạn không, nhưng tôi đã viết một bài về việc làm cho nó hoạt động trên Ubuntu 12.10:

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


Cảm ơn bạn đã chia sẻ điều này - chính xác là những gì cho đến nay luôn thất bại với tôi. Từ thiết kế của trang web này, chúng tôi muốn khuyến khích bạn phác thảo các bước bạn đã thực hiện (ngoài việc chỉ đăng liên kết lên blog của bạn) vì các liên kết có thể biến mất theo thời gian do đó khiến câu trả lời của bạn trở nên vô dụng. Tôi sẽ liên lạc lại với bạn ngay khi tôi có thể kiểm tra điều này.
Takkat

Đây là quan sát của tôi cho đến nay: Theo hướng dẫn của bạn gặp sự cố Rygel với SEGFAULT khi chọn luồng âm thanh từ máy khách trong 12.04. Trong 12.10, chúng tôi không thể tạo luồng bằng GST-Launch. Còn thiếu gì không?
Takkat

Câu hỏi là khoảng 12.04 và câu trả lời này là dành cho Ubuntu 12.10, nếu không tôi sẽ bỏ phiếu. :)
jdthood

Người đến từ tương lai ở đây: liên kết đó đã mục nát. : P
datashaman

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.