Mopidy: HTTP μ˜€λ””μ˜€ 좜λ ₯ 슀트리밍 지원 μΆ”κ°€

에 λ§Œλ“  2011λ…„ 01μ›” 19일  Β·  15μ½”λ©˜νŠΈ  Β·  좜처: mopidy/mopidy

HTTPλ₯Ό 톡해 Mopidyκ°€ μž¬μƒν•˜λŠ” μ˜€λ””μ˜€ μŠ€νŠΈλ¦Όμ„ μ œκ³΅ν•˜λŠ” 경우 HTTP 슀트림 및 Squeezeboxes 와 같은 μž₯치λ₯Ό μ§€μ›ν•˜λŠ” MPD ν΄λΌμ΄μ–ΈνŠΈ λͺ¨λ‘μ—μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

슀트림 인코딩은 Ogg Vorbis 및/λ˜λŠ” MP3μ—¬μ•Ό ν•©λ‹ˆλ‹€.

C-enhancement A-audio

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

μ§€λ‚œ 2λ…„ λ™μ•ˆ μ—…λ°μ΄νŠΈκ°€ μžˆμŠ΅λ‹ˆκΉŒ?

λͺ¨λ“  15 λŒ“κΈ€

λ‹€μŒ μ½”λ“œλ₯Ό κ°€μ •ν•©λ‹ˆλ‹€.

import logging
from BaseHTTPServer import BaseHTTPRequestHandler

from mopidy import get_version

logger = logging.getLogger('mopidy.outputs.http')

class StreamingHTTPRequestHandler(BaseHTTPRequestHandler):
    server_version = 'HTTPOutput/%s' % get_version()

    def do_GET(self):
        self.send_response(200)
        self.send_header('content-type', 'audio/mpeg')
        self.end_headers()

        register_fd_with_output(self.wfile.fileno())

        self.close_connection = 0

    def log_message(self, format, *args):
        logger.info(format, *args)

μ—¬κΈ°μ„œ register_fd_with_output() λŠ” HTTPOutput( audioconvert ! lame ! multifdsink )의 fd 싱크에 μΆ”κ°€ μ‹ ν˜Έλ₯Ό λ‚΄λ³΄λ‚΄λŠ” ν•¨μˆ˜μ΄κ³  BaseHTTPServer.HTTPServer μ‹€ν–‰ 쀑인 ThreadingActor κ°€ μžˆμŠ΅λ‹ˆλ‹€. StreamingHTTPRequestHandler HTTP 슀트리밍이 μž‘λ™ν•΄μ•Ό ν•©λ‹ˆλ‹€.

메타데이터와 같은 μΆ”κ°€ κΈ°λŠ₯의 경우 λ‹€μŒ 링크가 μœ μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

μœ„μ˜ μ½”λ“œλŠ” 이 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 데 μ‚¬μš©ν•˜λ©΄ μ•ˆ λ©λ‹ˆλ‹€. μ½”λ“œ 기반의 ν˜„μž¬ μƒνƒœλ‘œ μš°λ¦¬λŠ” cherrypyλ₯Ό 기반으둜 ν•˜λŠ” 무언가λ₯Ό μ›ν•©λ‹ˆλ‹€.

κ°€μž₯ λ¨Όμ € ν•΄μ•Ό ν•  일은 OUTPUT μ„€μ •μ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” GStreamer μš”μ†Œλ₯Ό λ§Œλ“€κ³  λ“±λ‘ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. λ―Ήμ„œλ₯Ό μ‚¬μš©ν•˜λ©΄ #152 λ˜λŠ” Pitivi 예제의 μ½”λ“œλ‘œ μ‹œμž‘ν•˜κΈ°μ— μΆ©λΆ„ν•΄μ•Ό ν•©λ‹ˆλ‹€. μš”μ†ŒλŠ” 기본적으둜 multifdsink λž˜ν•‘ν•˜κ³ , 체리피 ν•­λͺ©μ„ μ²˜λ¦¬ν•˜κ³  이듀 사이에 FDλ₯Ό μ „λ‹¬ν•©λ‹ˆλ‹€.

HTTP 뢀뢄에 κ΄€ν•΄μ„œλŠ” 적어도 그것에 λŒ€ν•΄ μ§„ν–‰ν•˜λŠ” 방법이 μžˆμŠ΅λ‹ˆλ‹€. 첫 λ²ˆμ§ΈλŠ” μ•„λ§ˆλ„ κ°€μž₯ μ‰¬μš΄ 방법일 κ²ƒμž…λ‹ˆλ‹€. ν”„λ‘ νŠΈμ—”λ“œ μ„œλ²„μ— λŒ€ν•΄ 독립적인 cherrypy μ„œλ²„λ₯Ό μ‹œμž‘ν•˜κ³  μ‚¬μš©ν•˜μ‹­μ‹œμ˜€. 두 번째, μš°λ¦¬κ°€ μ›ν•˜λŠ” 것은 ν”„λ‘ νŠΈμ—”λ“œμ™€ μ½”λ“œμ˜ 슀트리밍 λΆ€λΆ„ 간에 κ³΅μœ λ˜λŠ” 싱글톀 HTTP μ„œλ²„λ₯Ό κ°–λŠ” κ²ƒμž…λ‹ˆλ‹€. 이 뢀뢄은 ν˜„μž¬ μ œκ°€ μ•„λŠ” ν•œ 크게 μ•Œλ €μ§€μ§€ μ•Šμ€ λΆ€λΆ„μž…λ‹ˆλ‹€.

HTTP μ„œλ²„κ°€ 배치되면 μ²΄λ¦¬νŒŒμ΄μ—μ„œ μ†ŒμΌ“μ„ 뢄리해야 ν•©λ‹ˆλ‹€. ws4pyλ₯Ό 보면 request.rfile.rfile._sock = None 것이 μš°λ¦¬κ°€ 관리할 수 μžˆλŠ” κ°€μž₯ κ°€λŠ₯μ„± μžˆλŠ” ν•΄κ²° 방법인 것 κ°™μŠ΅λ‹ˆλ‹€. λΆ„λ¦¬ν•˜κΈ° 전에 일뢀 헀더λ₯Ό 내보내고 싢을 κ²ƒμž…λ‹ˆλ‹€. 그런 λ‹€μŒ fdλ₯Ό λΆ„λ¦¬ν•˜μ—¬ μ‹±ν¬λ‘œ 내보내고 μŠ€νŠΈλ¦¬λ°ν•΄μ•Ό ν•©λ‹ˆλ‹€. ws4pyκ°€ μ†ŒμΌ“μ„ μΈμˆ˜ν•˜λŠ” 방법을 μ‚΄νŽ΄λ³΄λ©΄ μ„ΈλΆ€ 정보λ₯Ό νŒŒμ•…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ‹€λ₯Έ 뢀뢄은 FDλ₯Ό λ°©μΆœν•  수 μžˆλ„λ‘ 핡심 μ˜€λ””μ˜€ APIλ₯Ό ν™•μž₯ν•˜λŠ”μ§€ μ—¬λΆ€μž…λ‹ˆλ‹€. 그것은 λ°”λ‘œ κ·Έ κ²½μš°μ— νŠΉν™”λœ κ²ƒμ΄κ±°λ‚˜ μš°λ¦¬κ°€ μ‚¬μš©ν•˜κ³  μžˆλŠ” 좜λ ₯ λΉˆμ— μ ‘κ·Όν•  수 μžˆλ„λ‘ ν•˜λŠ” 더 일반적인 κ²ƒμž…λ‹ˆλ‹€.

λ‚΄κ°€ μ™œ 이것을 더 일찍 μƒκ°ν•˜μ§€ μ•Šμ•˜λŠ”μ§€ λ‚˜λŠ” μ „ν˜€ λͺ¨λ₯Έλ‹€. κ·ΈλŸ¬λ‚˜ μ†ŒμΌ“μ„ ν›”μΉ˜λŠ” 것에 κ΄€ν•΄μ„œλŠ” μš°λ¦¬κ°€ socket.fromfd 을 μ‚¬μš©ν•˜μ—¬ μƒˆ 볡사본을 μƒμ„±ν•˜μ—¬ 원본을 아무 영ν–₯ 없이 닫을 수 μžˆλ„λ‘ ν•΄μ•Ό ν•©λ‹ˆλ‹€.

κ°€κΉŒμš΄ μž₯λž˜μ— 좜λ ₯ μŠ€νŠΈλ¦¬λ°μ„ μΆ”κ°€ν•  κ³„νšμ΄ μžˆμŠ΅λ‹ˆκΉŒ?

λ‚˜λŠ” 이것이 λͺ‡ 달 μ „μ΄λΌλŠ” 것을 μ•Œκ³  μžˆμ§€λ§Œ 이것이 바닐라 MPDμ—μ„œ μ „ν™˜ν•˜λŠ” 것을 λ§‰λŠ” μœ μΌν•œ κ²ƒμž…λ‹ˆλ‹€. μŠ€ν”Όμ»€κ°€ μ—°κ²°λ˜μ§€ μ•Šμ€ μ„œλ²„μ—μ„œ MPDλ₯Ό μ‹€ν–‰ν•˜κ³  집 μ•ˆνŒŽμ˜ λ‹€μ–‘ν•œ 컴퓨터/μž₯μΉ˜μ—μ„œ HTTP μŠ€νŠΈλ¦Όμ„ μ‘°μ •ν•©λ‹ˆλ‹€. Mopidyμ—μ„œ 이것을 보고 μ‹ΆμŠ΅λ‹ˆλ‹€. 그리고 그것이 이미 μžˆλ‹€λ©΄ μ˜¬λ°”λ₯Έ λ°©ν–₯으둜 μ €λ₯Ό κ°€λ¦¬μΌœ μ£Όμ‹­μ‹œμ˜€! μž μ‹œ λ™μ•ˆ μ„€λͺ…μ„œλ₯Ό μ½μ—ˆμ§€λ§Œμ΄ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 방법을 찾지 λͺ»ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

AFAIKλŠ” https://docs.mopidy.com/en/latest/config/#streaming -through-shoutcast-icecast에 λ¬Έμ„œν™”λœ Icecast 및 λͺ‡ 가지 ν•΄ν‚Ήκ³Ό κ²°ν•©ν•˜μ—¬ Mopidyμ—μ„œ μž‘λ™ν•˜λŠ” HTTP μŠ€νŠΈλ¦¬λ°μ„ 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

갭리슀 브랜치(#1288 μ°Έμ‘°)에 λŒ€ν•œ μž‘μ—…μ΄ 진행 쀑이며 λ‹€μŒ λΌμš΄λ“œμ˜ 갭리슀 κ°œμ„ κ³Ό ν•¨κ»˜ μŠ€νŠΈλ¦Όμ„ μœ μ§€ν•˜κΈ° μœ„ν•΄ ν•΄ν‚Ή 없이 Mopidy+Icecastκ°€ μž‘λ™ν•˜λ„λ‘ ν•΄μ•Ό ν•©λ‹ˆλ‹€.

저도 HTTP μŠ€νŠΈλ¦¬λ°μ— μ§„μ§€ν•œ 관심을 κ°–κ³  μžˆλ‹€λŠ” μ μ—μ„œ μ°¨μž„ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. 직μž₯μ—μ„œ λ‚΄ μ›Ή μ„œλ²„/VPN의 멋진 Moped μ›Ή μΈν„°νŽ˜μ΄μŠ€μ—μ„œ Spotifyλ₯Ό λ“£λŠ” 데 μ‚¬μš©ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. λ‘œμ»¬μ—μ„œ μ‹€ν–‰ν•˜κ³  μŒμ•…μ„ λ“€μ—ˆμ„ λ•Œ λ‹€μ†Œ ν™”κ°€ 났고 μ›κ²©μœΌλ‘œ μ‹€ν–‰ν•˜λ €κ³  ν•  λ•Œ μˆ˜λ§Žμ€ JACK 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. 더 λ‚˜μ€ μ½”λ”© 방법을 μ•ˆλ‹€λ©΄ 직접 μ‹œλ„ν•΄ λ³Ό κ²ƒμž…λ‹ˆλ‹€. 감사 ν•΄μš”!

@jodal #1288에 λŒ€ν•΄ μ–ΈκΈ‰ν•œ λ¬Έμ œκ°€ ν•΄κ²°λ˜μ—ˆμŠ΅λ‹ˆκΉŒ?

즉, λ¬Έμ„œμ˜ 이 뢀뢄을 μ œκ±°ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

ν˜„μž¬ MopidyλŠ” GStreamerμ—μ„œ νŠΈλž™ 끝과 슀트림 끝 μ‹ ν˜Έλ₯Ό μ˜¬λ°”λ₯΄κ²Œ μ²˜λ¦¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 이둜 인해 SHOUTcast 슀트림이 각 νŠΈλž™μ˜ λμ—μ„œ 연결이 λŠμ–΄μ Έ μƒλ‹Ήνžˆ μ“Έλͺ¨μ—†κ²Œ λ©λ‹ˆλ‹€. μžμ„Έν•œ λ‚΄μš©μ€ #492λ₯Ό μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€. μ•„λž˜μ— μ–ΈκΈ‰λœ ν•΄κ²° 방법을 μ‹œλ„ν•΄ λ³Ό μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

@JohnMaguire λ¬Έμ„œμ˜ μ–΄λ”˜κ°€μ— 링크λ₯Ό ν¬ν•¨ν•˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— μžŠμ–΄λ²„λ¦° μ„Ήμ…˜μ΄ μžˆλŠ”μ§€ μ—¬λΆ€λŠ” μ•Œ 수 μ—†μŠ΅λ‹ˆλ‹€. AFAIK λ¬Έμ„œμ˜ "개발" 버전은 2.0의 μ˜ˆμ •λœ λ³€κ²½ μ‚¬ν•­μœΌλ‘œ μ΅œμ‹  μƒνƒœμž…λ‹ˆλ‹€.

μ£„μ†‘ν•©λ‹ˆλ‹€: https://docs.mopidy.com/en/latest/config/#streaming -through-shoutcast-icecast

λ¬Έμ„œμ˜ 개발 λ²„μ „μ—μ„œ μ—…λ°μ΄νŠΈλœ 것 κ°™μŠ΅λ‹ˆλ‹€. μ •ν™•ν•©λ‹ˆλ‹€: https://docs.mopidy.com/en/develop/audio/#streaming -through-icecast

@jodalλ‹˜ κ°μ‚¬ν•©λ‹ˆλ‹€!

μ§€λ‚œ 2λ…„ λ™μ•ˆ μ—…λ°μ΄νŠΈκ°€ μžˆμŠ΅λ‹ˆκΉŒ?

μ§€λ‚œ 5λ…„ λ™μ•ˆ μ—…λ°μ΄νŠΈκ°€ μžˆμŠ΅λ‹ˆκΉŒ?

μ•„λ‹ˆμš”. IcecastλŠ” 졜고의 μ†”λ£¨μ…˜μœΌλ‘œ 남아 μžˆμŠ΅λ‹ˆλ‹€.

Mopidy 3의 μΌλΆ€λ‘œ hlssink2와 같은 HTTP μŠ€νŠΈλ¦¬λ°μ„ μœ„ν•œ λͺ‡ 가지 더 λ‚˜μ€ μ˜΅μ…˜μ„ μ œκ³΅ν•˜λŠ” GStreamer의 μ΅œμ†Œ 지원 버전을 μΆœμ‹œν–ˆμŠ΅λ‹ˆλ‹€. λˆ„κ΅¬λ“ μ§€ 이것을 μΆ”κ΅¬ν•˜λŠ” 데 관심이 μžˆλ‹€λ©΄ μ‹œμž‘ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

Snapcast λŠ” 또 λ‹€λ₯Έ μ†”λ£¨μ…˜μž…λ‹ˆλ‹€. λ©€ν‹°λ£Έ μž¬μƒμš©μœΌλ‘œ λ§Œλ“€μ–΄μ‘Œμ§€λ§Œ 단일 ν΄λΌμ΄μ–ΈνŠΈλ‘œ μŠ€νŠΈλ¦¬λ°ν•˜λŠ” 데에도 μ‚¬μš©ν•  수 μ—†λŠ” μ΄μœ λŠ” μ—†μŠ΅λ‹ˆλ‹€. λ‚˜λŠ” 그것을 ν…ŒμŠ€νŠΈν•˜μ§€ μ•Šμ•˜μ§€λ§Œ μœ λ§ν•΄ λ³΄μž…λ‹ˆλ‹€.

λ„€, μ €λŠ” μŠ€λƒ…μΊμŠ€νŠΈλ₯Ό μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€. fifo의 μ‚¬μš©μ€ μ•½κ°„ κΉŒλ‹€λ‘­κ³  μƒˆλ‘œμš΄ λŒ€μ²΄ 방법이 개발되고 μžˆμ—ˆμ§€λ§Œ λ§ˆμ§€λ§‰μœΌλ‘œ κ·Έ 방법에 자체 λ¬Έμ œκ°€ μžˆλ‹€λŠ” μ†Œμ‹μ„ λ“€μ—ˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ http 슀트리밍이 μ•„λ‹™λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰