我正在尝试编写一个 Python 服务器,从头到尾传输一个请求的 mp3 文件。 (无直播)
我希望能够使用任何媒体播放器(如 VLC)播放该流并能够更改播放位置。
我听说过很多关于 HTTP Streaming 的内容,但在阅读了一些维基百科文章后,在我看来,“HTTP Streaming”只是不同流协议的总称,例如RTSP https://en.wikipedia.org/wiki/Real_Time_Streaming_Protocol/RTCP https://en.wikipedia.org/wiki/RTP_Control_Protocol/RTP https://en.wikipedia.org/wiki/Real-time_Transport_Protocol.
然后我遇到了喊话广播 https://en.wikipedia.org/wiki/Shoutcast这是使用自己的协议的流媒体专有软件(服务器!)。另一个现有的服务器程序似乎提供类似的功能是Icecast https://en.wikipedia.org/wiki/Icecast.
我不太确定 SHOUTcast 和 Icecast 之间的关系,但似乎有一种关系。
我认为流式传输一个特定的媒体文件与流式传输网络广播等连续流没有什么不同,所以我在谷歌上搜索了第一个网络广播并下载了 .pls 或 .m3u 文件。
两者基本上都是包含 url 的文本文件。所以我启动了wireshark并将VLC指向该url。
我看到的本质上是 HTTP 流量:
VLC:
GET /schizoid HTTP/1.1
VLC:
Host: <ip>:8000
User-Agent: VLC/2.0.5 LibVLC/2.0.5
Range: bytes=0-
Connection: close
Icy-MetaData: 1
服务器响应:
HTTP/1.0 200 OK
Content-Type: audio/mpeg
icy-br:128
ice-audio-info: bitrate=128
icy-br:128
icy-description:PsyTrance 24x7
icy-genre:psytrance
icy-name:Radio Schizoid
icy-pub:1
icy-url:http://schizoid.in:8000/schizoid
Server: Icecast 2.3.2
Cache-Control: no-cache
icy-metaint:16000
然后服务器开始发送原始数据,这似乎是 mp3 流。
根据维基百科 https://en.wikipedia.org/wiki/Shoutcast#History这就是 SHOUTcast 协议。
(我不确定这是否与 Icecast 使用的协议相同)
但我想到了一个封闭的(没有记录 http://www.smackfu.com/stuff/programming/shoutcast.html)协议不可能成为流媒体的标准。
所以我的问题是将流媒体(特定的 mp3 文件)集成到 python 服务器中的最佳(最简单和最好支持)方法是什么?
我是否必须手动实施 SHOUTcast 协议,还是使用 RTP 之类的协议?
(我不介意使用第三方库)