我想在Python中实现一个服务器,该服务器通过HTTP流化MP3格式的音乐。我希望它播放音乐,以便客户端可以连接到流并开始收听当前正在播放的内容,就像广播电台一样。
以前,我已经使用SocketServer.TCPServer在Python中实现了自己的HTTP服务器(是的,我知道BaseHTTPServer存在,只是想自己编写一个微型HTTP堆栈),那么音乐流媒体在架构上会有什么不同?我需要在网络端和MP3端查看哪些库?
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协程。