编写Python Music Streamer

| 我想在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协程。     
由于您已经具有良好的python经验(假设您已经编写了HTTP服务器),因此我只能提供一些有关如何扩展已经完成的基础工作的指针: 准备服务器以处理诸如“ 0”,“ 1”,“ 2”等请求标头。MP3-over-HTTP播放器(即VLC)不过是知道如何“讲” HTTP和“寻求”的mp3播放器。 ”到文件中的不同位置。 通过HTTP播放mp3时,使用wireshark或tcpdump嗅探VLC完成的实际HTTP请求,因此您知道将接收和实现哪些请求标头。 祝您项目顺利!     
您需要研究提供m3u或pls文件。那应该给您一种文件格式,让播放器足够理解,可以击中您的http服务器以查找mp3文件。 最小的m3u文件只是一个简单的文本文件,每行只有一个歌曲url。假设您的服务器上有以下URL:
/playlists/<playlist_name/playlist_id>
/songs/<song_name/song_id>
您可以通过网址提供播放列表:
/playlists/myfirstplaylist
该资源的内容将仅仅是:
/songs/1
/songs/mysong.mp3
播放器(例如Winamp)将能够在HTTP服务器上打开指向m3u文件的URL,然后开始流式播放播放列表中的第一首歌曲。支持该功能所需要做的就是提供mp3文件,就像提供其他静态内容一样。 根据要支持的客户端数量,您可能希望使用Twisted之类的库来查看异步IO,以支持大量的同时流。     
在深入之前研究这些: http://wiki.python.org/moin/PythonInMusic 特别 http://edna.sourceforge.net/     
您将需要一个指向静态URI的.m3u或.pls文件(例如http://example.com/now_playing.mp3),然后在他们要求时从歌曲中的任意位置开始向他们提供mp3数据该文件。我可能在这里掩盖了许多小问题...但是,至少正如森林指出的那样,您可以开始从任何字节流式传输mp3数据。     

要回复问题请先登录注册