gpt4 book ai didi

python - 编写 Python 音乐流媒体

转载 作者:IT老高 更新时间:2023-10-28 20:32:57 25 4
gpt4 key购买 nike

我想用 Python 实现一个服务器,通过 HTTP 流式传输 MP3 格式的音乐。我希望它能够广播音乐,以便客户端可以连接到流并开始收听当前正在播放的任何内容,就像广播电台一样。

以前,我使用 SocketServer.TCPServer 在 Python 中实现了我自己的 HTTP 服务器(是的,我知道 BaseHTTPServer 存在,只是想自己编写一个迷你 HTTP 堆栈),那么音乐流媒体在架构上会有什么不同呢?我需要在网络端和 MP3 端查看哪些库?

最佳答案

mp3 格式专为流式传输而设计,这使得一些事情比您预期的要简单。数据本质上是 audio frames 的流使用内置边界标记,而不是文件头后跟原始数据。这意味着一旦客户端期望接收音频数据,您可以从现有 mp3 源中的任何点开始向其发送字节,无论是实时的还是文件,客户端将同步到它找到的下一帧和开始播放音频。耶!

当然,您必须为客户端提供一种建立连接的方法。事实上的标准是 SHOUTcast (ICY) 协议(protocol)。这与 HTTP 非常相似,但状态和 header 字段的不同之处在于它与 Python 的内置 http 服务器库不直接兼容。您也许可以让这些库为您完成一些工作,但它们的文档化接口(interface)不足以完成它;您必须阅读他们的代码才能了解如何让他们说 SHOUTcast。

以下是一些帮助您入门的链接:

http://forums.winamp.com/showthread.php?threadid=70403

http://forums.radiotoolbox.com/viewtopic.php?t=74

http://www.smackfu.com/stuff/programming/shoutcast.html

http://en.wikipedia.org/wiki/Shoutcast

我建议从单个 mp3 文件开始作为您的数据源,让客户端-服务器连接设置和播放正常工作,然后继续处理实时源、多编码比特率、带内元数据和播放列表等问题。

播放列表通常是 .pls 或 .m3u 文件,本质上只是指向直播 URL 的静态文本文件。它们并不困难,甚至不是绝对必要的,因为许多(大多数?)mp3 流媒体客户端将接受根本没有播放列表的直播 URL。

至于建筑,这个领域非常开放。您有与 HTTP 服务器一样多的选项。线程?工作进程?事件驱动?由你决定。对我来说,更有趣的问题是如何与服务于多个输出流的网络处理程序(播放器)共享来自单个输入流(广播器)的数据。为了避免 IPC 和同步的复杂性,我可能会从单线程事件驱动设计开始。在 python 2 中,像 gevent 这样的库会给你very good I/O performance同时允许您以非常易于理解的方式构建代码。在 python 3 中,我更喜欢 asyncio 协程。

关于python - 编写 Python 音乐流媒体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5688573/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com