[英]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.