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协程。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)