Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编写Python音乐拖缆_Python_Http_Streaming_Mp3_Shoutcast - Fatal编程技术网

编写Python音乐拖缆

编写Python音乐拖缆,python,http,streaming,mp3,shoutcast,Python,Http,Streaming,Mp3,Shoutcast,我想用Python实现一个服务器,通过HTTP以MP3格式传输音乐。我希望它能够播放音乐,这样客户端就可以连接到流并开始收听当前播放的任何内容,就像广播电台一样 以前,我使用SocketServer.TCPServer在Python中实现了我自己的HTTP服务器(是的,我知道BaseHTTPServer存在,只是想自己编写一个迷你HTTP堆栈),那么音乐流在体系结构上会有什么不同呢?我需要在网络端和MP3端查看哪些库?您需要查看服务或文件。这将为您提供一种文件格式,播放器可以很好地理解该格式,以

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


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

您需要查看服务或文件。这将为您提供一种文件格式,播放器可以很好地理解该格式,以便在http服务器上查找mp3文件

最小的m3u文件只是一个简单的文本文件,每行有一个歌曲url。假设您的服务器上有以下可用URL:

/playlists/<playlist_name/playlist_id>
/songs/<song_name/song_id>
资源的内容应该是:

/songs/1
/songs/mysong.mp3
播放器(如Winamp)将能够打开HTTP服务器上m3u文件的URL,然后开始播放列表中的第一首歌曲。要支持这一点,您所要做的就是像提供任何其他静态内容一样提供mp3文件


根据您要支持的客户端数量,您可能希望使用类似于支持大量同步流的库来研究异步IO。

在深入研究这些问题之前:

具体地


您需要一个指向静态URI(例如)的.m3u或.pls文件,然后在他们要求该文件时,从歌曲中的任何位置开始向他们提供mp3数据。也许这里有一些小问题我正在讨论……但是,至少正如forest所指出的,您可以从任何字节开始流式传输mp3数据。

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

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

以下是一些让您开始学习的链接:

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

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


至于建筑,这个领域是非常开放的。您的选项与HTTP服务器的选项一样多。螺纹?工作进程?事件驱动?这取决于你。对我来说,更有趣的问题是如何与服务于多个输出流(播放机)的网络处理程序共享来自单个输入流(播放机)的数据。为了避免IPC和同步复杂性,我可能会从单线程事件驱动设计开始。在Python2中,一个类似的库将为您提供一个方便,同时允许您以一种非常容易理解的方式构造代码。在python 3中,我更喜欢异步协同路由。

因为您已经有了很好的python经验(假设您已经编写了一个HTTP服务器),我只能提供一些关于如何扩展您已经完成的基础工作的建议:

  • 准备好服务器以处理请求头,例如:
    Accept Encoding
    Range
    TE(传输编码)
    ,等等。MP3 over HTTP播放器(即VLC)只不过是一个MP3播放器,它知道如何“说出”HTTP并“寻找”文件中的不同位置

  • 通过HTTP播放mp3时,使用wireshark或tcpdump来嗅探VLC执行的实际HTTP请求,这样您就知道将如何接收和实现哪些请求头


祝你的项目好运

你希望VLC这样的东西能够链接到流中,还是只需要编写自己的客户端代码?@thenoviceof-好问题,是的,我希望“主流”客户端能够连接。iTunes、Winamp、VLC等。你是在实时压缩音频还是在流式传输预先创建的MP3文件?@raksice-我只是对流式传输预先创建的压缩音频感兴趣。这听起来很像我喜欢的SHOUTcast()。我的问题是:如何使它工作,使“播放列表”文件只是一个指向“流”的通用URL,而不是一个特定的mp3文件?即使URL是“/somefile.mp3”,我也不想为每首歌生成一个播放列表。相反,我希望它是一个连续不断的歌曲/商业广告等,就像一个广播电台。事实上,这是一个很好的例子。广播电台如何从他们的网站上做到这一点,你可以在那里收听他们的直播?我假设他们只是继续将音频内容写入客户端http连接。没有理由认为给定的URL不能表示无限的数据流。如果不关闭连接,客户端将停止连接
/songs/1
/songs/mysong.mp3