Mopidy: gstreamer fifo 싱크 추가 살펴보기

에 만든 2014년 07월 08일  ·  73코멘트  ·  출처: mopidy/mopidy

사람들이 ncmpcpp의 비주얼라이저를 정말 좋아하는 것 같아서 계속 나타납니다.

신뢰할 수 있는 FIFO 싱크를 만드는 방법은 두 가지입니다. 비차단 쓰기를 사용해야 합니다. 즉, 판독기가 없으면 쓰기 소켓을 여는 데 실패하므로 판독기도 필요합니다. 두 번째로 외부 리더가 뒤처졌거나 버퍼가 없어서 버퍼가 가득 차면 내부 리더가 버퍼를 지워야 합니다.

다음 코드는 이것의 기본 요지를 포착하지만 여전히 오류 처리와 관련하여 더 많은 작업이 필요합니다.

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 바인딩이 파이썬에서 요소를 만드는 데 적합하지 않기 때문입니다. 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) 

내가 이것을 테스트하면서 만난 한 가지 문제는 실제로 ncmpcpp에서 예상한 오디오 형식과 일치하는 것을 잊어버렸기 때문에 모노/스테레오가 실제로 일치하는지 확인하십시오.

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으로 변환해야 할 필요가 있기 때문에 작업하고 있지 않으며, 지금까지 그것에 대한 모든 실험은 파이썬에서 사용자 정의 요소를 수행할 때 문제를 발견했습니다. 이 모든 것을 해결할 수 있는 다른 방법이 있을 수 있지만 시간이 없습니다.

FIFO 지원이 추가되었으면 합니다. :)

방금 ncmpcpp의 음악 시각화 도우미가 mopidy와 함께 작동하도록 하는 방법을 찾고 있었습니다. 나는 찬성이다.

네, 제가 이것을 찾은 이유도 같습니다. 정말 좋을텐데
스트리밍된 음악을 시각화할 수 있고,

2014-11-06 2:19 GMT-05:00 블레이크 알림 @github.com :

방금 ncmpcpp의 음악 시각화 도구를
mopidy와 함께 작동합니다. 나는 찬성이다.


이 이메일에 직접 답장하거나 GitHub에서 확인하세요.
https://github.com/mopidy/mopidy/issues/775#issuecomment -61936376.

gstreamer 시각화 플러그인이 있는데 그냥 사용하면 안되나요?
2014년 11월 6일 08:35에 "Diego Berrocal" [email protected]에서 다음과 같이 썼습니다.

네, 제가 이것을 찾은 이유도 같습니다. 정말 좋을텐데
스트리밍된 음악을 시각화할 수 있고,

2014-11-06 2:19 GMT-05:00 블레이크 알림 @github.com :

방금 ncmpcpp의 음악 시각화 도구를 얻는 방법을 찾다가 이것을 찾았습니다.
에게
mopidy와 함께 작동합니다. 나는 찬성이다.


이 이메일에 직접 답장하거나 GitHub에서 확인하세요.
https://github.com/mopidy/mopidy/issues/775#issuecomment -61936376.


이 이메일에 직접 답장하거나 GitHub에서 확인하세요.
https://github.com/mopidy/mopidy/issues/775#issuecomment -62007426.

그것들은 다음 릴리스에서 나올 예정입니다.

이 작업을 하는 사람이 있습니까? mopidy와 함께 ncmpcpp 시각화 도우미를 사용할 수 있다면 정말 좋을 것입니다.

내가 아는 것은 아니며 GStreamer 1.x로의 마이그레이션을 차단할 수 있으므로 GStreamer 요소로 이 작업을 수행하고 싶지 않을 것입니다.

이것은 출력에 대한 적절한 지원을 다시 추가할 때 차단된 IMO이기도 합니다.

Mopidy/ncmpcpp에 시각화 지원을 추가하려고 할 때도 이 문제가 발생했다고 덧붙였습니다. 현재 작업 중이 아니더라도 미래에 이것을 갖고 싶습니다. 또한 오픈 소스 프로젝트에 시간을 할애하는 분들에게 무한한 존경을 표하고 싶습니다. :웃다:

이상적으로는 원격으로 작동합니다. Mopidy의 힘은 실제로 프라이빗 클라우드에 있을 수 있는 솔루션에 있습니다.

일반적으로 FIFO는 매우 이식 가능한 프로세스 간 통신 방법이 아니므로 IMO를 피해야 합니다. 또한 이 스레드에서 이미 언급한 몇 가지 불쾌한 부작용이 있습니다. 개인적으로 UDP 싱크를 사용하여 패킷을 덤프하는 것이 더 낫다고 생각합니다. 이것은 더 일반적인 솔루션이며 Mopidy 외부의 FIFO(필요한 경우)에 쓰는 것에 쉽게 적용할 수 있습니다....단일 UDP 포트(netcat 사용)에서 데이터를 읽고 FIFO에 쓰는 쉘 스크립트 행.

그 좋은 소리. 클라이언트가 거짓말을 할 수도 있습니다. ncmpcpp는 입력으로 사용할 수도 있습니다.

또 다른 아이디어는 Mopidy 측에서 추가 구현이 필요하지 않으므로 PulseAudio를 직접 사용하는 것입니다. 내가 만든 Docker 컨테이너는 TCP를 사용하여 네트워크를 통해 PulseAudio에 액세스합니다. ncmpcpp는 실제로 그것을 직접 사용할 수 있습니다.

내가 읽은 것에서 시각화 도우미는 FIFO 파일에서 읽은 샘플 블록에서 FFT를 실행하고 있습니다. 내가 말하고 있는 요점은 mkfifo 사용하여 Mopidy 외부에서 FIFO를 만든 다음 netcat 사용하여 Mopidy에서 UDP 데이터를 읽고 netcat 의 출력을 다음으로 리디렉션할 수 있다는 것입니다. FIFO 파일. 따라서 ncmpcpp 에 관한 한 변경할 필요가 없으며 FIFO 파일만 읽습니다.

Mopidy에서 목표로 하는 것을 달성하기 위해 오디오 출력 속성을 udpsink GStreamer 요소로 출력하도록 변경할 수 있으므로 구현 노력이 필요하지 않습니다. ALSA/펄스 싱크와 udpsink 모두에 출력하는 "티"의 일부로 정렬하고 싶을 가능성이 더 큽니다.

다음은 작동해야 합니다.... 테스트되지 않았으므로 약간의 조정이 필요할 수 있습니다.

Mopidy 오디오 구성에서:

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

Linux 호스트에서 netcat을 실행하여 localhost에서 포트 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가 쓰기 가능하도록 리더가 있어야 할 수 있으므로 문제가 발생할 수도 있습니다./

그러나 UDP 데이터를 수락하고 이를 처리하도록 내 FifoStreamer 코드를 조정할 수 있습니다. 아마도 그곳에서 발생할 수 있는 대부분의 오류 사례를 이미 처리했기 때문입니다.

@adamcik 작동하는 스크립트가 있다면 사람들이 사용할 수 있도록 docker-ncmpcpp의 일부로 포함하고 싶습니다. 또한 위의 출력 트릭을 사용하여 기본적으로 UDP에서 브로드캐스트하도록 docker-mopidy 를 변경합니다.

명령줄에 대한 몇 가지 기본 실험을 수행했으며 연결 시간 제한(예: nc -kluw 1 127.0.0.1 5555 > /tmp/mopidy.fifo 을 사용하면 모두 잘 작동합니다. 이것은 netcat이 마지막 연결이 끊어진 후(1초 시간 초과) 항상 새 소스 포트 연결을 수신하도록 합니다.

위의 명령은 FIFO 파일에서 아무 것도 읽고 있지 않은지 여부에 관계없이 작동하며 FIFO 파일에서 읽는 프로세스가 중지되고 파일을 닫는 경우에도 작동합니다.

@wernight 이 버그에 대한 설명을 참조하세요. 이것이 제가 가지고 있는 모든 코드입니다.

그리고 벨트와 중괄호의 경우 while :; do nc -kluw 1 127.0.0.1 5555> /tmp/mopidy.fifo; sleep 1; done 와 같이 while 루프에 명령을 추가합니다. 종료되면 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-mopidywernight/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으로 출력되는 테스트 오디오 스트림입니다. 이는 기본 접근 방식이 작동함을 효과적으로 증명합니다. 동일한 동작을 반복할 수 있는지 확인할 수 있습니까?

그런 다음 두 번째 단계로 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]

-p 옵션은 Ubuntu에서 사용 중인 nc 에는 필요하지 않습니다. 매뉴얼 페이지는 또한 -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.

데비안 Wheezy 사용.

다음은 Docker

  1. 도커 설치 :

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

  1. 원격 PulseAudio 활성화
  2. 데비안에서 실행:

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

좋아, 두 개의 터미널을 열고 첫 번째 터미널에서 다음을 실행합니다.

nc -kluw 1 127.0.0.1 5555

그런 다음 두 번째 터미널에서 다음을 실행합니다.

nc -u 127.0.0.1 5555

두 번째 터미널의 stdin에 일부 문자를 입력하고 Enter 키를 누릅니다. stdout의 첫 번째 터미널에 동일한 문자가 표시되는 것이 보입니까?

예, 작동합니다. Docker 간에도 작동합니다.

$ 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에게 감사합니다.

FIFO는 There is no output named "my_fifo"! 제외하고 작동합니다. 이름이 mdp.conf 의 이름과 일치해야 하는 것 같습니다.

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

이 오디오 출력을 Mopidy에 추가하는 방법을 알고 있다면 FIFO 파일을 공유하려고 할 수 있습니다. 메스꺼움 (간단한 시각화 도구)도 동일한 요구 사항을 갖는 것 같습니다.

visualizer_output_name 문서를 찾았습니다.

  • 아래 매개변수는 ncmpcpp가 시각화 도우미에 데이터를 제공하는 출력을 결정하는 데 필요하므로 현재 몇 가지 문제가 있으므로 시각화와 사운드 간의 동기화를 허용합니다.
  • 모노 시각화의 경우 형식 매개변수를 44100:16:1 또는 스테레오 시각화의 경우 44100:16:2로 설정해야 하는 fifo 출력

"다른 네트워크에서"라는 말이 무슨 뜻인지 잘 모르겠습니다. 오디오 트래픽을 로컬 시스템으로 분리하려면 127.0.0.1 대해 udpsink 127.0.0.1 를 사용해야 합니다. 0.0.0.0 를 선택하면 네트워크를 통해 UDP 패킷을 보내는 것을 의미하는 기본 경로를 사용하여 패킷을 보냅니다. 일반적으로 네트워크 트래픽이 소비하기 때문에 이것은 나쁜 생각이라고 말하고 싶습니다. 많은 대역폭, 즉 2 x 16 x 44100 = 1.41Mbps입니다.

이론적으로 udpsink 가 사용하는 네트워크 인터페이스에 관계없이 0.0.0.0 nc 를 구성하는 것이 가능해야 합니다. 이것은 모든 네트워크 인터페이스에서 수신 대기합니다. 다른 네트워크 인터페이스의 다른 서비스에 대해 동일한 IP 포트 번호를 사용하지 않는 한 괜찮습니다.

나는 내 마지막 제안을 사용했고 둘 다 같은 네트워크에 넣었습니다. 이러한 네트워크는 어쨌든 로컬이며 논리적인 분리일 뿐입니다. 그것은 FIFO를 만드는 데 작동하지만 ncmpcpp는 그것을 원하지 않습니다(위의 2번의 내 이전 응답 참조).

그 채널 이름에 대해 아는 것이 있습니까? 또는 mpd.conf 와 같은 FIFO에 대한 다른 방법이 있다면? 없이는 전혀 작동하지 않는 것 같습니다.

MPD 데몬 구성에만 mpd.conf 를 사용했다고 생각했습니다. 이 경우 mopidy가 MPD 데몬이고 도커가 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(프로토콜이 아닌 프로토콜) 출력(예: mpc outputs ) 중 하나와 일치해야 하는 것처럼 보입니다. Mopidy는 현재 구성 가능한 출력을 허용하지 않으며 "음소거"라는 MPD 출력 하나만 있습니다.

가능하면 visualizer_output_name 설정을 해제하고 싶을 것입니다.

설정하지 않으려고 했습니다. 여전히 시각화 도구가 표시되지 않습니다. udpsink 의 출력 형식이 궁금합니다. 시각화 도우미가 작동하려면 44100:16:2 이어야 합니다( ncmpcpp 또는 nausea ).

만일의 경우를 대비하여 Mute 시도했지만 매우 재미있는 경험을 했습니다. 오류를 표시하지 않고 시각화 도구를 표시하지 않고 소리를 음소거했습니다. 또는 더 정확하게는 Mute 출력을 비활성화했습니다.

Visualizer에 대해 FFT 기능이 수행되는 위치가 궁금합니다.
FIFO의 출력에서 ​​수행됩니까 아니면 FIFO에 대한 입력에서 수행됩니까? 너
FIFO 데이터를 처리하는 방법을 보려면 MPD 클라이언트 코드를 확인해야 합니다.

일반적으로 엄청나게 큰 파일을 생성하더라도 테스트용으로 둘 중 하나를 지원하는 방법이 있습니까?

지원하지 않아도 됩니다. FFT가 어디에 있는지 알아야 합니다.
수행한 다음 올바른 접근 방식을 선택해야 합니다. FFT가 다음과 같은 경우
시각화 도우미에서 수행한 다음 작업을 수행하는 것은
다시 구현하십시오.

2015년 5월 13일 15:09에 Werner Beroux [email protected] 은 다음과 같이 썼습니다.

테스트를 위해 둘 중 하나를 지원하는 방법이 있습니까?
일반적으로 엄청나게 큰 파일을 만듭니다.


이 이메일에 직접 답장하거나 GitHub에서 확인하세요.
https://github.com/mopidy/mopidy/issues/775#issuecomment -101676033.

FFT는 시각화 도우미에 의해 수행되며 이를 위해 FIFO의 특정 오디오 형식이 필요합니다. 참조: http://git.2f30.org/nausea/about/

좋습니다. 그러면 작동하지 않을 이유가 없습니다! 했어?
표준 MPD 데몬을 실행하는 시스템의 병렬 비교
로컬 ncmpcpp 클라이언트? 둘 다에서 FIFO 파일 이름을 바꾸면 어떻게 됩니까?
구성 파일? 여전히 작동합니까? 그냥 확인하려고
하드코딩된 경로가 어딘가에 존재합니다...

2015년 5월 13일 15:57에 Werner Beroux [email protected] 은 다음과 같이 썼습니다.

FFT는 시각화 도우미에서 수행되며 특정 오디오 형식이 필요합니다.
FIFO에서 작동합니다. 참조: http://git.2f30.org/nausea/about/


이 이메일에 직접 답장하거나 GitHub에서 확인하세요.
https://github.com/mopidy/mopidy/issues/775#issuecomment -101702624.

내 의견은 ncmpcpp 소스를 기반으로 했습니다.

Mopidy의 음소거 출력은 기본적으로 비활성화되어 있습니다. 즉, 오디오가 음소거되지 않습니다. ncmpcpp 비주얼라이저는 사용자가 제공한 출력을 가져와 비활성화(효과 없음)한 다음 활성화하여 오디오를 음소거합니다. 틀림없이 그들은 그것을 두 번 토글해야합니다.

잘못된 형식의 오디오는 좋은 가능성입니다. @adamcik 이 위의 코드에서 가지고 있는 것과 달리 gstreamer 파이프라인이 올바른지 확인할 수 있는 것은 없습니다.

형식이 어떻게 문제가 될 수 있는지 확인하기 어렵습니다. 16비트로 서명됨
정수. 일어날 수 있는 최악의 상황은 L/R 채널을 바꾸는 것입니까?

2015년 5월 13일 16:33에 Nick Steel [email protected] 은 다음과 같이 썼습니다.

내 의견은 ncmpcpp 소스를 기반으로 했습니다.
http://git.musicpd.org/cgit/mirror/ncmpcpp.git/tree/src/visualizer.cpp.

Mopidy의 음소거 출력은 기본적으로 비활성화되어 있습니다. 즉, 오디오가 음소거되지 않습니다.
ncmpcpp 비주얼라이저는 사용자가 제공한 출력을 가져와 비활성화합니다(아니오
효과)를 선택한 다음 활성화하여 오디오를 음소거합니다. 틀림없이 그들은
그냥 두 번 토글하십시오.

잘못된 형식의 오디오는 좋은 가능성입니다. 당신은
@adamcik과 달리 gstreamer 파이프라인이 올바른지 확인하는 것은 없습니다.
https://github.com/adamcik 은 위의 코드에 있었습니다.


이 이메일에 직접 답장하거나 GitHub에서 확인하세요.
https://github.com/mopidy/mopidy/issues/775#issuecomment -101716947.

바이트 순서가 잘못된 경우에도 FFT를 예상할 수 있습니다.
잘못된 주파수 응답을 생성하는 출력 ......하지만 여전히 볼 수 있습니다.
무엇.

2015년 5월 13일 16:37에 Liam Wickins [email protected] 다음과 같이 썼습니다.

형식이 어떻게 문제가 될 수 있는지 확인하기 어렵습니다. 16비트로 서명됨
정수. 일어날 수 있는 최악의 상황은 L/R 채널을 바꾸는 것입니까?

2015년 5월 13일 16:33에 Nick Steel [email protected] 은 다음과 같이 썼습니다.

내 의견은 ncmpcpp 소스를 기반으로 했습니다.
http://git.musicpd.org/cgit/mirror/ncmpcpp.git/tree/src/visualizer.cpp.

Mopidy의 음소거 출력은 기본적으로 비활성화되어 있습니다. 즉, 오디오가 음소거되지 않습니다.
ncmpcpp 비주얼라이저는 사용자가 제공한 출력을 가져와 비활성화합니다(아니오
효과)를 선택한 다음 활성화하여 오디오를 음소거합니다. 틀림없이 그들은
그냥 두 번 토글하십시오.

잘못된 형식의 오디오는 좋은 가능성입니다. 당신은
gstreamer 파이프라인에는 다음과 달리 올바른지 확인하는 것이 없습니다.
@adamcik https://github.com/adamcik 은 위의 코드에 있었습니다.


이 이메일에 직접 답장하거나 GitHub에서 확인하세요.
https://github.com/mopidy/mopidy/issues/775#issuecomment -101716947.

예, 그렇습니다. Mopidy의 Mute 출력을 활성화 상태로 두면 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

아치 리눅스 사용자의 경우:

-k 지원으로 nc 를 얻으려면 openbsd-netcat 패키지를 설치해야 하지만 저에게도 작동하지 않았으므로 @SjRNMzU 의 스크립트를 사용해 보십시오. socat 패키지를 실행합니다.

@johnhamelink (나는 당신이 당신의 코멘트에서 아치를 실행하고 있다고 가정합니다) socat 솔루션을 사용하여 노래를 일시 중지한 후 비주얼라이저가 "따라잡기"를 시도하는 데 문제가 있었습니까?

@theos-space 나는 나 자신이 그것을 알아차렸다고 말할 수 없다.

나는 Arch에 있고 nc ( gnuopenbsd ) 또는 socat 와 함께 작동하도록 할 수 없습니다. 또한 화면에 아무 것도 인쇄하지 않으므로 nc -kluw 1 127.0.0.1 5555 에서 gst-launch-1.0 ... udpsink port=5555 에서 읽을 수 없습니다.

데비안 버스터(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에서 작동하는지 확인할 수 있습니다.

시스템 시작 시 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

아치용 ranisalt를 사용하려면 fifo 지원 확인을 사용하여 ncmpcpp를 컴파일해야 합니다. https://bbs.archlinux.org/viewtopic.php?id=99915

스레드 + 문서 + 맨페이지 + 다양한 블로그의 나머지 부분을 읽은 후 작동하는 아치 설정은 다음과 같습니다. Mopidy를 시스템 서비스로 실행하고 TCP를 통해 사용자 서비스 PulseAudio에 오디오를 보내고 있습니다. 경험이 적은 분들에게 도움이 될 만한 몇 가지 추가 주석을 추가했습니다.

패키지

이 모든 것은 공식 Arch repos에서 가져온 것입니다.

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"

구성

in ~/.config/mopidy/mopidy.conf (또는 심볼릭 링크를 생성하지 않은 경우 /etc/mopidy/mopidy.conf ): mopidy에게 localhost에서 수신 대기하는 pulseaudio 서버와 localhost:5555에 있는 UDP 싱크로 오디오를 보내도록 지시합니다

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

~/.ncmpcpp/config : ncmpcpp에게 들어야 하는 fifo 파일을 찾을 위치와 기타 기타 설정을 알려줍니다.

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 : localhost에서 TCP를 통해 오디오를 수락하도록 pulseaudio에 지시(설정이 이미 있을 수 있으며 주석 처리를 제거할 수 있음)

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

~/.zshrc ( ~/.bashrc 에서도 작동해야 함): netcat 하여 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초)

  • ncmpcpp 프로세스가 종료되고 함수 서브쉘이 종료될 때 netcat 프로세스를 종료하도록 EXIT 트랩을 설정합니다.
  • 포그라운드에서 ncmpcpp 프로세스 시작

Manjaro(아치 배포판)에서 mopidy를 실행 중입니다. socat 또는 netcat을 통해 출력을 얻는 데 문제가 있었습니다. 그래도 tcpdump와 함께 들어오는 패킷을 관찰할 수 있었습니다.
sudo tcpdump -i lo -n udp port 5555 -XX

오랜 시간이 걸렸고 @mosbasik 없이는 문제를
문제는 udpsink 후에 host=127.0.0.1 가 없었습니다. 이것이 왜 내가 아닌 다른 사람들에게 효과가 있는지 모르겠습니다. 그러나 출력을 얻지 못하면 가능한 경우입니다. 이 2가지가 저에게 효과적이었습니다.

[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 때문인지 확실하지 않습니다 . 재부팅 후 Works Perfect .. 그래도 약간 느립니다. pulselink를 사용하면 gstreamer 플러그인에 대해 계속 불평했습니다. 공식 Arch repos에 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년에 걸친 이 문제가 촉발된 실제 문제에 대한 더 나은 해결을 위해 "사용되지 않음"이라는 의미가 아닙니까(ncmpcpp에서 시각화 지원)?

@pspeder , 정확히 무엇을 의미합니까? https://github.com/mopidy/mopidy/issues/775#issuecomment -747725806 사용에 문제가 있습니까?

@kingosticks 는 단순히 이 문제가 종료되었음을 시사했습니다 🙂

나는 그것에 동의합니다.

이 페이지가 도움이 되었나요?
0 / 5 - 0 등급