サウンドカードのライブ出力を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レンダラーでライブストリームを適切に選択できました 以下の回答で概説 。それでも、rygelを起動した後、UPnPデバイスに新しいストリームをプッシュできなかったため、確立されたストリームを選択する必要がありましたafter。オーディオメタデータは送信されませんでした。
サウンドカードのオーディオをライブストリームとしてDLNAクライアントに送信する他の方法はありますか?
ネットワーク内のすべてのupnpレンダラーを検出し、それらをpulseaudioのシンクとして追加する小さなサーバーを作成しました。したがって、pavucontrolを介してすべてのアプリケーションを制御し、upnpデバイスで再生できます。
これは、Linuxでupnpデバイスを扱うときにいつも欲しかった快適さです。
アプリケーションはソースまたはDEBパッケージからインストールできます gitからダウンロード可能 、またはプロジェクトの公式を追加した後 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レンダラーが存在した場合、サウンドメニューから出力シンクとして選択できます。
Pavucontrolは、このジグソーパズルで不足しているアイテムです!また、すべてを正しくセットアップし、外部デバイス(LG TV)が音が再生されていることを示していましたが、音が聞こえませんでした。今日、pavucontrolをインストールし、それを開いたときに、DLNAサーバーを介してサウンドを流すオプションを見つけました。 DLNAオプションは、プレーヤーからpulseaudioへの音声出力がある場合にのみ表示されます。
「私が聞いたもの」をDLNAレンダラー(WDTVなど)にストリーミングしなければならなかった1つのアイデアは、VLCをhttpストリームとしてPulse://alsa_output.xxx.monitor
を入力としてストリームし、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準拠のデバイスであれば動作するはずです。
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
should OutputStream.flacを見つけて、ネットワークデバイスからアクセスできるようにします。
まだ解決していない場合は、いくつかのアイデアが得られれば幸いです。
注:この解決策は機能しますが、Massimoによって 新しい、おそらくより良い解決策 が提案されています。
ここに回答がありますUbuntu 14.04(またテストされ、15.04で作業中) 、完全を期すために:
必要なパッケージをインストールします:Sudo apt-get install rygel rygel-preferences rygel-gst-launch
以下を含むファイル~/.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=
コマンドラインから次のコマンドを実行します(これらは必要に応じてスクリプトに入れることができます)。
pactl load-module module-http-protocol-tcp
pactl load-module module-rygel-media-server
rygel &
paprefs
コマンドを実行し、[ネットワークサーバー]タブで両方のDLNAオプションが有効(チェック)になっていることを確認します。
コンピューターでオーディオを再生します。 pavucontrol
プログラムを実行し、[再生]タブで、出力デバイスを[DLNA/UPnPストリーミング]に変更します。
この時点で、DLNAクライアント(レンダラー/コントロールポイント)からMPEGおよびFLACストリームを再生できるはずです。
注:作業を開始するには、コンピューターの再起動(またはPulseの再起動)が必要になる場合があります。
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()
これが今あなたに役立つかどうかはわかりませんが、Ubuntu 12.10でこれを機能させる方法についての投稿を書きました。
http://dpc.ucore.info/blog/2012/11/07/dlna-streaming-in-ubuntu-12-dot-10/