繁体   English   中英

无法使用 Shouty 在流媒体功能中播放多个 .mp3 文件

[英]Can't play multiple .mp3 files in streaming function using Shouty

我正在编写一些使用Shouty连接到 IceCast 服务器的Shouty 我的代码采用 .mp3 文件并使用 IceCast 将其流式传输到我制作的网络播放器。

from multiprocessing import Process, JoinableQueue
import queue
import subprocess
import os

from flask import Response
import shouty

class Worker(Process):
    def __init__(self):
        super().__init__()
        self.queue = JoinableQueue()
        self.is_mp3 = True

    def put_queue(self, mp3file):
        self.queue.put(mp3file)

    def join_queue(self):
        self.queue.join()

    def checkMP3(self):
    ''' Check files before streaming'''

    def go_Stream(self):
        with shouty.connect(**params) as connection:
            song_path = 0
            allfiles = os.listdir('app/')
            for i in allfiles:
                if i[:1] == "C":
                    song_path = i
                    return Response(self.streamStart(connection=connection, mp3file=song_path), mimetype="audio/mp3")

    def streamStart(self, connection, mp3file):
        with open('music/' + mp3file, 'rb') as song:
            ffmpeg = None
            src = song
            if self.is_mp3:
                ffmpeg = subprocess.Popen(
                    [   
                        "ffmpeg",
                        "-i",
                        "-",
                        "-f",
                        "mp3",
                        "-ab",
                        "192",
                        "-",
                    ],
                    stdin=song,
                    stdout=subprocess.PIPE,
                    stderr=subprocess.DEVNULL,
                )
                src = ffmpeg.stdout
            chunk_size = 4096
            sent_bytes = 0
            if src:
                while True:
                    chunk = src.read(chunk_size)
                    if not chunk:
                        return "Buffer Empty"
                    yield chunk
                    sent_bytes += len(chunk)
                src.close()
            if ffmpeg:
                ffmpeg.terminate()

    def run(self):
        checkMP3()

def run ():
    w = Worker()
    w.start()

在我用 Flask 设置的 HTML 页面中,网络播放器有一个触发go_Stream的播放按钮。 它有效,但它只播放 .mp3 文件之一,我不知道如何继续播放目录中的 .mp3 文件。 我应该有一些循环的地方, streamStart每一个.MP3文件吗?

我会让 HTML 播放器页面使用 jquery 之类的东西请求下一首歌曲并使用索引。 如果您修改为客户端提供歌曲的路由,以在索引处提供歌曲,用户也可以非常简单地跳过歌曲或返回到以前的歌曲,然后您的客户端和服务器端逻辑也可以更简单。

Python中的服务器端:在/songplayurl处等待获取请求,根据请求在所述请求中查找路径参数或表单参数,其中包含所需歌曲的索引,然后使用icecast播放该歌曲。

客户端:当在播放器上的下一个上一个按钮,用户点击,发送一个GET请求到服务器与参数指标+ 1或指数-1 / songplayurl。 此外,对于自动播放功能,使用播放器检测歌曲何时完成播放,然后对 index+1 发出新请求。

我建议这样做的原因是因为网络应用程序是客户端/服务器应用程序。 循环播放需要服务器发送事件来更改歌曲,或者您需要一次将所有歌曲的所有数据发送到客户端应用程序。 因此,无需花费大量精力来配置服务器发送的事件,也无需发送大量有效负载,只需一次发送一首歌曲的数据即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM