Mopidy: Pertimbangkan untuk menambahkan wastafel fifo gstreamer

Dibuat pada 8 Jul 2014  ·  73Komentar  ·  Sumber: mopidy/mopidy

Ini terus muncul karena orang-orang sepertinya sangat menyukai visualisator ncmpcpp

Trik untuk membuat wastafel FIFO yang andal ada dua. Anda perlu menggunakan penulisan non-blocking, yang berarti membuka soket tulis akan gagal kecuali ada pembaca, maka Anda memerlukan pembaca juga. Kedua, jika buffer terisi karena pembaca eksternal tertinggal atau tidak ada sama sekali, pembaca internal Anda perlu mengosongkan buffer.

Kode berikut menangkap inti dasar dari ini, tetapi masih membutuhkan lebih banyak pekerjaan sehubungan dengan penanganan kesalahan.

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 

Kode di atas sekarang perlu diintegrasikan dengan GStreamer. Dengan asumsi 0,10 ini sebenarnya sangat bisa dilakukan, alasan saya ragu adalah bahwa kami merencanakan pindah ke 1.x dan pengikatan gir tidak cocok untuk membuat elemen dengan python. Dalam kasus kode ini di 1.x masalahnya bermuara pada tidak dapat membuat template pad yang BaseSink harapkan untuk ditemukan. Membuat ini sebagai elemen biasa mungkin bisa dilakukan, tetapi Anda perlu menerapkan kembali cara untuk menangani sebagian besar BaseSink untuk memastikan Anda melakukannya dengan benar.

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) 

Perhatikan bahwa satu masalah yang saya hadapi dalam pengujian ini sebenarnya lupa untuk mencocokkan format audio yang diharapkan oleh ncmpcpp, jadi pastikan mono/stereo memang cocok.

C-enhancement A-audio

Komentar yang paling membantu

FYI Saya menambahkan dukungan untuk udpsink gstreamer ke ncmpcpp jadi sekarang dapat digunakan secara langsung tanpa peretasan fifo.

Lihat https://github.com/ncmpcpp/ncmpcpp/commit/fb886f687014e22b2fe1477da855be5201063ea8 untuk detail lebih lanjut.

Di bawah teaser. Ini adalah mopidy + mopidy-spotify + mopidy-mpd + ncmpcpp.

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

Semua 73 komentar

Kemana perginya ini? apakah ini akan ditambahkan ke paket utama?

Ini tidak sedang dikerjakan karena kami perlu mengonversinya ke GStreamer 1.0, dan semua eksperimen saya dengan itu sejauh ini telah menemukan masalah saat melakukan elemen khusus dengan python. Ada cara lain untuk mungkin menyelesaikan semuanya, tetapi bukan sesuatu yang saya punya waktu untuk dikerjakan.

Saya ingin melihat dukungan FIFO ditambahkan :)

Saya baru saja menemukan ini mencari cara untuk membuat visualisator musik ncmpcpp bekerja dengan mopidy. Saya mendukung.

Ya, itulah alasan yang sama mengapa saya menemukan ini. Akan sangat bagus untuk
dapat memvisualisasikan musik yang dialirkan,

06-11-2014 2:19 GMT-05:00 Blake [email protected] :

Saya baru saja menemukan ini mencari cara untuk mendapatkan visualisator musik ncmpcpp ke
bekerja dengan mopidy. Saya mendukung.


Balas email ini secara langsung atau lihat di GitHub
https://github.com/mopidy/mopidy/issues/775#issuecomment -61936376.

Ada plugin visualisasi gstreamer, tidak bisakah Anda menggunakannya saja?
Pada 6 Nov 2014 08:35, "Diego Berrocal" [email protected] menulis:

Ya, itulah alasan yang sama mengapa saya menemukan ini. Akan sangat bagus untuk
dapat memvisualisasikan musik yang dialirkan,

06-11-2014 2:19 GMT-05:00 Blake [email protected] :

Saya baru saja menemukan ini mencari cara untuk mendapatkan visualisator musik ncmpcpp
ke
bekerja dengan mopidy. Saya mendukung.


Balas email ini secara langsung atau lihat di GitHub
https://github.com/mopidy/mopidy/issues/775#issuecomment -61936376.


Balas email ini secara langsung atau lihat di GitHub
https://github.com/mopidy/mopidy/issues/775#issuecomment -62007426.

Perhatikan bahwa itu sedang dalam perjalanan keluar di rilis berikutnya.

Apakah ada seseorang yang mengerjakan ini? Akan sangat menyenangkan untuk dapat menggunakan visualisator ncmpcpp dengan mopidy.

Bukannya saya tahu, dan kami mungkin tidak ingin melakukan ini sebagai elemen GStreamer karena akan memblokir migrasi kami ke GStreamer 1.x.

Ini IMO juga diblokir untuk menambahkan kembali dukungan yang tepat untuk output.

Hanya menambahkan bahwa saya juga menemukan masalah ini ketika mencoba menambahkan dukungan visualizer ke Mopidy/ncmpcpp. Akan senang untuk memiliki ini di masa depan bahkan jika itu tidak sedang dikerjakan saat ini. Saya juga ingin menyampaikan rasa hormat saya yang setinggi-tingginya kepada mereka yang menyumbangkan waktu mereka untuk proyek-proyek open source. :senyum:

Idealnya ini akan bekerja dari jarak jauh. Kekuatan Mopidy benar-benar terletak pada menjadi solusi yang bisa ada di cloud pribadi Anda.

Secara umum, FIFO bukanlah metode komunikasi antarproses yang sangat portabel dan harus dihindari IMO. Mereka juga memiliki beberapa efek samping yang buruk, yang telah disebutkan di utas ini. Saya pikir Anda lebih baik membuang paket Anda menggunakan wastafel UDP secara pribadi .... itu solusi yang lebih umum dan dapat dengan mudah disesuaikan dengan sesuatu yang menulis ke FIFO (jika perlu) di luar Mopidy .... itu tunggal baris skrip shell untuk membaca data dari port UDP (menggunakan netcat) dan menulisnya ke FIFO.

Boleh juga. Mungkin klien berbohong ncmpcpp juga akan mengizinkan menggunakannya sebagai input.

Ide lain adalah menggunakan PulseAudio secara langsung karena tidak memerlukan implementasi tambahan di pihak Mopidy. Wadah Docker yang saya buat menggunakan TCP untuk mengakses PulseAudio melalui jaringan. ncmpcpp sebenarnya bisa menggunakannya secara langsung.

Dari apa yang saya baca, visualizer hanya menjalankan FFT pada blok sampel yang dibaca dari file FIFO. Maksud saya adalah Anda dapat membuat FIFO di luar Mopidy menggunakan mkfifo dan kemudian membaca data UDP dari Mopidy menggunakan netcat dan mengarahkan output dari netcat ke berkas FIFO. Jadi tidak ada yang perlu diubah sejauh menyangkut ncmpcpp , itu hanya membaca file FIFO.

Untuk mencapai apa yang Anda tuju di Mopidy tidak memerlukan upaya implementasi karena Anda dapat mengubah properti output audio menjadi output ke elemen udpsink GStreamer. Kemungkinan besar Anda ingin mengaturnya sebagai bagian dari "tee" yang menampilkan wastafel ALSA/Pulse dan udpsink Anda.

Berikut ini harus bekerja .... tidak diuji jadi mungkin perlu beberapa penyesuaian.

Dalam konfigurasi audio Mopidy:

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

Di host Linux Anda, luncurkan netcat untuk mendengarkan data UDP di localhost pada port 5555 dan keluaran sampel ke FIFO:

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

Di mpd.conf Anda:

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

Catatan: Jika Anda menggunakan output PulseAudio, Anda dapat melakukan sesuatu yang serupa dengan modul koneksi arah TCP-nya. Namun, Anda mungkin perlu merekayasa balik protokol apa pun yang dijalankannya di atas koneksi TCP, misalnya, tidak mungkin memperlakukannya sebagai raw sink.

Terima kasih @liamw9534 untuk berbagi. Butuh beberapa saat bagi saya untuk cukup memahami konfigurasi untuk melakukan itu atau bahkan tahu saya bisa. Saya akan mencoba menambahkannya ke wadah Docker untuk melihat apakah itu berfungsi.

Ini mungkin mengalami masalah jika Anda tidak memiliki sesuatu yang mengosongkan fifo. Karena netcat akan mengisi buffer kernel dan kemudian gagal. Dan tergantung pada bagaimana FIFO dibuka, Anda mungkin juga mengalami masalah karena FIFO dapat meminta pembaca untuk hadir agar dapat ditulis:/

Tetapi Anda dapat mengadaptasi kode FifoStreamer saya untuk menerima data UDP dan menangani ini untuk Anda karena semoga saya telah menangani sebagian besar kasus kesalahan yang dapat Anda hadapi di sana.

@adamcik Jika Anda memiliki skrip yang berfungsi, saya akan dengan senang hati memasukkannya sebagai bagian dari docker-ncmpcpp untuk digunakan orang. Saya juga akan mengubah docker-mopidy untuk disiarkan di UDP secara default menggunakan trik keluaran di atas.

Saya melakukan beberapa eksperimen dasar pada baris perintah dan semuanya berfungsi dengan baik asalkan Anda menggunakan batas waktu koneksi misalnya, nc -kluw 1 127.0.0.1 5555 > /tmp/mopidy.fifo . Ini memaksa netcat untuk selalu mendengarkan koneksi port sumber baru setelah koneksi terakhir terputus (batas waktu 1 detik).

Perintah di atas berfungsi terlepas dari apakah ada yang membaca dari file FIFO atau tidak dan juga berfungsi jika proses membaca dari file FIFO berhenti dan menutup file.

@wernight lihat deskripsi bug ini, hanya itu kode yang saya miliki.

Dan hanya untuk sabuk dan kawat gigi, saya akan menempelkan perintah dalam loop sementara misalnya, while :; do nc -kluw 1 127.0.0.1 5555> /tmp/mopidy.fifo; sleep 1; done - jika keluar, itu hanya akan diluncurkan lagi setelah penundaan 1 detik.

@liamw9534 Anda memiliki mpd.conf di sana. Saya bingung dengan ini. Anda menjalankan server MPD mandiri selain mopidy-mpd?

@lrvick ya kesalahan saya, tentu saja memikirkan konfigurasi yang perlu ditambahkan ke ~/.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

(ditambahkan -p sini).

~/.ncmpcpp/config

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

(selesai juga di wernight/docker-mopidy dan wernight/docker-ncmpcpp )

Namun tampaknya tidak dapat terhubung ke 5555 meskipun log Mopidy menunjukkan bahwa ia memahami konfigurasi output . netstat menunjukkan juga tidak ada UDP terbuka pada 5555. Saya tidak sepenuhnya memahami baris output : tee adalah perintah bash, sisanya terlihat seperti barang Mopidy.

Namun saya menemukan udp6 [::]:51307 saat memutar musik.

output ditafsirkan sebagai elemen GstBin yang diteruskan ke playbin2 sebagai bagian dari Mopidy - sebenarnya ini hanyalah pipeline Gstreamer, sebenarnya tidak ada yang istimewa. Oleh karena itu, tee sebenarnya adalah elemen Gstreamer. Itu tidak ada hubungannya dengan perintah Shell tee .

Jadi Anda dapat memperkirakan apa yang terjadi di dalam Mopidy pada baris perintah dengan melakukan sesuatu seperti:

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

Ini akan mulai memainkan nada sinusoidal. Kemudian jalankan perintah berikut:

nc -kluw 1 127.0.0.1 5555

Saya kemudian dapat mulai melihat banyak karakter aneh di layar saya.... ini adalah tes audio stream yang dikeluarkan ke stdout dari nc . Ini secara efektif membuktikan pendekatan yang mendasarinya berhasil. Bisakah Anda mengonfirmasi bahwa Anda dapat meniru perilaku yang sama?

Anda kemudian dapat mencoba menambahkan FIFO sebagai langkah kedua dan mengonfirmasi bahwa Anda dapat cat FIFO ke stdout dan melihat karakter aneh yang sama.

Saya juga akan memeriksa ulang format konfigurasi yang dibutuhkan oleh ncmpcpp . Saya telah melihat sekilas https://wiki.archlinux.org/index.php/Ncmpcpp#Enabling_visualization dan dapat melihat bahwa mungkin format konfigurasi yang diperlukan berbeda misalnya,

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

Saya tidak menggunakan ncmpcpp , jadi masalahnya bisa di sini juga...

$ 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

(dengan nc ... -p kalau tidak saya mendapatkan kesalahan)

Aku mendengar nada bermain sekalipun.

Distro apa yang Anda gunakan? Juga ketika Anda mengetik nc -h apa hasilnya?

$ 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]

Opsi -p tidak diperlukan dengan nc saya gunakan di Ubuntu. Halaman manual juga menyiratkan bahwa seharusnya menjadi kesalahan untuk menentukan -p dalam hubungannya dengan -l :

     -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.

Menggunakan Debian Wheezy.

Berikut adalah langkah-langkah lengkap untuk Ubuntu dimulai dengan menginstal Docker :

  1. Instal Docker :

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

  1. Aktifkan PulseAudio jarak jauh
  2. Jalankan di 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

Mencoba dengan paket netcat-openbsd yang memberikan:

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

Sekarang nc tidak menunjukkan apa-apa saat nada diputar (yang tampaknya agak lebih baik):

$ nc -kluw 1 127.0.0.1 5555
(nothing here)

Ok, buka dua terminal dan di terminal pertama jalankan:

nc -kluw 1 127.0.0.1 5555

Kemudian di terminal kedua jalankan:

nc -u 127.0.0.1 5555

Masukkan beberapa karakter pada stdin di terminal kedua dan tekan ENTER. Apakah Anda melihat karakter yang sama muncul di terminal pertama di stdout?

Ya itu berhasil. Bahkan membuatnya bekerja lintas 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

Jadi ini tidak menjelaskan mengapa nc tidak menunjukkan apa-apa dengan gst-launch . Namun saya menemukan bahwa saya perlu mengatur host=SOMETHING agar berfungsi di seluruh wadah. Ini akan bermasalah. Sepertinya tidak bisa disiarkan. Tapi itu sesuatu yang bisa saya selesaikan setelah berfungsi setidaknya pada satu wadah.

Ah! Jika saya mengatur host=0.0.0.0 itu berfungsi!

Apakah Anda perlu mengirim data melalui jaringan? Saya berasumsi Anda hanya membutuhkan paket di mesin lokal. Menggunakan udpsink host=0.0.0.0 port=5555 akan menyiarkan paket di mana saja di jaringan Anda. Mungkin bukan yang Anda inginkan ...

Anda seharusnya dapat mengatakan host=127.0.0.1 alih-alih membatasi paket ke loopback lokal.

Saya menduga masalah sebenarnya adalah karena konfigurasi perutean default. Secara default, pada sistem Anda, paket keluar disalurkan ke antarmuka yang berbeda. Kemungkinan versi yang berbeda dari elemen gstreamer atau perbedaan dalam pengaturan perutean ip.

Dari wadah saya harus menggunakan 0.0.0.0 atau mungkin IP mesin. Pengaturan default tidak berfungsi bahkan pada satu mesin/wadah.

Tapi ya saya harus menggunakan jaringan sekarang karena praktik yang baik untuk menyimpan ncmpcpp dan mopidy dalam wadah Docker terpisah, yang berarti mereka berada di jaringan yang berbeda. Itu sangat bagus untuk keamanan dan isolasi dan semacamnya, tetapi itu menciptakan sedikit masalah:

klien ncmpcpp terhubung ke server MPD untuk meminta streaming musik, dan hanya setelah itu IP ncmpcpp diketahui dan paket UDP harus disiarkan ke IP-nya; tetapi saat ini IP di-hardcode dalam konfigurasi Mopidy.

Saya tidak punya solusi sekarang. Saya sedang memikirkan solusi:

  • Membuat FIFO di Mopidy dan membagikannya dengan ncmpcpp, tapi saya khawatir tidak ada yang akan menghapus FIFO dan itu masalah besar. Juga berbagi file tidak sebersih soket jaringan.
  • Koneksi pemantauan daemon lokal dan meneruskan lalu lintas UDP ke IP klien yang ditemukan; meretas
  • Terowongan UDP SSH , tapi itu rumit, menambahkan enkripsi yang tidak berguna, menambahkan daemon lain... buruk!
  • Melihat kode untuk melihat apakah host udpsink dapat di-
  • Beri tahu Docker untuk membagikan Host melalui --net=container:NAME_or_ID yang menambahkan parameter lain untuk diketik pengguna, tetapi itu akan sangat menyederhanakan!

Ada solusi untuk ketergantungan melingkar ini. Masih terasa seperti peretasan yang mengerikan tetapi pada akhirnya akan cukup mudah bagi pengguna untuk digunakan. Terima kasih liamw9534 untuk membantu terutama dengan perintah nc yang saya asing dengannya.

FIFO berfungsi kecuali There is no output named "my_fifo"! . Tampaknya namanya harus cocok dengan yang ada di mdp.conf :

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

Saya dapat mencoba membagikan file FIFO jika saya tahu cara menambahkan output audio ini ke Mopidy. mual (visualizer-ony sederhana) tampaknya memiliki persyaratan yang sama.

Saya menemukan dokumentasi visualizer_output_name :

  • Parameter di bawah ini diperlukan untuk ncmpcpp untuk menentukan keluaran mana yang menyediakan data untuk visualizer dan dengan demikian memungkinkan sinkronisasi antara visualisasi dan suara karena saat ini ada beberapa masalah dengannya.
  • keluaran fifo, yang parameter formatnya harus disetel ke 44100:16:1 untuk visualisasi mono atau 44100:16:2 untuk visualisasi stereo

Saya tidak yakin apa yang Anda maksud dengan mengatakan "pada jaringan yang berbeda". Jika Anda ingin mengisolasi lalu lintas audio ke mesin lokal maka Anda harus menggunakan 127.0.0.1 untuk udpsink . Jika Anda memilih 0.0.0.0 maka itu akan mengarahkan paket menggunakan rute default yang kemungkinan berarti mengirim paket UDP melalui jaringan.... secara umum, saya akan mengatakan ini adalah ide yang buruk karena lalu lintas jaringan akan menghabiskan banyak waktu. banyak bandwidth yaitu, 2 x 16 x 44100 = 1,41 Mbps.

Secara teori, seharusnya dimungkinkan untuk mengonfigurasi nc dengan 0.0.0.0 terlepas dari antarmuka jaringan mana yang digunakan oleh udpsink . Ini akan mendengarkan di semua antarmuka jaringan. Tidak apa-apa selama Anda tidak menggunakan nomor port IP yang sama untuk layanan lain pada antarmuka jaringan yang berbeda.

Saya menggunakan saran terakhir saya dan meletakkan keduanya di jaringan yang sama. Jaringan itu tetap lokal, itu hanya pemisahan logis. Itu berfungsi untuk membangun FIFO, hanya ncmpcpp yang tidak menginginkannya (lihat respons saya sebelumnya, 2 di atas).

Ada ide tentang nama saluran itu? Atau jika ada cara lain untuk FIFO seperti mpd.conf ? Tampaknya tidak berfungsi sama sekali tanpa.

Saya pikir mpd.conf hanya digunakan untuk konfigurasi daemon MPD. Dalam hal ini, itu seharusnya berlebihan karena mopidy adalah daemon MPD dan buruh pelabuhan Anda membuat file FIFO. Dalam hal ini, satu-satunya hal yang diperlukan adalah memastikan .ncmpcpp/config cocok untuk klien, bukan?

Agak. Apa sebenarnya yang dilakukannya aku tidak tahu. Tetapi seperti yang Anda lihat visualizer_output_name = "my_fifo" harus cocok dengan audio_output { name "my_fifo" } . Saat ini ncmpcpp menunjukkan There is no output named "my_fifo" . Deskripsi visualizer_output_name hanya 5 posting di atas. Sepertinya itu benar-benar terhubung langsung entah bagaimana ke output untuk disinkronkan.

Saya tidak menggunakan semua ini tetapi bagi saya sepertinya visualizer_output_name harus cocok dengan salah satu output MPD (protokol, bukan program) Anda (yaitu sesuatu dalam mpc outputs ). Mopidy saat ini tidak mengizinkan keluaran yang dapat dikonfigurasi dan hanya memiliki satu keluaran MPD: "Bungkam".

Anda mungkin ingin menghapus visualizer_output_name , jika memungkinkan.

Mencoba tidak mengaturnya. Masih tidak ada visualisator yang terlihat. Saya ingin tahu tentang format output udpsink : Seharusnya 44100:16:2 agar visualizer berfungsi ( ncmpcpp atau nausea ).

Mencoba Mute berjaga-jaga, mendapat pengalaman yang sangat lucu: Itu hanya mematikan suara, tanpa menampilkan kesalahan tetapi juga tanpa menampilkan visualisator. Atau lebih tepatnya itu menonaktifkan output Mute .

Saya bertanya-tanya tentang di mana fungsi FFT dilakukan untuk visualizer.
Apakah dilakukan pada keluaran FIFO atau pada masukan ke FIFO? Anda
perlu memeriksa kode klien MPD untuk melihat cara menangani data FIFO.

Apakah ada cara untuk mendukung keduanya, hanya untuk pengujian, bahkan jika itu biasanya membuat file yang sangat besar.

Anda juga tidak perlu mendukung. Anda perlu mencari tahu di mana FFT berada
seharusnya dilakukan dan kemudian memilih pendekatan yang benar. Jika FFT adalah
dilakukan di visualizer maka itu hanya akan membuang-buang usaha untuk
menerapkannya lagi.

Pada 13 Mei 2015 pukul 15:09, Werner Beroux [email protected] menulis:

Apakah ada cara untuk mendukung keduanya, hanya untuk pengujian, meskipun itu akan
biasanya membuat file yang sangat besar.


Balas email ini secara langsung atau lihat di GitHub
https://github.com/mopidy/mopidy/issues/775#issuecomment -101676033.

FFT dilakukan oleh visualizer dan memerlukan format audio khusus di FIFO agar berfungsi untuk itu. Referensi: http://git.2f30.org/nausea/about/

Bagus - maka tidak ada alasan untuk tidak bekerja! Sudahkah kamu melakukan
perbandingan berdampingan dari sistem yang menjalankan daemon MPD standar dengan a
klien ncmpcpp lokal? Apa yang terjadi jika Anda mengganti nama file FIFO di keduanya?
file konfigurasi? Apakah itu masih berfungsi? Hanya mencoba untuk melihat apakah a
jalur hardcoded ada di suatu tempat ...

Pada 13 Mei 2015 pukul 15:57, Werner Beroux [email protected] menulis:

FFT dilakukan oleh visualizer dan memerlukan format audio tertentu
di FIFO untuk bekerja untuk itu. Referensi: http://git.2f30.org/nausea/about/


Balas email ini secara langsung atau lihat di GitHub
https://github.com/mopidy/mopidy/issues/775#issuecomment -101702624.

Komentar saya didasarkan dari sumber ncmpcpp .

Keluaran Mopidy's Mute dinonaktifkan secara default yaitu audio tidak dimatikan. Visualiser ncmpcpp akan mengambil output yang Anda berikan, menonaktifkannya (tidak ada efek) dan kemudian mengaktifkannya, sehingga mematikan audio. Bisa dibilang mereka hanya harus mengaktifkannya dua kali.

Audio berada dalam format yang salah adalah kemungkinan yang baik. Anda tidak memiliki apa pun di pipa gstreamer Anda untuk memastikannya benar tidak seperti yang dimiliki @adamcik dalam kodenya di atas.

Sulit untuk melihat bagaimana formatnya bisa menjadi masalah .... ini ditandatangani 16-bit
bilangan bulat. Hal terburuk yang bisa terjadi adalah Anda menukar saluran L/R?

Pada 13 Mei 2015 pukul 16:33, Nick Steel [email protected] menulis:

Komentar saya didasarkan dari sumber ncmpcpp
http://git.musicpd.org/cgit/mirror/ncmpcpp.git/tree/src/visualizer.cpp.

Keluaran Mopidy's Mute dinonaktifkan secara default yaitu audio tidak dimatikan.
Visualiser ncmpcpp akan mengambil output yang Anda berikan, menonaktifkannya (tidak
efek) dan kemudian mengaktifkannya, sehingga mematikan audio. Bisa dibilang mereka harus
hanya beralih dua kali.

Audio berada dalam format yang salah adalah kemungkinan yang baik. Kamu punya
tidak ada apa pun di pipa gstreamer Anda untuk memastikannya benar tidak seperti @adamcik
https://github.com/adamcik ada dalam kodenya di atas.


Balas email ini secara langsung atau lihat di GitHub
https://github.com/mopidy/mopidy/issues/775#issuecomment -101716947.

Dan bahkan jika urutan byte salah, Anda mungkin hanya mengharapkan FFT
output untuk menghasilkan respons frekuensi yang salah ...... tetapi Anda masih akan melihat
sesuatu.

Pada 13 Mei 2015 pukul 16:37, Liam Wickins [email protected] menulis:

Sulit untuk melihat bagaimana formatnya bisa menjadi masalah .... ini ditandatangani 16-bit
bilangan bulat. Hal terburuk yang bisa terjadi adalah Anda menukar saluran L/R?

Pada 13 Mei 2015 pukul 16:33, Nick Steel [email protected] menulis:

Komentar saya didasarkan dari sumber ncmpcpp
http://git.musicpd.org/cgit/mirror/ncmpcpp.git/tree/src/visualizer.cpp.

Keluaran Mopidy's Mute dinonaktifkan secara default yaitu audio tidak dimatikan.
Visualiser ncmpcpp akan mengambil output yang Anda berikan, menonaktifkannya (tidak
efek) dan kemudian mengaktifkannya, sehingga mematikan audio. Bisa dibilang mereka harus
hanya beralih dua kali.

Audio berada dalam format yang salah adalah kemungkinan yang baik. Kamu punya
tidak ada apa pun di pipa gstreamer Anda untuk memastikannya benar tidak seperti
@adamcik https://github.com/adamcik ada di kode nya di atas.


Balas email ini secara langsung atau lihat di GitHub
https://github.com/mopidy/mopidy/issues/775#issuecomment -101716947.

yeh benar, jadi mungkin itu karena membiarkan keluaran Mute Mopidy diaktifkan berarti udpsink tidak akan mengirim data apa pun.

cat /tmp/mdp.fifo (dibuat dari UDP seperti di atas) dengan benar menunjukkan aliran data yang konstan.

Saya melihat kode ncmpcpp visualizer:

  1. membuka file sebagai O_RDONLY | O_NONBLOCK
  2. membaca dari atas ; mengingat itu disetel untuk stereo di konfigurasi mopidy saya, seharusnya 44100:16:2.

Siapa pun juga dapat mencoba dari cabang saya (setelah menginstal 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

Harus menghabiskan cukup banyak waktu untuk berdebat tentang netcat karena -k tidak berhasil untuk saya, tetapi inilah yang saya buat untuk memulai ulang secara otomatis pada sakelar lagu:

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

pilihan lain seperti di atas pada dasarnya.

@ S0lll0s @wernight netcat -k juga tidak berfungsi untuk saya dan harus dimulai ulang setelah perubahan lagu. Sementara solusi Anda berfungsi, saya menemukan socat berfungsi lebih baik:

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

Untuk pengguna arch linux:

Untuk mendapatkan nc dengan dukungan -k Anda perlu menginstal paket openbsd-netcat , tetapi itu tidak berhasil untuk saya juga, jadi coba gunakan skrip @SjRNMzU - Anda perlu paket socat untuk menjalankannya.

@johnhamelink (saya kira Anda menjalankan Arch dari komentar Anda) Apakah Anda memiliki masalah dengan visualizer yang mencoba "mengejar ketinggalan" setelah Anda menjeda lagu menggunakan solusi socat ?

@theos-space Saya tidak bisa mengatakan bahwa saya telah memperhatikannya sendiri

Saya menggunakan Arch dan tidak dapat membuatnya bekerja dengan nc (baik gnu dan openbsd ) atau socat . Selain itu, saya tidak dapat membaca dari gst-launch-1.0 ... udpsink port=5555 dengan nc -kluw 1 127.0.0.1 5555 , karena tidak mencetak apa pun ke layar.

Dapat mengonfirmasi bahwa ini berfungsi pada debian buster (4.11.6-1), mopidy 2.1.0-1, gstreamer1.0-tools 1.12.2-1, ncmpcpp 0.7.4-1+b3, socat 1.7.3.2-1:

mulai socat di startup sistem:

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 (catatan Host harus ditentukan untuk udpsink):

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

ranisalt untuk Arch Anda harus mengkompilasi ncmpcpp dengan dukungan fifo periksa di sini: https://bbs.archlinux.org/viewtopic.php?id=99915

Inilah pengaturan Arch saya yang berfungsi, setelah membaca sisa utas + dokumen + halaman manual + berbagai macam blog. Saya menjalankan Mopidy sebagai layanan sistem dan mengirimkan audio ke layanan pengguna PulseAudio melalui TCP. Saya telah menyertakan beberapa anotasi tambahan yang diharapkan akan membantu mereka yang kurang berpengalaman.

Paket

Semua ini dari repo Arch resmi:

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

Mempersiapkan

Aktifkan layanan sistem mopidy:

sudo systemctl enable mopidy.service

Ganti konfigurasi sistem mopidy dengan symlink ke konfigurasi pengguna untuk kemudahan pengeditan (opsional):

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

Buat file fifo:

mkfifo "/tmp/mpd.fifo"

Konfigurasi

di ~/.config/mopidy/mopidy.conf (atau /etc/mopidy/mopidy.conf jika Anda tidak membuat symlink): Beri tahu mopidy untuk mengirim audio ke server pulseaudio yang mendengarkan di localhost dan ke sink UDP di localhost:5555

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

di ~/.ncmpcpp/config : Beri tahu ncmpcpp di mana menemukan file fifo yang perlu didengarkan, dan beberapa pengaturan lain-lain

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

di ~/.config/pulse/default.pa : Beri tahu pulseaudio untuk menerima audio melalui TCP dari localhost (pengaturannya mungkin sudah ada dan tidak dapat dikomentari)

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

di ~/.zshrc (juga harus bekerja di ~/.bashrc ): Buat fungsi pembungkus "nplayer" untuk menangani memulai dan menghentikan netcat dengan ncmpcpp :

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

Apa yang dilakukan ini:

  • definisikan suatu fungsi dengan subkulit yang membungkus seluruh isinya
  • mulai proses netcat di latar belakang untuk mendengarkan data audio yang dikirim ke wastafel UDP dan mengarahkannya ke fifo yang dibuat sebelumnya. Bendera:

    • -k terus mendengarkan setelah koneksi saat ini selesai

    • -l mengaktifkan mode mendengarkan

    • -u aktifkan mode UDP

    • -w NUM batas waktu koneksi idle setelah NUM detik (1 detik dalam kasus ini)

  • setel jebakan EXIT untuk mematikan proses netcat ketika proses ncmpcpp berakhir dan menyebabkan subkulit fungsi keluar
  • mulai proses ncmpcpp di latar depan

Saya menjalankan mopidy di Manjaro (distro lengkung). Saya mengalami masalah dengan mendapatkan output apa pun melalui socat atau netcat. Saya dapat mengamati paket yang masuk dengan tcpdump:
sudo tcpdump -i lo -n udp port 5555 -XX

Butuh waktu lama dan saya tidak akan menemukan masalah tanpa @mosbasik .
Masalahnya adalah tidak memiliki host=127.0.0.1 setelah udpsink, mengapa ini bekerja untuk orang lain dan bukan saya, saya tidak tahu. Tetapi jika Anda tidak mendapatkan output apa pun, mungkin ini masalahnya. 2 ini bekerja untuk saya:

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

atau

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

Di samping catatan: Saya tidak bisa mendapatkan pulsesink untuk bekerja jadi saya harus meninggalkannya di autoaudiosink , yang juga telah saya atur sebelumnya. Namun visualizer tampaknya sangat lambat untuk beberapa alasan, saya tidak yakin apakah itu karena autoaudiosink Berfungsi Sempurna setelah Reboot .. masih sedikit lambat. Dengan pulselink itu terus mengeluh tentang plugin gstreamer. Bahkan setelah (saya berasumsi) saya menginstal setiap paket plugin untuk gst di repo Arch resmi. Catatan flump3dec dan mad


Keluaran 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

Saya mengalami masalah saat mencoba membuat udpsink bekerja dengan Mopidy dan semua klien ncmpcpp jarak jauh. Mopidy diatur dengan MacVLAN di lingkungan buruh pelabuhan. Saya berhasil melihat port pada wadah.

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!

Saat ini Mopidy menggunakan sedikit konfigurasi berikut:

[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

Adakah pemikiran tentang bagaimana saya bisa menggunakan netcat agar berhasil memasukkan data mentah ke mpd.fifo? Menggunakan yang berikut ini tidak berfungsi, saya pikir karena saya menggunakan netcat dengan cara yang salah. Beberapa penelitian belum memberikan jawaban apa pun, jadi semoga seseorang dapat mengarahkan saya ke arah yang benar.

#!/bin/bash

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

Saya mendapatkan kesalahan berikut:

nc: Can't assign requested address

Adakah pemikiran tentang bagaimana saya bisa membuat ini berfungsi?

Bersulang!

FYI Saya menambahkan dukungan untuk udpsink gstreamer ke ncmpcpp jadi sekarang dapat digunakan secara langsung tanpa peretasan fifo.

Lihat https://github.com/ncmpcpp/ncmpcpp/commit/fb886f687014e22b2fe1477da855be5201063ea8 untuk detail lebih lanjut.

Di bawah teaser. Ini adalah mopidy + mopidy-spotify + mopidy-mpd + ncmpcpp.

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

@arybczak Luar biasa! Anda harus memposting ini ke https://discourse.mopidy.com/c/show-and-tell/9

@adamcik Bukankah ini berarti bahwa masalah hampir 7 tahun ini "tidak digunakan lagi" demi resolusi yang lebih baik untuk masalah dunia nyata yang memicunya (mendukung visualisasi di ncmpcpp)?

@pspeder , apa sebenarnya yang anda maksud? Apakah ada masalah dengan menggunakan https://github.com/mopidy/mopidy/issues/775#issuecomment -747725806 ?

@kingosticks Hanya menyarankan agar masalah ini ditutup

Saya setuju dengan itu.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat