DLNA準拠デバイスへのライブオーディオストリームを設定するにはどうすればよいですか?


54

サウンドカードのライブ出力を12.04.1 LTS amd64デスクトップからネットワーク内のDLNA準拠の外部デバイスにストリーミングする方法はありますか?Rygel、miniDLNA、およびuShareを使用して共有ディレクトリのメディアコンテンツを選択することは常に問題ありませんが、これまでのところ、DLNAを介してクライアントにライブオーディオストリームを取得することは完全に失敗しました。

Pulseaudioは、Rygelと一緒にこれを行うことになっているDLNA / UPnPメディアサーバーがあると主張しています。しかし、それを実行することはできませんでした。

live.gnome.orgこの回答、および別の同様のガイドで概説されている手順に従いました。


LTS 12.04我々はDLNAクライアントでローカルオーディオデバイス、または当社のGST-起動ストリームを選択することができますが、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はさまざまなクライアント(テレビ、AVレシーバー、Bluerayプレーヤーなど)にのみ広く実装されているため、申し訳ありません。
-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

Pulseaudio-DLNA

ネットワーク内のすべてのupnpレンダラーを検出し、それらをpulseaudioのシンクとして追加する小さなサーバーを作成しました。したがって、pavucontrolを介してすべてのアプリケーションを制御し、upnpデバイスで再生できます。

これは、Linuxで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の「About」も参照してください。

DLNAレンダラーが存在する場合、サウンドメニューから出力シンクとして選択できます。

ここに画像の説明を入力してください


3
素晴らしいアプリケーション-ありがとう!Samsung Smart TV(UE40ES6100)などのデバイスで正常に動作しました。注:python-requests依存関係としても必要であり、デフォルトのオーディオコントロールからレンダラーを選択できます。pavucontrolをインストールする必要はありません。
タックカット

気に入ってくれて嬉しいです。READMEを更新しました。ヒントをありがとう!
マッシモ

2
素晴らしい解決策。ありがとう。しかし、1つ質問があります。数秒の再生遅延があります(VLCで一時停止を押してから10秒後)。これはDLNAの「機能」ですか、またはそれを減らす方法はありますか?DLNAはビデオの再生やゲームには意味がありませんか?:(
JPT

2
遅延は、HTTPバッファーがいっぱいになることで発生します。接続に問題がある場合(Wi-Fiが弱いなど)、ストリームを再生し続けます。遅延を減らしたい場合は、より多くの帯域幅(wav)を必要とするコーデックを使用して、そのバッファーをより速く満たすようにします。ケーブル接続は常に役立ちます。それ以外の場合、これはメーカーのファームウェア実装に非常に固有です。例えば、私はCocyで約1秒遅れています。Sonos Play 1でwav:1秒、mp3:5秒。すべてケーブルで接続されています。しかし、それを完全に取り除くことはできません。主な目的は音楽とオーディオブックです。同期する必要のないものすべて。
マッシモ

1
@JPTと遅延を修正する方法を探している他のすべての人(私には10秒):shairport-syncを使用して、RaspberryPiでDLNAシンクと並行してAirPlayシンクを実行していますが、遅延ははるかに短い(〜起動するには2秒、停止は即時です)。そうは言っても、遅延を忘れて、pulseaudio-dlnaは魅力のように機能し、インストールするのは本当に簡単だからです。(AirPlayをセットアップするのはかなり困難でした。)
balu

8

Pavucontrolは、このジグソーパズルに欠けているアイテムです!また、すべてを正しくセットアップし、外部デバイス(LG TV)がサウンドが再生されていることを示していましたが、サウンドが聞こえませんでした。今日、pavucontrolをインストールし、それを開いたときに、DLNAサーバーを介して音声を流すオプションを見つけました。DLNAオプションは、プレーヤーからpulseaudioへの音声出力がある場合にのみ表示されます。 ここに画像の説明を入力してください


これを共有していただきありがとうございます。DLNAサーバーをどのようにセットアップしましたか?私にとってatm Rygelはやや役に立たないセグメンテーション違反で終了します。
Takkat

通常の設定があります。あなたがあなたの投稿で言及したのと同じリンクをたどった。[GstLaunch] enabled = true launch-items = audiotestsrc; audiotestsrc-title =デスクトップライブストリーミング!audiotestsrc-mime = audio / mpeg audiotestsrc-launch = pulsesrc device = upnp.monitor!lamemp3enc target = quality quality = 6
jumbli

奇妙な。Rhythmboxを使用すると、セグメンテーション違反はなくなりましたが、Rygel Invalid seek requestからしか取得できません。メディアディレクトリはありますが、私の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

しかし、私はそれで多くの運を持っていませんでした。もう1つのオプションは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

そもそも。2回目はクライアントからアクセスできますが、最初から(つまり、記録を開始するたびに)開始し、途中(つまり、記録を開始してからクライアントで受信を開始するまでのちょうど後)に停止します。オーディオは今は正常で、デュプレックスを無効にする必要がありました。
Takkat

4

「聞いたこと」をDLNAレンダラー(WDTVなど)にストリーミングしなければならなかった1つのアイデアはpulse://alsa_output.xxx.monitor、入力としてVLCをhttpストリームとしてサーバーに提供し、MP3またはFLACにトランスコードすることでした。次に、DLNAコントロールポイントを使用して、レンダラーにストリームを再生させたいと思いました。VLCはトランスコードされたストリームを正しく提供しますが、MIMEタイプを設定できないため、レンダラーはそれを再生することを拒否します。

次のアイデアは、代わりにストリームを提供するpythonでhttpサーバーを作成することでした。pulseからオーディオストリームを取得し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を使用し、コントロールポイントとして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コマンドを実行し、[ネットワークサーバー]タブで両方のDLNAオプションが有効(チェック)になっていることを確認します。

  5. コンピューターでオーディオを再生します。pavucontrolプログラムを実行し、[再生]タブで、出力デバイスを[DLNA / UPnPストリーミング]に変更します。

この時点で、DLNAクライアント(レンダラー/コントロールポイント)からMPEGおよびFLACストリームを再生できるはずです。

注:作業を開始するには、コンピューターの再起動(または再起動パルス)が必要な場合があります。


3

Adamのpythonスクリプトは、まさに私が必要としたものです。ブリリアント。gst-launchを使用したRygelはレンダラーの1つでは機能しませんが、このスクリプトは両方で機能します。私の場合、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
このスクリプトにはいくつかの小さな問題が見つかりました。
パスティム14年

@Adam-いくつかの試行の後、このプログラムにいくつかの小さな問題が見つかりました。ただし、最大の問題は、送信されたデータの量に正比例した時間が経過した後、ストリーミングがエラー32(パイプの破損)で停止することです。24/96000品質のストリームの場合、これは1時間強です。24/192000では、30分強です。3時間以上のCD品質の場合。レンダラーでストリームを再度選択すると、ストリームが再び開始されます。ソリューションは「チャンクエンコーディング」であると考えています。誰かがチャンクバージョンを作成したのだろうかと思いました。
パスティム14年

1

これがあなたにとって今役立つかどうかはわかりませんが、これをUbuntu 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起動でストリームを作成できません。不足しているものはありますか?
Takkat

質問は12.04に関するもので、この回答はUbuntu 12.10に関するものです。それ以外の場合は投票します。:)
jdthood

ここから未来の人:そのリンクは腐っています。:P-
データシャマン

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.