Mopidy: Tambahkan dukungan untuk streaming keluaran audio HTTP

Dibuat pada 19 Jan 2011  ·  15Komentar  ·  Sumber: mopidy/mopidy

Jika seseorang menyediakan aliran audio yang dimainkan oleh Mopidy melalui HTTP, itu dapat digunakan oleh kedua klien MPD dengan dukungan untuk aliran HTTP dan perangkat seperti misalnya Squeezeboxes .

Encoding aliran mungkin harus Ogg Vorbis dan/atau MP3.

C-enhancement A-audio

Komentar yang paling membantu

apa ada update dalam 2 tahun terakhir?

Semua 15 komentar

Dengan asumsi kode berikut:

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)

di mana register_fd_with_output() adalah fungsi yang memancarkan sinyal tambah pada sink fd di HTTPOutput ( audioconvert ! lame ! multifdsink ) dan kami memiliki BaseHTTPServer.HTTPServer berjalan di ThreadingActor dengan StreamingHTTPRequestHandler kita seharusnya memiliki streaming HTTP yang berfungsi.

Untuk fitur tambahan seperti metadata, tautan berikut akan berguna:

Kode di atas mungkin tidak boleh digunakan untuk memecahkan masalah ini. Dengan keadaan basis kode saat ini, kami menginginkan sesuatu yang dibangun di atas cherrypy.

Hal pertama yang perlu dilakukan adalah membuat dan mendaftarkan elemen GStreamer yang dapat kita gunakan di pengaturan OUTPUT . Dengan menggunakan mixer, kode pada contoh #152 atau Pitivi seharusnya sudah cukup untuk memulai. Elemen pada dasarnya akan membungkus multifdsink , menangani hal-hal cherrypy dan meneruskan FD di antara mereka.

Adapun bagian HTTP, setidaknya ada cara untuk melakukannya. Yang pertama mungkin yang paling mudah, mulai server cherrypy independen ke frontend dan gunakan itu. Yang kedua, yang menurut saya kita inginkan adalah memiliki server HTTP tunggal yang dibagikan antara bagian depan dan bagian streaming dari kode. Bagian ini saat ini tidak diketahui besar sejauh yang saya ketahui.

Setelah server HTTP terpasang, kita perlu melepaskan soket dari cherrypy, melihat ws4py tampaknya pengaturan request.rfile.rfile._sock = None adalah solusi yang paling mungkin dapat kita kelola. Sebelum kita melepaskan kita mungkin ingin memancarkan beberapa header, kemudian kita melepaskan dan memancarkan fd ke wastafel dan kita harus streaming. Melihat bagaimana ws4py mengambil alih soket seharusnya memungkinkan kita untuk mengetahui detailnya.

Bagian lain yang sedikit tidak diketahui adalah jika kami memperluas API audio inti kami untuk memungkinkan memancarkan FD. Itu adalah sesuatu yang khusus untuk kasus itu atau sesuatu yang lebih umum yang memberikan akses ke nampan keluaran yang kita gunakan.

Mengapa saya tidak pernah memikirkan ini sebelumnya saya tidak tahu, tetapi untuk mencuri soket, kita hanya perlu socket.fromfd untuk membuat salinan baru sehingga yang asli dapat ditutup tanpa efek buruk.

Apakah ada rencana untuk menambah output streaming dalam waktu dekat?

Saya tahu ini sudah berbulan-bulan, tetapi ini adalah satu-satunya hal yang menahan saya untuk beralih dari vanilla MPD. Saya menjalankan MPD di server saya, yang tidak memiliki speaker yang terpasang, dan mendengarkan aliran HTTP dari berbagai komputer/perangkat di sekitar rumah dan di tempat lain. Saya akan senang melihat ini di Mopidy. Dan jika sudah ada, tolong arahkan saya ke arah yang benar! Telah membaca manual untuk sementara waktu dan sepertinya tidak dapat menemukan cara untuk membuatnya berfungsi.

AFAIK dimungkinkan untuk menjalankan streaming HTTP dari Mopidy dengan menggabungkannya dengan Icecast dan beberapa peretasan, didokumentasikan di https://docs.mopidy.com/en/latest/config/#streaming -through-shoutcast-icecast

Pekerjaan sedang berlangsung di cabang tanpa celah (lihat #1288) yang bersama dengan putaran perbaikan tanpa celah berikutnya akan membuat Mopidy+Icecast bekerja tanpa peretasan untuk menjaga aliran tetap hidup.

Hanya ingin berpadu bahwa saya juga memiliki minat serius pada HTTP Streaming. Saya ingin menggunakannya untuk mendengarkan Spotify di antarmuka web Moped yang mengagumkan, dari server web/VPN saya, di tempat kerja. Agak kesal ketika saya menjalankannya secara lokal dan mendengar musik, kemudian mendapat banyak kesalahan JACK ketika saya mencoba menjalankannya dari jarak jauh. Jika saya tahu cara membuat kode dengan lebih baik, saya akan mencobanya sendiri. Terima kasih!

@jodal Apakah masalah yang Anda sebutkan mengenai #1288 terselesaikan?

yaitu Dapatkah bagian dokumentasi ini dihapus?

Saat ini, Mopidy tidak menangani pensinyalan end-of-track vs end-of-stream di GStreamer dengan benar. Hal ini menyebabkan aliran SHOUTcast terputus di akhir setiap trek, menjadikannya sangat tidak berguna. Untuk detail lebih lanjut, lihat #492. Anda juga dapat mencoba solusi yang disebutkan di bawah ini.

@JohnMaguire Saya tidak tahu jika ada bagian di suatu tempat di dokumen yang kami lupakan karena Anda tidak menyertakan tautan. AFAIK versi "kembangkan" dari dokumen terbaru dengan perubahan yang akan datang di 2.0.

Maaf: https://docs.mopidy.com/en/latest/config/#streaming -through-shoutcast-icecast

Tampaknya telah diperbarui dalam versi pengembangan dokumen, Anda benar: https://docs.mopidy.com/en/develop/audio/#streaming -through-icecast

Terima kasih @jodal!

apa ada update dalam 2 tahun terakhir?

ada pembaruan dalam 5 tahun terakhir?

Tidak. Icecast tetap menjadi solusi terbaik.

Sebagai bagian dari Mopidy 3, kami menemukan versi minimum GStreamer yang didukung yang membuka beberapa opsi yang lebih baik untuk streaming HTTP, misalnya hlssink2. Jika ada yang tertarik untuk mengejar ini maka itu mungkin tempat yang baik untuk memulai.

Snapcast adalah solusi lain. Itu dibuat untuk pemutaran multi-ruangan, tetapi saya tidak melihat alasan apa pun itu tidak dapat digunakan untuk streaming ke satu klien juga. Saya belum mengujinya, tetapi tampaknya menjanjikan.

Ya, saya telah menggunakan snapcast. Penggunaan fifo agak rumit dan metode alternatif baru sedang dikembangkan tetapi terakhir saya mendengar bahwa metode itu datang dengan masalahnya sendiri. Perhatikan juga bahwa ini bukan streaming http.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat