编写Python音乐流媒体

AJ.*_*AJ. 23 python streaming mp3 http shoutcast

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

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

ʇsә*_*ɹoɈ 36

mp3格式是专为流媒体设计的,这使得一些事情比你想象的更简单.数据本质上是具有内置边界标记的音频帧流,而不是文件头,后跟原始数据.这意味着一旦客户端期望接收音频数据,您就可以开始从现有mp3源中的任何点发送字节,无论是实时还是文件,客户端将同步到它找到的下一帧,开始播放音频.好极了!

当然,您必须为客户提供设置连接的方法.事实上的标准是SHOUTcast(ICY)协议.这与HTTP非常相似,但是状态和头字段的区别不同,它与Python的内置http服务器库不直接兼容.您可能能够让这些库为您完成一些工作,但是他们记录的接口不足以完成它; 你必须阅读他们的代码,以了解如何让他们说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这样的库将为您提供非常好的I/O性能,同时允许您以一种非常容易理解的方式构建代码.在python 3中,我更喜欢asyncio协同程序.