Mopidy: gstreamerFIFOシンクの追加を検討してください

作成日 2014年07月08日  ·  73コメント  ·  ソース: mopidy/mopidy

人々はncmpcppのビジュアライザーを本当に気に入っているように見えるので、これは次々と登場します

信頼性の高いFIFOシンクを作成するための秘訣は2つあります。 非ブロッキング書き込みを使用する必要があります。つまり、リーダーがない限り、書き込みソケットを開くことは失敗します。したがって、リーダーも必要です。 次に、外部リーダーが遅れているか存在しないためにバッファーがいっぱいになった場合、内部リーダーはバッファーをクリアする必要があります。

次のコードは、この基本的な要点を示していますが、エラー処理に関してはさらに作業が必要です。

import errno
import os
import stat

LINUX_FIFO_BUFFER_SIZE = 65536


class FifoStreamer(object):                                                     
    def __init__(self, location):                                               
        self.location = location                                                
        self.reader = None                                                      
        self.writer = None                                                      

    def create(self):                                                           
        try:                                                                    
            mode = os.stat(self.location).st_mode                               
            if not stat.S_ISFIFO(mode):                                         
                raise Exception('File exists but is not a FIFO')                
        except OSError as e:                                                    
            if e.errno == errno.ENOENT:                                         
                os.mkfifo(self.location)                                        
            else:                                                               
                raise                                                           

        # TODO: wrap in could not open reader / writer?
        self.reader = os.open(self.location, os.O_NONBLOCK | os.O_RDONLY)       
        self.writer = os.open(self.location, os.O_NONBLOCK | os.O_WRONLY)       

    def close(self):                                                            
        # TODO: make closing robust
        os.close(self.writer)                                                   
        os.close(self.reader)                                                   

    def write(self, data):                                                      
        while data:                                                             
            try:                                                                
                written = os.write(self.writer, data)                           
                data = data[written:]                                           
            except OSError as e:                                                
                if e.errno == errno.EINTR:                                      
                    continue                                                    
                elif e.errno in (errno.EAGAIN, errno.EWOULDBLOCK):              
                    self.flush()                                                
                else:                                                           
                    raise                                                       

    def flush(self):                                                            
        while True:                                                             
            try:                                                                    
                if not os.read(self.reader, LINUX_FIFO_BUFFER_SIZE):                             
                    break                                                       
            except OSError as e:                                                
                if e.errno in (errno.EAGAIN, errno.EWOULDBLOCK):                
                    break                                                       
                elif e.errno == errno.EINTR:                                    
                    continue                                                    
                else:                                                           
                    raise 

上記のコードをGStreamerと統合する必要がありますが、実際にそれを実行します。 0.10を想定すると、これは実際には非常に実行可能です。私が躊躇している理由は、1.xへの移行を計画しており、girバインディングがPythonで要素を作成するのに適していないためです。 1.xのこのコードの場合、問題は、BaseSinkが検出することを期待するパッドテンプレートを作成できないことに要約されます。 これをプレーンな要素として作成することは可能かもしれませんが、BaseSinkを処理する方法の多くを再実装する必要があります。これにより、正しく機能するようになります。

import gobject                                                                  

import pygst                                                                    
pygst.require('0.10')                                                           
import gst                                                             


class FifoSink(gst.BaseSink):                                                   
    __gstdetails__ = (                                                          
        'FifoSink',                                                             
        'Sink',                                                                 
        'Sink designed to handle FIFO output.',                        
        'Mopidy')                                                               

    __gsttemplates__ = (gst.PadTemplate('sink', gst.PAD_SINK, gst.PAD_ALWAYS,   
                                        gst.caps_new_any()),)                   

    # TODO: don't allow changing location in flight, i.e. create getter/setter
    location = gobject.property(type=str)                                       

    def __init__(self):                                                         
        gst.BaseSink.__init__(self)                                             
        self.streamer = None                                                    

    def do_start(self):                                                                                               
        self.streamer = FifoStreamer(self.location)                             
        self.streamer.create()                                                  
        return True                                                             

    def do_stop(self):                                                          
        self.streamer.close()                                                   
        return True                                                             

    def do_render(self, buf):                                                   
        try:                                                                    
            self.streamer.write(bytes(buf))                                     
            return gst.FLOW_OK                                                  
        except OSError as e:                                                    
            self.error("Failed: %s", e)                                         
            return gst.FLOW_ERROR                                               


gobject.type_register(FifoSink)                                                 
gst.element_register(                                                           
    FifoSink, 'fifosink', gst.RANK_MARGINAL)                                    

if __name__ == '__main__':                                                      
    import gobject                                                              
    gobject.threads_init()                                                      

    output = """                                                                
capsfilter caps="audio/x-raw-int,width=16,rate=44100,channels=1" ! 
tee name=t 
t. ! queue ! alsasink                                                           
t. ! queue ! fifosink location=/tmp/test2.fifo                                  
"""                                                                             

    sink = gst.parse_bin_from_description(                                      
        output, ghost_unconnected_pads=True)                                    

    playbin = gst.element_factory_make('playbin2')                              
    playbin.set_property('audio_sink', sink) 

これをテストする際に遭遇した問題の1つは、実際にはncmpcppで期待されるオーディオ形式と一致することを忘れていたことです。したがって、mono / stereoが実際に一致することを確認してください。

C-enhancement A-audio

最も参考になるコメント

参考までに、gstreamerのudpsinkのサポートをncmpcppに追加したので、fifoハックなしで直接使用できるようになりました。

詳細については、 https://github.com/ncmpcpp/ncmpcpp/commit/fb886f687014e22b2fe1477da855be5201063ea8を参照してください。

ティーザーの下。 これは、mopidy + mopidy-spotify + mopidy-mpd + ncmpcppです。

https://user-images.githubusercontent.com/387658/102549720-e41bf980-40bc-11eb-8127-70889011e52f.mp4

全てのコメント73件

これはどこに行きましたか? これはメインパッケージに追加されますか?

これは、GStreamer 1.0に変換する必要があるため、作業中ではありません。これまでのすべての実験で、Pythonでカスタム要素を実行する際の問題が明らかになりました。 それをすべて解決する方法は他にもありますが、私が取り組む時間はありません。

FIFOサポートが追加されるのを見たいです:)

ncmpcppの音楽ビジュアライザーをmopidyで動作させる方法を探しているところを見つけました。 私は賛成です。

はい、それは私がこれを見つけたのと同じ理由です。 それは本当に素晴らしいでしょう
ストリーミングされた音楽を視覚化できる、

2014-11-06 2:19 GMT-05:00ブレイク[email protected]

ncmpcppの音楽ビジュアライザーを取得する方法を探しているのを見つけました
mopidyで動作します。 私は賛成です。


このメールに直接返信するか、GitHubで表示してください
https://github.com/mopidy/mopidy/issues/775#issuecomment-61936376

gstreamerの視覚化プラグインがありますが、それらを使用するだけではいけませんか?
2014年11月6日08:35、「DiegoBerrocal」 [email protected]は次のように書いています。

はい、それは私がこれを見つけたのと同じ理由です。 それは本当に素晴らしいでしょう
ストリーミングされた音楽を視覚化できる、

2014-11-06 2:19 GMT-05:00ブレイク[email protected]

ncmpcppの音楽ビジュアライザーを入手する方法を探しているのを見つけました

mopidyで動作します。 私は賛成です。


このメールに直接返信するか、GitHubで表示してください
https://github.com/mopidy/mopidy/issues/775#issuecomment-61936376


このメールに直接返信するか、GitHubで表示してください
https://github.com/mopidy/mopidy/issues/775#issuecomment-62007426

これらは次のリリースでリリースされる予定であることに注意してください。

これに取り組んでいる人はいますか? ncmpcppビジュアライザーをmopidyで使用できるのは本当に素晴らしいことです。

私が知っていることではありません。GStreamer1.xへの移行をブロックするため、GStreamer要素としてこれを実行したくない可能性があります。

これは、出力の適切なサポートを追加する際にもブロックされるIMOです。

Mopidy / ncmpcppにビジュアライザーのサポートを追加しようとしたときに、この問題にも遭遇したことを付け加えてください。 現在作業中でなくても、将来的にはこれを持っていたいです。 また、オープンソースプロジェクトに時間を割いてくださった方々にも心から敬意を表したいと思います。 :笑顔:

理想的には、これはリモートで機能します。 Mopidyの力は、プライベートクラウドに組み込むことができるソリューションであることにあります。

一般に、FIFOはプロセス間通信の移植性の高い方法ではないため、IMOは避ける必要があります。 また、このスレッドですでに述べたように、いくつかの厄介な副作用もあります。 個人的にUDPシンクを使用してパケットをダンプする方が良いと思います。これはより一般的なソリューションであり、Mopidyの外部で(必要に応じて)FIFOに書き込むものに簡単に適合させることができます。 (netcatを使用して)UDPポートからデータを読み取り、FIFOに書き込むためのシェルスクリプトの行。

いいですね。 ncmpcppが入力としてそれを使用することも許可するクライアントが嘘をついている可能性があります。

もう1つのアイデアは、Mopidy側で追加の実装を必要としないため、PulseAudioを直接使用することです。 私が作成したDockerコンテナは、TCPを使用してネットワーク経由でPulseAudioにアクセスします。 ncmpcppは実際にそれを直接使用できます。

私が読んだことから、ビジュアライザーは、FIFOファイルから読み取られたサンプルのブロックに対してFFTを実行しているだけです。 私が指摘しているのは、 mkfifoを使用してMopidyの外部にFIFOを作成し、次にnetcatを使用してMopidyからUDPデータを読み取り、出力をnetcatからにリダイレクトできるということです。 FIFOファイル。 したがって、 ncmpcppに関する限り、変更する必要はありません。FIFOファイルを読み取るだけです。

Mopidyで目指していることを達成するために、オーディオ出力プロパティを変更してudpsink GStreamer要素に出力できるため、実装作業は必要ありません。 ALSA / Pulseシンクとudpsinkの両方に出力する「ティー」の一部として配置することをお勧めします。

以下は動作するはずです....テストされていないので、多少の調整が必要になる場合があります。

Mopidyオーディオ構成の場合:

output = tee name=t ! queue ! autoaudiosink t. ! queue ! udpsink port=5555

Linuxホストで、netcatを起動してローカルホストでポート5555のUDPデータをリッスンし、サンプルをFIFOに出力します。

mkfifo /tmp/mopidy.fifo
nc -u -l 127.0.0.1 5555 > /tmp/mopidy.fifo &

mpd.conf内:

audio_output {
    type                    "fifo"
    name                    "my_fifo"
    path                    "/tmp/mopidy.fifo"
    format                  "44100:16:2"
}

注:PulseAudio出力を使用している場合は、TCP方向接続モジュールで同様のことを実行できる可能性があります。 ただし、TCP接続の上で実行されるプロトコルをリバースエンジニアリングする必要がある場合があります。たとえば、生のシンクとして扱うことができない場合があります。

共有してくれてありがとう@ liamw9534 。 それを行うのに十分な構成を理解するのに、あるいは私ができることを知るのに、私はしばらく時間がかかりました。 これをDockerコンテナーに追加して、機能するかどうかを確認します。

ただし、FIFOを空にするものがない場合は、問題が発生する可能性があります。 netcatはカーネルバッファをいっぱいにしてから失敗するため。 また、FIFOを開く方法によっては、FIFOが書き込み可能であるためにリーダーの存在を要求する可能性があるため、問題が発生する可能性もあります:/

ただし、FifoStreamerコードを適応させてUDPデータを受け入れ、これを処理することもできます。これは、そこで発生する可能性のあるエラーケースのほとんどをすでに処理していることを願っています。

@adamcik動作するスクリプトがある場合は、それをdocker-ncmpcppの一部としてdocker-mopidyをUDPで

コマンドラインでいくつかの基本的な実験を行いましたが、接続タイムアウト( nc -kluw 1 127.0.0.1 5555 > /tmp/mopidy.fifoを使用すれば、すべて正常に機能します。 これにより、netcatは、最後の接続が切断された後(1秒のタイムアウト)、常に新しい送信元ポート接続をリッスンします。

上記のコマンドは、FIFOファイルからの読み取りの有無に関係なく機能し、FIFOファイルからの読み取りプロセスが停止してファイルを閉じた場合にも機能します。

@wernightは、このバグの説明を参照してください。これが私が持っているすべてのコードです。

ベルトとブレースの場合は、コマンドをwhileループに固定します(例: while :; do nc -kluw 1 127.0.0.1 5555> /tmp/mopidy.fifo; sleep 1; done終了した場合は、1秒遅れて再び起動します。

@ liamw9534そこにmpd.confがあります。 私はこれに混乱しています。 mopidy-mpdに加えてスタンドアロンのMPDサーバーを実行していますか?

@lrvickはい、私の間違いです。もちろん、〜/ .ncmpcpp / configに追加する必要のある構成について考えていました。

.config/mopidy/mopidy.conf

...

[audio]
output = tee name=t ! queue ! autoaudiosink t. ! queue ! udpsink port=5555
$ mkfifo /tmp/mopidy.fifo
$ while :; do nc -kluw 1 127.0.0.1 -p 5555> /tmp/mopidy.fifo; sleep 1; done

(ここに-p追加しました)。

~/.ncmpcpp/config

audio_output {
    type                    "fifo"
    name                    "my_fifo"
    path                    "/tmp/mopidy.fifo"
    format                  "44100:16:2"
}

wernight / docker-mopidyおよびwernight / docker-ncmpcppでも実行されます

ただし、Mopidyのログにoutput理解していることが示されていても、5555に接続できないようです。 netstatは、5555で開いているUDPも表示しません。 output行を完全には理解していません。 teeはbashコマンドであり、残りはMopidyのもののように見えます。

しかし、音楽を再生しているときにudp6 [::]:51307を見つけました。

outputは、Mopidyの一部としてplaybin2渡されるGstBin要素として解釈されます。内部では、これは単なるGstreamerパイプラインであり、特別なことは何もありません。 したがって、 teeは実際にはGstreamer要素です。 シェルコマンドteeとは何の関係もありません。

したがって、コマンドラインでMopidy内で何が起こっているかを概算して、次のようにすることができます。

gst-launch audiotestsrc ! tee name=t ! queue ! autoaudiosink t. ! queue ! udpsink port=5555 &

これにより、正弦波トーンの再生が開始されます。 次に、次のコマンドを実行します。

nc -kluw 1 127.0.0.1 5555

その後、ディスプレイに多くの奇妙な文字が表示されるようになります。これは、 ncからstdoutに出力されるテストオーディオストリームです。 これは、基礎となるアプローチが機能することを効果的に証明します。 同じ動作を再現できることを確認できますか?

次に、2番目のステップとしてFIFOを追加して、FIFOをstdoutにcatて、同じ奇妙な文字を表示できることを確認できます。

また、 ncmpcpp必要な構成形式を再確認します。 https://wiki.archlinux.org/index.php/Ncmpcpp#Enabling_visualizationを簡単に調べたところ、必要な構成形式が異なることがわかりました

visualizer_fifo_path = "/tmp/mpd.fifo"
visualizer_output_name = "my_fifo"
visualizer_sync_interval = "30" 
visualizer_in_stereo = "yes"
visualizer_type = "spectrum" (spectrum/wave)

私はncmpcpp使用しないので、問題はここにもある可能性があります...

$ apt-get install gstreamer-tools
$ gst-launch audiotestsrc ! tee name=t ! queue ! autoaudiosink t. ! queue ! udpsink port=5555 &
Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
New clock: GstPulseSinkClock
$ nc -kluw 1 127.0.0.1 -p 5555
no connection : Connection timed out

nc ... -pを使用すると、エラーが発生します)

でもトーンが鳴っているのは聞こえます。

どのディストリビューションを使用していますか? また、 nc -hすると、出力はどうなりますか?

$ nc -h
OpenBSD netcat (Debian patchlevel 1.89-4ubuntu1)
This is nc from the netcat-openbsd package. An alternative nc is available
in the netcat-traditional package.
usage: nc [-46DdhklnrStUuvzC] [-i interval] [-P proxy_username] [-p source_port]
      [-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_protocol]
      [-x proxy_address[:port]] [hostname] [port[s]]
    Command Summary:
        -4      Use IPv4
        -6      Use IPv6
        -D      Enable the debug socket option
        -d      Detach from stdin
        -h      This help text
        -i secs     Delay interval for lines sent, ports scanned
        -k      Keep inbound sockets open for multiple connects
        -l      Listen mode, for inbound connects
        -n      Suppress name/port resolutions
        -P proxyuser    Username for proxy authentication
        -p port     Specify local port for remote connects
        -q secs     quit after EOF on stdin and delay of secs
        -r      Randomize remote ports
        -S      Enable the TCP MD5 signature option
        -s addr     Local source address
        -T ToS      Set IP Type of Service
        -C      Send CRLF as line-ending
        -t      Answer TELNET negotiation
        -U      Use UNIX domain socket
        -u      UDP mode
        -Z      DCCP mode
        -v      Verbose
        -w secs     Timeout for connects and final net reads
        -X proto    Proxy protocol: "4", "5" (SOCKS) or "connect"
        -x addr[:port]  Specify proxy address and port
        -z      Zero-I/O mode [used for scanning]
    Port numbers can be individual or ranges: lo-hi [inclusive]

Ubuntuで使用しているncでは、 -pオプションは必要ありません。 マニュアルページは、 -lと組み合わせて-pを指定するとエラーになるはずであることも示しています。

     -l      Used to specify that nc should listen for an incoming connection
             rather than initiate a connection to a remote host.  It is an error
             to use this option in conjunction with the -p, -s, or -z options.
             Additionally, any timeouts specified with the -w option are ignored.

DebianWheezyを使用します

Dockerのインストールから始まるUbuntuの完全な手順は次のとおりです。

  1. Dockerをインストールします

$ wget -qO- https://get.docker.com/ | sh $ sudo gpasswd -a ${USER} docker

  1. リモートPulseAudioを有効にする
  2. Debianで実行:

$ docker run --rm -it \ -e PULSE_SERVER=tcp:$(hostname -i):4713 \ -e PULSE_COOKIE_DATA=$(pax11publish -d | grep --color=never -Po '(?<=^Cookie: ).*') \ debian:wheezy $ apt-get update && apt-get install -y netcat $ nc -h [v1.10-40] connect to somewhere: nc [-options] hostname port[s] [ports] ... listen for inbound: nc -l -p port [-options] [hostname] [port] options: -c shell commands as `-e'; use /bin/sh to exec [dangerous!!] -e filename program to exec after connect [dangerous!!] -b allow broadcasts -g gateway source-routing hop point[s], up to 8 -G num source-routing pointer: 4, 8, 12, ... -h this cruft -i secs delay interval for lines sent, ports scanned -k set keepalive option on socket -l listen mode, for inbound connects -n numeric-only IP addresses, no DNS -o file hex dump of traffic -p port local port number -r randomize local and remote ports -q secs quit after EOF on stdin and delay of secs -s addr local source address -T tos set Type Of Service -t answer TELNET negotiation -u UDP mode -v verbose [use twice to be more verbose] -w secs timeout for connects and final net reads -z zero-I/O mode [used for scanning] port numbers can be individual or ranges: lo-hi [inclusive]; hyphens in port names must be backslash escaped (e.g. 'ftp\-data'). $ nc -kluw 1 127.0.0.1 5555 UDP listen needs -p arg $ apt-get install -y net-tools gstreamer-tools gstreamer0.10-plugins-good $ echo -ne $(echo $PULSE_COOKIE_DATA | sed -e 's/../\\x&/g') >$HOME/pulse.cookie $ export PULSE_COOKIE=$HOME/pulse.cookie $ gst-launch audiotestsrc ! tee name=t ! queue ! autoaudiosink t. ! queue ! udpsink port=5555 & $ nc -kluw 1 127.0.0.1 -p 5555 no connection : Connection timed out

netcat-openbsdパッケージで試してみました。

$ nc -h
OpenBSD netcat (Debian patchlevel 1.105-7)
...

これで、 ncは、トーンが再生されている間は何も表示されません(これはやや良いようです)。

$ nc -kluw 1 127.0.0.1 5555
(nothing here)

OK、2つのターミナルを開き、最初のターミナルで実行します。

nc -kluw 1 127.0.0.1 5555

次に、2番目のターミナルで次のコマンドを実行します。

nc -u 127.0.0.1 5555

2番目の端末のstdinにいくつかの文字を入力し、Enterキーを押します。 stdoutの最初の端末に同じ文字が表示されますか?

はい、動作します。 Dockers間で動作するようになりました:

$ docker run --rm --name nc1 -it my-debian-with-nc nc -kluw 1 0.0.0.0 5555
Hello

$ docker run --rm --link nc1:nc1 -it my-debian-with-nc nc -u nc1 5555
Hello

したがって、これはncgst-launch何も表示しない理由を説明していません。 ただし、コンテナ間で機能するにhost=SOMETHING

あはは! host=0.0.0.0を設定すると、機能します。

ネットワーク経由でデータを送信する必要がありますか? ローカルマシン上のパケットのみが必要であると想定していました。 udpsink host=0.0.0.0 port=5555すると、ネットワーク上のあらゆる場所にパケットがブロードキャストされます。 おそらくあなたが望むものではありません...

パケットをローカルループバックに制限する代わりに、 host=127.0.0.1と言うことができるはずです。

したがって、実際の問題はデフォルトのルーティング構成にあると思います。 デフォルトでは、システムでは、発信パケットは別のインターフェイスに送られます。 gstreamer要素のバージョンが異なるか、IPルーティング設定が異なる可能性があります。

コンテナからは、0.0.0.0または場合によってはマシンのIPを使用する必要がありました。 単一のマシン/コンテナでもデフォルト設定が機能していませんでした。

しかし、はい、今はネットワークを使用する必要があります。ncmpcppとmopidyを別々のDockerコンテナーに保持することをお勧めします。つまり、これらは異なるネットワーク上にあります。 これは安全性や隔離などには本当に良いのですが、少し問題が発生します。

ncmpcppクライアントはMPDサーバーに接続して音楽ストリーミングを要求します。その後、ncmpcppのIPが認識され、UDPパケットがそのIPにブロードキャストされます。 ただし、現在、IPはMopidy構成でハードコーディングされています。

現在、解決策はありません。 私は解決策を考えています:

  • MopidyでFIFOを作成し、それをncmpcppと共有しますが、FIFOをクリアするものは何もないので、それは大きな問題です。 また、ファイルの共有はネットワークソケットほどクリーンではありません。
  • ローカルデーモンが接続を監視し、UDPトラフィックを検出されたクライアントIPに転送します。 ハック。
  • UDP SSHトンネルですが、それは複雑で、役に立たない暗号化を追加し、別のデーモンを追加します...悪いです!
  • コードを調べて、 udpsinkホストをデフォルトで最初のクライアントのIPに設定できるかどうか、または接続されているすべてのクライアントのIPにデフォルト設定できるかどうかを確認します
  • Dockerに--net=container:NAME_or_IDを介してホストを共有するように指示します。これにより、ユーザーが入力する別のパラメーターが追加されますが、これにより大幅に簡素化されます。

この循環依存の解決策があります。 それでも恐ろしいハックのように感じますが、最終的にはユーザーが使用するのに十分簡単なはずです。 特に私がエイリアンだったncコマンドを手伝ってくれたliamw9534に感謝します。

There is no output named "my_fifo"!を除いて、FIFOは機能しています。 名前はmdp.confの名前と一致する必要があるようです:

 audio_output {
        type            "fifo"
        name            "my_fifo"
        path            "/tmp/mpd.fifo"
        format           "44100:16:2"
}

このオーディオ出力をMopidyに追加する方法を知っている場合は、FIFOファイルを共有しようとすることがあります。 吐き気(単純なビジュアライザー-ony)にも同じ要件があるようです。

visualizer_output_nameこの

  • ncmpcppがビジュアライザーにデータを提供する出力を決定し、現在いくつかの問題があるため、ビジュアライゼーションとサウンドを同期できるようにするには、以下のパラメーターが必要です。
  • fifo出力。フォーマットパラメータは、モノラルビジュアライゼーションの場合は44100:16:1に、ステレオビジュアライゼーションの場合は44100:16:2に設定する必要があります。

「異なるネットワーク上で」とはどういう意味かわかりません。 ローカルマシンへのオーディオトラフィックを分離する場合は、 udpsink 127.0.0.1を使用する必要があります。 0.0.0.0を選択すると、デフォルトルートを使用してパケットが転送されます。これは、ネットワーク経由でUDPパケットを送信することを意味する可能性があります。一般に、ネットワークトラフィックが消費するため、これは悪い考えです。多くの帯域幅、つまり2 x 16 x 44100 = 1.41Mbps。

理論的には、 udpsinkが使用するネットワークインターフェイスに関係なく、 nc0.0.0.0構成できるはずです。 これは、すべてのネットワークインターフェイスでリッスンします。 異なるネットワークインターフェイス上の他のサービスに同じIPポート番号を使用しない限り、これで問題ありません。

私は最後の提案を使用して、両方を同じネットワークに配置しました。 これらのネットワークはとにかくローカルであり、それは単なる論理的な分離です。 これはFIFOを構築するために機能しますが、ncmpcppはそれを必要としません(上記の2の前の応答を参照)。

そのチャンネル名について何か考えはありますか? または、 mpd.confようなFIFOへの別の方法がある場合はどうなりますか? なしではまったく機能しないようです。

mpd.confはMPDデーモンの設定にのみ使用されていると思いました。 この場合、mopidyはMPDデーモンであり、DockerがFIFOファイルを作成しているため、これは冗長である必要があります。 その場合、必要なのは.ncmpcpp/configがクライアントと一致していることを確認することだけですよね?

すこし。 正確に何をしているのかわかりません。 ただし、ご覧のとおり、 visualizer_output_name = "my_fifo" audio_output { name "my_fifo" }一致する必要があります。 現在、ncmpcppはThere is no output named "my_fifo"ます。 visualizer_output_name説明は、上記の5つの投稿です。 同期するために、実際には何らかの方法で出力に直接接続しているように見えます。

私はこれを使用していませんが、 visualizer_output_nameはMPD(プログラムではなくプロトコル)出力の1つ(つまり、 mpc outputs何か)と一致する必要があるように見えます。 Mopidyは現在、構成可能な出力を許可しておらず、MPD出力は「ミュート」の1つだけです。

可能であれば、 visualizer_output_name設定を解除することをお勧めします。

設定しないでみました。 まだビジュアライザーは表示されません。 udpsinkの出力形式について疑問に思います:ビジュアライザーが機能するには44100:16:2である必要があります( ncmpcppまたはnausea )。

念のためにMute試してみましたが、非常に面白い体験ができました。エラーは表示されず、ビジュアライザーも表示されずに、サウンドがミュートされました。 または、より正確には、 Mute出力を無効にしました。

ビジュアライザーのFFT機能はどこで実行されるのでしょうか。
FIFOの出力で実行されますか、それともFIFOへの入力で実行されますか? 君
MPDクライアントコードをチェックして、FIFOデータをどのように処理するかを確認する必要があります。

通常は巨大なファイルを作成する場合でも、テストのためだけにどちらかをサポートする方法はありますか?

どちらもサポートする必要はありません。 FFTがどこにあるかを知る必要があります
行われることになってから、正しいアプローチを選択します。 FFTが
ビジュアライザーで行われると、それは努力の完全な無駄になります
もう一度実装してください。

15時09分に2015年5月13日、ヴェルナーBerouxの[email protected]書きました:

たとえそれがあったとしても、テストのためだけに、どちらかをサポートする方法はありますか?
通常、巨大なファイルを作成します。


このメールに直接返信するか、GitHubで表示してください
https://github.com/mopidy/mopidy/issues/775#issuecomment-101676033

FFTはビジュアライザーによって実行され、そのためにはFIFO内の特定のオーディオ形式が必要です。 参照: http

良い-それならそれが機能しない理由はありません! あなたはしましたか
標準のMPDデーモンを実行しているシステムと
ローカルncmpcppクライアント? 両方でFIFOファイル名の名前を変更するとどうなりますか
構成ファイル? それでも機能しますか? かどうかを確認しようとしています
ハードコードされたパスがどこかに存在します...

午後03時57分に2015年5月13日、ヴェルナーBerouxの[email protected]書きました:

FFTはビジュアライザーによって実行され、特定のオーディオ形式が必要です
そのために動作するFIFOで。 参照: http


このメールに直接返信するか、GitHubで表示してください
https://github.com/mopidy/mopidy/issues/775#issuecomment-101702624

私のコメントはncmpcppソースに基づいてい

Mopidyのミュート出力はデフォルトで無効になっています。つまり、オーディオはミュートされていません。 ncmpcppビジュアライザーは、指定された出力を取得し、無効にして(効果なし)、有効にして、オーディオをミュートします。 おそらく彼らはそれを2回切り替える必要があります。

オーディオの形式が間違っている可能性があります。 上記のコードで@adamcikが持っていたのとは異なり、gstreamerパイプラインには正しいことを確認するものが何もありません。

フォーマットがどのように問題になるかわかりにくい.... 16ビット署名
整数。 起こりうる最悪の事態は、L / Rチャネルを交換することですか?

2015年5月13日16:33、NickSteelの[email protected]は次のように書いています。

私のコメントはncmpcppソースに基づいていました
http://git.musicpd.org/cgit/mirror/ncmpcpp.git/tree/src/visualizer.cpp。

Mopidyのミュート出力はデフォルトで無効になっています。つまり、オーディオはミュートされていません。
ncmpcppビジュアライザーは、指定された出力を取得し、無効にします(
効果)そしてそれを有効にして、オーディオをミュートします。 間違いなく彼らはすべきです
2回切り替えるだけです。

オーディオの形式が間違っている可能性があります。 あなたが持っている
@adamcikとは異なり、gstreamerパイプラインには正しいことを確認するものは何もありません
https://github.com/adamcikは上記の彼のコードにありました。


このメールに直接返信するか、GitHubで表示してください
https://github.com/mopidy/mopidy/issues/775#issuecomment-101716947

また、バイトの順序が間違っていたとしても、FFTを期待するだけかもしれません。
間違った周波数応答を生成するための出力......しかし、あなたはまだ見るでしょう
なにか。

2015年5月13日16:37、Liam [email protected]次のように書いています。

フォーマットがどのように問題になるかわかりにくい.... 16ビット署名
整数。 起こりうる最悪の事態は、L / Rチャネルを交換することですか?

2015年5月13日16:33、NickSteelの[email protected]は次のように書いています。

私のコメントはncmpcppソースに基づいていました
http://git.musicpd.org/cgit/mirror/ncmpcpp.git/tree/src/visualizer.cpp。

Mopidyのミュート出力はデフォルトで無効になっています。つまり、オーディオはミュートされていません。
ncmpcppビジュアライザーは、指定された出力を取得し、無効にします(
効果)そしてそれを有効にして、オーディオをミュートします。 間違いなく彼らはすべきです
2回切り替えるだけです。

オーディオの形式が間違っている可能性があります。 あなたが持っている
gstreamerパイプラインには、これとは異なり、正しいことを確認するものは何もありません。
@adamcikhttps ://github.com/adamcikは上記のコードに含まれていました。


このメールに直接返信するか、GitHubで表示してください
https://github.com/mopidy/mopidy/issues/775#issuecomment-101716947

そうですね、おそらくそれは、Mopidyのミュート出力を有効のままにしておくと、udpsinkがデータを送信しないことを意味するためです。

cat /tmp/mdp.fifo (上記のようにUDPから作成)は、データの一定のストリームを正しく表示します。

ビジュアライザーのncmpcppコードを見ました:

  1. ファイルO_RDONLY | O_NONBLOCKとして開きます
  2. 上から読み取ります; 私のmopidy設定でステレオに設定されているとすると、44100:16:2になります。

(Dockerをインストールした後)誰でも私のブランチから試すことができます:

git clone https://github.com/wernight/docker-mopidy.git
cd docker-mopidy
git checkout udpsink
docker build -t mopidy .
cd ..

git clone https://github.com/wernight/docker-ncmpcpp.git
cd docker-ncmpcpp
git checkout udpsink
docker build -t ncmpcpp .
cd ..

# Remember to enable PulseAudio over network 

docker run --name mopidy -d \
      -e PULSE_SERVER=tcp:$(hostname -i):4713 \
      -e PULSE_COOKIE_DATA=$(pax11publish -d | grep --color=never -Po '(?<=^Cookie: ).*') \
      mopidy
docker run --rm -it --link mopidy:mopidy ncmpcpp --host mopidy

-kが機能しなかったため、netcatのラングリングにかなりの時間を費やす必要がありましたが、曲のスイッチで自動再起動するために思いついたのは次のとおりです。

while :; do yes $'\n' | nc -lu 127.0.0.1 5555 > /tmp/mopidy.fifo; done

基本的に上記の他のオプション。

@ S0lll0s @wernight netcat -kも私には機能せず、曲の変更後に再起動する必要がありました。 あなたの解決策は機能しますが、私はsocatがよりうまく機能することを発見しました:

while :; do socat -d -d -T 1 -u UDP4-LISTEN:5555 OPEN:/tmp/mopidy.fifo; done

Arch Linuxユーザーの場合:

-kサポート付きのncを取得するには、 openbsd-netcatパッケージをインストールする必要がありますが、それも機能しなかったため、 @ SjRNMzUのスクリプトを使用してみてください。それを実行するためのsocatパッケージ。

@johnhamelink (コメントからArchを実行していると思います) socatソリューションを使用して曲を一時停止した後、ビジュアライザーが「追いつく」ことに問題がありましたか?

@ theos-space自分で気づいたとは言えません

Archを使用していますが、 ncgnuopenbsd両方)またはsocatいずれかで動作させることができませんgst-launch-1.0 ... udpsink port=5555からnc -kluw 1 127.0.0.1 5555で読み取ることができません。これは、画面に何も出力されないためです。

これがdebianバスター(4.11.6-1)、mopidy 2.1.0-1、gstreamer1.0-tools 1.12.2-1、ncmpcpp 0.7.4-1 + b3、socat1.7.3.2-1で機能することを確認できます。

システムの起動時にsocatを起動します。

open_mpd_fifo() {
    local fifo
    readonly fifo='/tmp/mpd.fifo'

    mkfifo "$fifo"
    while :; do socat -d -d -T 1 -u UDP4-LISTEN:5555 OPEN:"$fifo"; done
}

mopidy [audio] conf(udpsinkに対してホストを定義する必要があることに注意してください):

[audio]
output = tee name=t ! queue ! autoaudiosink t. ! queue ! udpsink host=127.0.0.1 port=5555

Archのranisaltは、fifoサポートを使用してncmpcppをコンパイルする必要があります。https://bbs.archlinux.org/viewtopic.php?id = 99915を確認してください。

残りのスレッド+ドキュメント+マンページ+さまざまなブログを読んだ後の、私の作業中のArchセットアップは次のとおりです。 Mopidyをシステムサービスとして実行し、TCP経由でユーザーサービスPulseAudioにオーディオを送信しています。 経験の浅い人に役立つと思われる追加の注釈をいくつか含めました。

パッケージ

これらはすべて、公式のArchリポジトリからのものです。

gstreamer 1.12.3-1
mopidy 2.1.0
ncmpcpp 0.8.1  # this had fifo support without any special compiling for me
openbsd-netcat 1.178_3-1  # gnu-netcat lacks the -k flag, as discussed above
pulseaudio 11.1

設定

mopidyシステムサービスを有効にします。

sudo systemctl enable mopidy.service

編集を容易にするために、mopidyのシステム構成をユーザー構成へのシンボリックリンクに置き換えます(オプション)。

sudo ln -sf ~/.config/mopidy/mopidy.conf /etc/mopidy/mopidy.conf

fifoファイルを作成します。

mkfifo "/tmp/mpd.fifo"

構成

~/.config/mopidy/mopidy.conf (またはシンボリックリンクを作成しなかった場合は/etc/mopidy/mopidy.conf ):ローカルホストでリッスンしているpulseaudioサーバーとローカルホストのUDPシンクにオーディオを送信するようにmopidyに指示します:5555

[audio]
output = tee name=t ! queue ! pulsesink server=127.0.0.1 t. ! queue ! udpsink host=127.0.0.1 port=5555

~/.ncmpcpp/config :リッスンする必要のあるfifoファイルの場所やその他の設定をncmpcppに指示します

visualizer_fifo_path = "/tmp/mpd.fifo"
visualizer_output_name = "my_fifo"
visualizer_sync_interval = "30"
visualizer_in_stereo = "yes"
visualizer_type = "spectrum"
visualizer_look = "+|"

in ~/.config/pulse/default.pa :ローカルホストからTCP経由でオーディオを受け入れるようにpulseaudioに指示します(設定はすでにそこにあり、コメントを外すことができます)

load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1

in ~/.zshrc~/.bashrcでも機能するはずです): ncmpcpp netcat開始と停止を処理するラッパー関数 "nplayer"を作成します:

nplayer () (nc -kluw 1 127.0.0.1 5555 > /tmp/mpd.fifo & trap "kill $!" EXIT; ncmpcpp)

これは何をしますか:

  • 内容全体をラップするサブシェルを使用して関数を定義します
  • バックグラウンドでnetcatプロセスを開始して、UDPシンクに送信されたオーディオデータをリッスンし、前に作成したFIFOにリダイレクトします。 フラグ:

    • -kは、現在の接続が完了した後もリッスンし続けます

    • -lリスニングモードを有効にする

    • -u UDPモードを有効にする

    • -w NUM NUM秒(この場合は1秒)後にアイドル接続をタイムアウトします

  • 殺すためにEXITトラップ設定netcatプロセスをncmpcppプロセスの終了をして終了する機能のサブシェルを引き起こし
  • フォアグラウンドでncmpcppプロセスを開始します

Manjaro(arch distro)でmopidyを実行しています。 socatまたはnetcatを介して出力を取得するのに問題がありました。 しかし、tcpdumpで入ってくるパケットを観察することができました:
sudo tcpdump -i lo -n udp port 5555 -XX

長い時間がかかり、 @ mosbasikがなけれでした
問題は、udpsinkの後にhost=127.0.0.1がないこと

[audio]
output = tee name=t ! queue ! autoaudiosink server=127.0.0.1 t. ! queue ! udpsink host=127.0.0.1 port=5555↪

また

[audio]
output = tee name=t ! queue ! autoaudiosink  t. ! queue ! udpsink host=127.0.0.1 port=5555↪

ちなみに、 pulsesinkを機能させることができなかったので、 autoaudiosinkままにしておく必要がありました。これは、以前にも設定したものです。 ただし、ビジュアライザーは何らかの理由で本当に遅いようです。それがautoaudiosinkせいであるかどうかはわかりませんが再起動後は完全に機能します。 pulselinkを使用すると、gstreamerプラグインについて不平を言い続けました。 公式のArchリポジトリにgstのすべてのプラグインパッケージをインストールした後でも(私は推測します)。 flump3decmad注意してください


mopidy deps出力

Executable: /usr/bin/mopidy
Platform: Linux-4.16.7-1-MANJARO-x86_64-with-glibc2.2.5
Python: CPython 2.7.15 from /usr/lib/python2.7
Mopidy: 2.2.1 from /usr/lib/python2.7/site-packages
  Pykka>=1.1: 1.2.1 from /usr/lib/python2.7/site-packages
  requests>=2.0: 2.20.1 from /usr/lib/python2.7/site-packages
    chardet>=3.0.2: 3.0.4 from /usr/lib/python2.7/site-packages
    idna>=2.5: 2.7 from /usr/lib/python2.7/site-packages
    urllib3>=1.21.1: 1.24.1 from /usr/lib/python2.7/site-packages
  setuptools: 40.5.0 from /usr/lib/python2.7/site-packages
  tornado>=4.4: 5.1.1 from /usr/lib/python2.7/site-packages
    futures: 3.2.0 from /usr/lib/python2.7/site-packages
    singledispatch: 3.4.0.3 from /usr/lib/python2.7/site-packages
      six: 1.11.0 from /usr/lib/python2.7/site-packages
    backports_abc>=0.4: 0.5 from /usr/lib/python2.7/site-packages
Mopidy-Iris: 3.4.9 from /usr/lib/python2.7/site-packages
  setuptools>=3.3: 40.5.0 from /usr/lib/python2.7/site-packages
  pylast>=1.6.0: 2.3.0 from /usr/lib/python2.7/site-packages
    six: 1.11.0 from /usr/lib/python2.7/site-packages
  Mopidy>=2.0: 2.2.1 from /usr/lib/python2.7/site-packages
    Pykka>=1.1: 1.2.1 from /usr/lib/python2.7/site-packages
    requests>=2.0: 2.20.1 from /usr/lib/python2.7/site-packages
      chardet>=3.0.2: 3.0.4 from /usr/lib/python2.7/site-packages
      idna>=2.5: 2.7 from /usr/lib/python2.7/site-packages
      urllib3>=1.21.1: 1.24.1 from /usr/lib/python2.7/site-packages
    setuptools: 40.5.0 from /usr/lib/python2.7/site-packages
    tornado>=4.4: 5.1.1 from /usr/lib/python2.7/site-packages
      futures: 3.2.0 from /usr/lib/python2.7/site-packages
      singledispatch: 3.4.0.3 from /usr/lib/python2.7/site-packages
        six: 1.11.0 from /usr/lib/python2.7/site-packages
      backports_abc>=0.4: 0.5 from /usr/lib/python2.7/site-packages
  Mopidy-Local-Images>=1.0: 1.0.0 from /usr/lib/python2.7/site-packages
    setuptools: 40.5.0 from /usr/lib/python2.7/site-packages
    Mopidy>=1.1: 2.2.1 from /usr/lib/python2.7/site-packages
      Pykka>=1.1: 1.2.1 from /usr/lib/python2.7/site-packages
      requests>=2.0: 2.20.1 from /usr/lib/python2.7/site-packages
        chardet>=3.0.2: 3.0.4 from /usr/lib/python2.7/site-packages
        idna>=2.5: 2.7 from /usr/lib/python2.7/site-packages
        urllib3>=1.21.1: 1.24.1 from /usr/lib/python2.7/site-packages
      setuptools: 40.5.0 from /usr/lib/python2.7/site-packages
      tornado>=4.4: 5.1.1 from /usr/lib/python2.7/site-packages
        futures: 3.2.0 from /usr/lib/python2.7/site-packages
        singledispatch: 3.4.0.3 from /usr/lib/python2.7/site-packages
          six: 1.11.0 from /usr/lib/python2.7/site-packages
        backports_abc>=0.4: 0.5 from /usr/lib/python2.7/site-packages
    Pykka>=1.1: 1.2.1 from /usr/lib/python2.7/site-packages
    uritools>=1.0: 1.0.1 from /usr/lib/python2.7/site-packages
      ipaddress>=1.0.6: 1.0.22 from /usr/lib/python2.7/site-packages
      ipaddress>=1.0.6: 1.0.22 from /usr/lib/python2.7/site-packages
  ConfigObj>=5.0.6: 5.0.6 from /usr/lib/python2.7/site-packages
  raven>=6.1.0: 6.9.0 from /usr/lib/python2.7/site-packages
    contextlib2: 0.5.5 from /usr/lib/python2.7/site-packages
Mopidy-Local-Images: 1.0.0 from /usr/lib/python2.7/site-packages
  setuptools: 40.5.0 from /usr/lib/python2.7/site-packages
  Mopidy>=1.1: 2.2.1 from /usr/lib/python2.7/site-packages
    Pykka>=1.1: 1.2.1 from /usr/lib/python2.7/site-packages
    requests>=2.0: 2.20.1 from /usr/lib/python2.7/site-packages
      chardet>=3.0.2: 3.0.4 from /usr/lib/python2.7/site-packages
      idna>=2.5: 2.7 from /usr/lib/python2.7/site-packages
      urllib3>=1.21.1: 1.24.1 from /usr/lib/python2.7/site-packages
    setuptools: 40.5.0 from /usr/lib/python2.7/site-packages
    tornado>=4.4: 5.1.1 from /usr/lib/python2.7/site-packages
      futures: 3.2.0 from /usr/lib/python2.7/site-packages
      singledispatch: 3.4.0.3 from /usr/lib/python2.7/site-packages
        six: 1.11.0 from /usr/lib/python2.7/site-packages
      backports_abc>=0.4: 0.5 from /usr/lib/python2.7/site-packages
  Pykka>=1.1: 1.2.1 from /usr/lib/python2.7/site-packages
  uritools>=1.0: 1.0.1 from /usr/lib/python2.7/site-packages
    ipaddress>=1.0.6: 1.0.22 from /usr/lib/python2.7/site-packages
    ipaddress>=1.0.6: 1.0.22 from /usr/lib/python2.7/site-packages
Mopidy-Spotify-Tunigo: 1.0.0 from /usr/lib/python2.7/site-packages
  Mopidy>=0.19.0: 2.2.1 from /usr/lib/python2.7/site-packages
    Pykka>=1.1: 1.2.1 from /usr/lib/python2.7/site-packages
    requests>=2.0: 2.20.1 from /usr/lib/python2.7/site-packages
      chardet>=3.0.2: 3.0.4 from /usr/lib/python2.7/site-packages
      idna>=2.5: 2.7 from /usr/lib/python2.7/site-packages
      urllib3>=1.21.1: 1.24.1 from /usr/lib/python2.7/site-packages
    setuptools: 40.5.0 from /usr/lib/python2.7/site-packages
    tornado>=4.4: 5.1.1 from /usr/lib/python2.7/site-packages
      futures: 3.2.0 from /usr/lib/python2.7/site-packages
      singledispatch: 3.4.0.3 from /usr/lib/python2.7/site-packages
        six: 1.11.0 from /usr/lib/python2.7/site-packages
      backports_abc>=0.4: 0.5 from /usr/lib/python2.7/site-packages
  Mopidy-Spotify>=1.2.0: 3.1.0 from /usr/lib/python2.7/site-packages
    Mopidy>=2.0: 2.2.1 from /usr/lib/python2.7/site-packages
      Pykka>=1.1: 1.2.1 from /usr/lib/python2.7/site-packages
      requests>=2.0: 2.20.1 from /usr/lib/python2.7/site-packages
        chardet>=3.0.2: 3.0.4 from /usr/lib/python2.7/site-packages
        idna>=2.5: 2.7 from /usr/lib/python2.7/site-packages
        urllib3>=1.21.1: 1.24.1 from /usr/lib/python2.7/site-packages
      setuptools: 40.5.0 from /usr/lib/python2.7/site-packages
      tornado>=4.4: 5.1.1 from /usr/lib/python2.7/site-packages
        futures: 3.2.0 from /usr/lib/python2.7/site-packages
        singledispatch: 3.4.0.3 from /usr/lib/python2.7/site-packages
          six: 1.11.0 from /usr/lib/python2.7/site-packages
        backports_abc>=0.4: 0.5 from /usr/lib/python2.7/site-packages
    Pykka>=1.1: 1.2.1 from /usr/lib/python2.7/site-packages
    pyspotify>=2.0.5: 2.0.5 from /usr/lib/python2.7/site-packages
      cffi>=1.0.0: 1.11.5 from /usr/lib/python2.7/site-packages
        pycparser: 2.19 from /usr/lib/python2.7/site-packages
    requests>=2.0: 2.20.1 from /usr/lib/python2.7/site-packages
      chardet>=3.0.2: 3.0.4 from /usr/lib/python2.7/site-packages
      idna>=2.5: 2.7 from /usr/lib/python2.7/site-packages
      urllib3>=1.21.1: 1.24.1 from /usr/lib/python2.7/site-packages
    setuptools: 40.5.0 from /usr/lib/python2.7/site-packages
  Pykka>=1.1: 1.2.1 from /usr/lib/python2.7/site-packages
  setuptools: 40.5.0 from /usr/lib/python2.7/site-packages
  tunigo>=1.0.0: 1.0.0 from /usr/lib/python2.7/site-packages
    requests>=2.0.0: 2.20.1 from /usr/lib/python2.7/site-packages
      chardet>=3.0.2: 3.0.4 from /usr/lib/python2.7/site-packages
      idna>=2.5: 2.7 from /usr/lib/python2.7/site-packages
      urllib3>=1.21.1: 1.24.1 from /usr/lib/python2.7/site-packages
    setuptools: 40.5.0 from /usr/lib/python2.7/site-packages
Mopidy-SoundCloud: 2.1.0 from /usr/lib/python2.7/site-packages
  setuptools: 40.5.0 from /usr/lib/python2.7/site-packages
  Mopidy>=1.0: 2.2.1 from /usr/lib/python2.7/site-packages
    Pykka>=1.1: 1.2.1 from /usr/lib/python2.7/site-packages
    requests>=2.0: 2.20.1 from /usr/lib/python2.7/site-packages
      chardet>=3.0.2: 3.0.4 from /usr/lib/python2.7/site-packages
      idna>=2.5: 2.7 from /usr/lib/python2.7/site-packages
      urllib3>=1.21.1: 1.24.1 from /usr/lib/python2.7/site-packages
    setuptools: 40.5.0 from /usr/lib/python2.7/site-packages
    tornado>=4.4: 5.1.1 from /usr/lib/python2.7/site-packages
      futures: 3.2.0 from /usr/lib/python2.7/site-packages
      singledispatch: 3.4.0.3 from /usr/lib/python2.7/site-packages
        six: 1.11.0 from /usr/lib/python2.7/site-packages
      backports_abc>=0.4: 0.5 from /usr/lib/python2.7/site-packages
  Pykka>=1.1: 1.2.1 from /usr/lib/python2.7/site-packages
  requests>=2.0.0: 2.20.1 from /usr/lib/python2.7/site-packages
    chardet>=3.0.2: 3.0.4 from /usr/lib/python2.7/site-packages
    idna>=2.5: 2.7 from /usr/lib/python2.7/site-packages
    urllib3>=1.21.1: 1.24.1 from /usr/lib/python2.7/site-packages
Mopidy-Spotify: 3.1.0 from /usr/lib/python2.7/site-packages
  Mopidy>=2.0: 2.2.1 from /usr/lib/python2.7/site-packages
    Pykka>=1.1: 1.2.1 from /usr/lib/python2.7/site-packages
    requests>=2.0: 2.20.1 from /usr/lib/python2.7/site-packages
      chardet>=3.0.2: 3.0.4 from /usr/lib/python2.7/site-packages
      idna>=2.5: 2.7 from /usr/lib/python2.7/site-packages
      urllib3>=1.21.1: 1.24.1 from /usr/lib/python2.7/site-packages
    setuptools: 40.5.0 from /usr/lib/python2.7/site-packages
    tornado>=4.4: 5.1.1 from /usr/lib/python2.7/site-packages
      futures: 3.2.0 from /usr/lib/python2.7/site-packages
      singledispatch: 3.4.0.3 from /usr/lib/python2.7/site-packages
        six: 1.11.0 from /usr/lib/python2.7/site-packages
      backports_abc>=0.4: 0.5 from /usr/lib/python2.7/site-packages
  Pykka>=1.1: 1.2.1 from /usr/lib/python2.7/site-packages
  pyspotify>=2.0.5: 2.0.5 from /usr/lib/python2.7/site-packages
    cffi>=1.0.0: 1.11.5 from /usr/lib/python2.7/site-packages
      pycparser: 2.19 from /usr/lib/python2.7/site-packages
  requests>=2.0: 2.20.1 from /usr/lib/python2.7/site-packages
    chardet>=3.0.2: 3.0.4 from /usr/lib/python2.7/site-packages
    idna>=2.5: 2.7 from /usr/lib/python2.7/site-packages
    urllib3>=1.21.1: 1.24.1 from /usr/lib/python2.7/site-packages
  setuptools: 40.5.0 from /usr/lib/python2.7/site-packages
GStreamer: 1.14.4.0 from /usr/lib/python2.7/site-packages/gi
  Detailed information: 
    Python wrapper: python-gi 3.30.2
    Relevant elements:
      Found:
        uridecodebin
        souphttpsrc
        appsrc
        alsasink
        osssink
        oss4sink
        pulsesink
        id3demux
        id3v2mux
        lamemp3enc
        mpegaudioparse
        mpg123audiodec
        vorbisdec
        vorbisenc
        vorbisparse
        oggdemux
        oggmux
        oggparse
        flacdec
        flacparse
        shout2send
      Not found:
        flump3dec
        mad

udpsinkをMopidyおよびすべてのリモートncmpcppクライアントで動作させようとすると問題が発生します。 Mopidyは、Docker環境でMacVLANを使用してセットアップされます。 コンテナのポートが正常に表示されます。

nc -vz -u mopidy.lan 5555
found 0 associations
found 1 connections:
     1: flags=82<CONNECTED,PREFERRED>
    outif (null)
    src x.x.x.x port 50630
    dst x.x.x.x port 5555
    rank info not available

Connection to mopidy.lan port 5555 [udp/personal-agent] succeeded!

現在、Mopidyは次の設定ビットを使用しています。

[audio]
mixer = software
mixer_volume = 100
output = tee name=t ! queue ! lamemp3enc ! shout2send async=false mount=mopidy ip="mopidy.lan" port=8092 username="some username" password="some password" t. ! queue ! udpsink host=0.0.0.0 port=5555

netcatを使用して生データをmpd.fifoに正常に取り込む方法について何か考えはありますか? 私はnetcatを間違った方法で使用しているため、以下を使用しても機能しないと思います。 いくつかの研究は答えを提供していません、それでうまくいけば誰かが私を正しい方向に向けることができます。

#!/bin/bash

mkfifo /tmp/mpd.fifo
while :; do yes $'\n' | nc -lu mopidy 5555 > /tmp/mpd.fifo; done

次のエラーが発生します。

nc: Can't assign requested address

これを機能させる方法について何か考えはありますか?

乾杯!

参考までに、gstreamerのudpsinkのサポートをncmpcppに追加したので、fifoハックなしで直接使用できるようになりました。

詳細については、 https://github.com/ncmpcpp/ncmpcpp/commit/fb886f687014e22b2fe1477da855be5201063ea8を参照してください。

ティーザーの下。 これは、mopidy + mopidy-spotify + mopidy-mpd + ncmpcppです。

https://user-images.githubusercontent.com/387658/102549720-e41bf980-40bc-11eb-8127-70889011e52f.mp4

@arybczak素晴らしい! これをhttps://discourse.mopidy.com/c/show-and-tell/9に投稿する必要があり

@adamcikこれは、このほぼ7

@pspeder 、正確にはどういう意味ですか? https://github.com/mopidy/mopidy/issues/775#issuecomment -747725806の使用に問題があり

@kingosticksは単にこの問題を解決することを提案していました🙂

私はそれに同意します。

このページは役に立ちましたか?
0 / 5 - 0 評価