DLNA 호환 장치에 라이브 오디오 스트림을 설정하려면 어떻게합니까?


53

12.04.1 LTS amd64 데스크탑에서 네트워크의 DLNA 호환 외부 장치로 사운드 카드의 라이브 출력을 스트리밍 할 수 있습니까? Rygel, miniDLNA 및 uShare를 사용하여 공유 디렉토리에서 미디어 컨텐츠를 선택하는 것은 항상 좋지만 지금까지 DLNA를 통해 클라이언트에 라이브 오디오 스트림을 가져 오지 못했습니다.

Pulseaudio는 Rygel과 함께 DLNA / UPnP 미디어 서버를 가지고 있다고 주장합니다. 그러나 우리는 그것을 실행할 수 없었습니다.

우리는 live.gnome.org에 요약 된 단계 , 여기에 대한 답변 , 그리고 다른 유사한 안내서를 따랐습니다 .


12.04 LTS 에서는 로컬 오디오 장치 또는 DLNA 클라이언트의 GST-Launch 스트림을 선택할 수 있지만 Rygel은 다음 메시지를 표시하고 클라이언트는 재생 목록의 끝에 도달했음을 나타냅니다.

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

클라이언트에서 라이브 오디오 스트림을들을 수있는 방법이 없었습니다.


14.04 LTS 로 배포를 업그레이드 한 후에 만 DLNA 렌더러의 라이브 스트림을 아래 답변에서설명 된 설정 중에서 선택할 수있었습니다 . 여전히 우리는 리겔을 시작한 기존 스트림을 선택 해야했고 UPnP 장치에 새로운 스트림을 푸시 할 수 없었습니다. 오디오 메타 데이터가 전송되지 않았습니다.


사운드 카드의 오디오를 라이브 스트림으로 DLNA 클라이언트에 전송하기위한 다른 대안이 있습니까?


수신기 장치로 DLNA 스트리밍을 피할 수 있습니까? : 내 솔루션은 HTTP를 통해 펄스 오디오 스트림을 통과 여기에서 자세한 내용을 볼 수있다 sandalov.org/blog/1441
DmitrySandalov을

죄송합니다. 아니요, DLNA는 다양한 클라이언트 (TV, AV 리시버, Blueray 플레이어 등)에서만 널리 구현되므로 DLNA가 제대로 작동하기를 원합니다.
Takkat

내가 말하고있는 솔루션 인 Takkat은 내 AVR로 스트리밍하는 문제를 해결했습니다. DLNA 서버를 실제로 시작하려면 12.04 ( 'pacmd load-module module-http-protocol-tcp'이후)에 rygel + pulseaudio에 긍정적 인 경험이 있었고 12.10에 동일한 'Invalid seek request'경고를 받았습니다. .
DmitrySandalov

@DmitrySandalov : Rygel을 펄스 오디오 출력을 라이브 스트리밍으로 설정하는 방법에 대한 세부 정보를 공유하면 정말 멋집니다.
Takkat

답변:


63

펄스 오디오 -DLNA

네트워크의 모든 upnp 렌더러를 발견하고 펄스 오디오에 싱크로 추가하는 작은 서버를 만들었습니다. 따라서 pavucontrol을 통해 모든 애플리케이션을 제어하여 upnp 장치에서 재생할 수 있습니다.

그것은 리눅스에서 upnp 장치를 다룰 때 항상 원했던 편안함입니다.

이 응용 프로그램은 git 에서 다운로드 할 수있는 소스 또는 DEB 패키지에서 설치하거나 프로젝트의 공식 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 Smart TV (UE40ES6100)를 포함한 장치에서 제대로 작동했습니다. 참고 사항 : python-requests의존성 도 필요 했으며 기본 오디오 컨트롤에서 렌더러를 선택할 수 있습니다-pavucontrol을 설치할 필요가 없습니다.
Takkat

당신이 그것을 좋아해서 다행입니다. README를 방금 업데이트했습니다. 힌트 주셔서 감사합니다!
Massimo

2
훌륭한 솔루션. 감사. 그러나 한 가지 질문이 있습니다. 몇 초의 재생 지연이 있습니다 (VLC에서 일시 중지를 누른 후 10 초). 이것이 DLNA "기능"입니까, 아니면 그것을 줄일 수있는 방법이 있습니까? DLNA가 비디오 재생이나 게임에 적합하지 않습니까? :(
JPT

2
HTTP 버퍼를 채우면 지연이 발생합니다. 연결에 문제가있는 경우 (약한 Wi-Fi 등) 스트림을 계속 재생합니다. 지연을 줄이려면 버퍼를 더 빨리 채우기 위해 많은 대역폭 ( wav ) 이 필요한 코덱을 사용하십시오 . 케이블 연결이 항상 도움이됩니다. 그렇지 않으면 제조업체 펌웨어 구현에 따라 다릅니다. 예를 들어 약 1 초 동안 Cocy가 지연됩니다. Sonos 재생 : wav : 1 초, mp3 : 5 초 모두 케이블을 통해 연결되었습니다. 그러나 당신은 그것을 완전히 제거하지 못할 것입니다. 주요 목적은 음악 및 오디오 북입니다. 동기화 할 필요가없는 모든 것.
Massimo

1
@ JPT와 다른 사람들이 지연을 해결하는 방법을 찾고 있습니다 (10 초) : shairport-sync 사용 DLNA 싱크와 병렬로 RaspberryPi에서 AirPlay 싱크를 실행하고 지연이 훨씬 짧습니다 (~ 시작하려면 2 초가 걸립니다. 즉, 지연 시간을 잊어 버린 pulseaudio-dlna는 매력처럼 작동하며 실제로 설치하기가 쉽지 않기 때문에 Massimo에게 많은 감사를 전합니다. (AirPlay는 설정하기가 약간 더 어려웠습니다.)
balu

8

Pavucontrol은이 직소 퍼즐에서 빠진 아이템입니다! 또한 모든 것을 올바르게 설정했으며 외부 장치 (LG TV)에서 사운드가 재생되고 있지만 아무 소리도 들리지 않았다고 표시했습니다. 오늘 나는 pavucontrol을 설치했고 그것을 열었을 때 DLNA 서버를 통해 사운드를 채널로 보내는 옵션을 발견했습니다. DLNA 옵션은 플레이어에서 펄스 오디오로 사운드가 출력되는 경우에만 표시됩니다. 여기에 이미지 설명을 입력하십시오


이것을 공유해 주셔서 감사합니다. DLNA 서버를 어떻게 설정 했습니까? 저에게 atm Rygel은 오히려 도움이되지 않는 segfaults로 종료됩니다.
Takkat

정상적인 설정이 있습니다. 글에서 언급 한 것과 동일한 링크를 따라갔습니다. [GstLaunch] enabled = true launch-items = audiotestsrc; audiotestsrc-title = 데스크탑 라이브 스트리밍! audiotestsrc-mime = audio / mpeg audiotestsrc-launch = pulsesrc device = upnp.monitor! lamemp3enc target = 품질 품질 = 6
jumbli

기묘한. Rhythmbox를 사용하면 segfault가 사라졌지 만 여전히 Invalid seek requestRygel 에서만 가져 옵니다. 미디어 디렉토리는 있지만 GST 스트림은 항상 EOF입니다.
Takkat

또한 오디오를 재생할 수있는 각 앱의 싱크를 설정할 수 있습니다! 큰 스테레오에서 음악을 듣고 컴퓨터에서 비디오 또는 게임 사운드를 유지할 수 있습니다. 감사!
스프링로드

모든 것이 연결되어 있고 재생되었지만 소리가 누락되었을 때 문제가 해결되었습니다!
easwee

4

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

그런 다음 해당 디렉토리의 오디오 파일에 스트림을 저장하십시오. "FFmpeg record sound card audio"에 대한 인터넷 검색에서이 명령이 생성되었습니다.

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을 찾은 다음 네트워크 장치에서 액세스 할 수.

다행히도 아직 해결하지 못한 경우 몇 가지 아이디어가 제공되기를 바랍니다.


1
유망한 접근법-감사합니다-그러나 더 세분화해야합니다. 오늘 miniDLNA를 사용한 빠른 테스트를 통해 DLNA 클라이언트가 스트림 파일을 인식하지 못했습니다. 또한 ffmpeg에 의해 생성 된 스트림은 다소 열악한 것 같습니다 (정적 잡음). 나는 그것에 있고 당신에게 알려줍니다.
Takkat

지금까지 오디오 싱크에서 ffmpeg 또는 avconv를 사용하여 flac 또는 mp3 오디오 파일을 생성 할 수 있습니다. 그러나 녹음을 종료하지 않으면 miniDLNA에서이 파일을 인식하지 못합니다. 그런 다음 다른 인스턴스를 녹음하는 동안 DLNA 클라이언트에서이 파일을 다시 열 수 있지만 스트림은 항상 녹음 시작부터 시작하여 클라이언트 청취를 시작했을 때 중지됩니다. 이것을 극복하는 방법에 대한 아이디어가 있습니까?
Takkat

ffmpeg 프로세스를 중단 한 후 기록을 중지하면 miniDLNA가 파일을 인식한다는 의미입니까? 또한 오디오 품질이 더 좋습니까? 나는 내 컴퓨터에서 그것을 시도하고 다시 갈 수 있는지 확인합니다. (저는 작년에 영화를 트랜스 코딩하는 비슷한 작업을했습니다)
mtdevans

예, 처음에 두 번째로 클라이언트에서 액세스 할 수 있지만 처음부터 시작하여 (즉, 녹음을 시작할 때마다) 중간에서 멈 춥니 다 (즉, 녹음 시작과 클라이언트에서 수신 시작 사이의 시간이 지난 후). 오디오는 이제 괜찮습니다. 듀플렉스를 비활성화해야했습니다.
Takkat

4

WDTV와 같은 DLNA 렌더러에 "내가 듣는 것"을 스트리밍해야하는 한 가지 아이디어는 VLC를 사용하여 스트림을 http 스트림 pulse://alsa_output.xxx.monitor으로 입력하고이를 MP3 또는 FLAC로 트랜스 코딩하는 것입니다. 그런 다음 렌더러가 스트림을 재생할 수 있도록 DLNA 제어점을 사용하고 싶었습니다. VLC는 트랜스 코딩 된 스트림을 올바르게 제공하지만 MIME 유형을 설정할 수 없으므로 렌더러가이를 재생하지 않습니다.

다음 아이디어는 대신 스트림을 제공하는 http 서버를 파이썬으로 작성하는 것이 었습니다. 로 펄스에서 오디오 스트림을 가져 와서 (또는 원하는대로) parec인코딩 하고 MIME 유형을 올바르게 설정합니다.flaclame

다음 (매우 간단한) 스크립트와 함께 작동합니다.

#!/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를 렌더러로 사용하고 BubbleUPnP를 제어점으로 사용하는 Android 전화에서 나에게 도움이되었습니다 (재생 목록에 새 항목을 수동으로 추가 할 때 스트림 URL을 입력 할 수 있음). 그러나 모든 DLNA 호환 장치와 작동해야합니다.


4

참고 :이 솔루션은 작동하지만 Massimo는 새롭고 더 나은 솔루션 을 제안했습니다.

다음 은 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명령을 실행하고 "Network Server"탭에서 두 DLNA 옵션이 활성화 (체크)되었는지 확인하십시오.

  5. 컴퓨터에서 오디오를 재생하십시오. pavucontrol프로그램을 실행하고 "재생"탭에서 출력 장치를 "DLNA / UPnP 스트리밍"으로 변경하십시오.

이 시점에서 DLNA 클라이언트 (렌더러 / 제어점)에서 MPEG 및 FLAC 스트림을 재생할 수 있어야합니다.

참고 : 작업을 시작하려면 컴퓨터를 다시 시작하거나 펄스를 다시 시작해야 할 수도 있습니다.


3

Adam의 Python 스크립트는 내가 필요한 것입니다. 훌륭한. gst-launch가 포함 된 Rygel은 내 렌더러 중 하나에서 작동하지 않지만이 스크립트는 두 가지 모두에서 작동합니다. 필자의 경우 Squeezelite (squeezebox 용)에서 오디오 스트림 입력을 가져 와서 렌더러로 보냅니다. 이 스크립트는 원래 형식으로 작동하여 필요한 경우 펄스 오디오 모니터에서 입력을받습니다.

이것에 대해 거의 알지 못해서 스크립트에 다음을 추가했습니다.

i) 쉘 스크립트에서 실행하고 SIGTERM / SIGKILL ( 'except'문에 'systemexit'이 포함됨)로 종료되도록 허용

ii) 스크립트를 중지했다가 다시 시작하고 동일한 포트를 다시 사용할 수 있습니다 (다시 시작된 스크립트가 렌더러가 여전히 열려 있으면 포트를 열 수 없다는 말이 실패하는 경향이 있기 때문에)-(allow_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 품질 스트림의 경우 이것은 1 시간 이상입니다. 192000 년 24 월에는 30 분이 조금 넘습니다. CD 품질은 3 시간 이상입니다. 렌더러에서 스트림을 다시 선택하면 스트림이 다시 시작됩니다. 솔루션이 '청크 인코딩'일 수 있다고 생각합니다. 누구든지 청크 버전을 생산했는지 궁금했습니다.
pastim

1

이것이 현재 당신에게 도움이 될지 확실하지 않지만 우분투 12.10 에서이 기능을 작동시키는 것에 대한 게시물을 작성했습니다.

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


이것을 공유해 주셔서 감사합니다-지금까지 항상 실패한 것이 있습니다. 이 사이트의 디자인에서 링크가 시간이 지남에 따라 사라져 귀하의 답변이 쓸모 없게되므로 블로그에 링크를 게시하는 것 외에도 귀하가 취한 단계를 설명하도록 권장하고 있습니다. 테스트 할 수있게 되 자마자 다시 연락 드리겠습니다.
Takkat

지금까지의 관찰 결과는 다음과 같습니다. 12.04에서 클라이언트에서 오디오 스트림을 선택할 때 가이드에 따라 Rygel이 SEGFAULT와 충돌합니다. 12.10에서는 GST-Launch를 사용하여 스트림을 만들 수 없습니다. 빠진 것이 있습니까?
Takkat

질문은 약 12.04 였고이 답변은 우분투 12.10에 대한 것입니다. 그렇지 않으면 투표하겠습니다. :)
jdthood 2016

미래의 사람 : 여기 링크가 썩었습니다. : P
datashaman

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.