我应该使用哪种协议来传输音频(不是直播)?

Ans*_*gar 6 python streaming http audio-streaming

我正在尝试编写一个Python服务器,从头到尾流式传输一个请求的mp3文件.(没有直播)
我希望能够使用任何媒体播放器(如VLC)播放该流,并能够改变播放位置.

我听说过很多关于HTTP Streaming的内容,但在阅读了一些维基百科文章之后,在我看来,"HTTP Streaming"只是不同流媒体协议(如RTSP/RTCP/RTP)的总称.

然后我遇到了SHOUTcast,这是一个使用自己的协议的流媒体的专有软件(服务器!).另一个似乎提供类似功能的现有服务器程序是Icecast.
我不太确定SHOUTcast和Icecast之间的关系,但似乎有一个.

我认为流式传输一个特定的媒体文件与流式传输连续流如网络广播不同,所以我搜索了第一个webradio并下载了.pls或.m3u文件.
两者基本上都是包含网址的文本文件.所以我开始使用wireshark并将VLC指向该URL.
我看到的主要是HTTP流量:

VLC:

GET /schizoid HTTP/1.1
Run Code Online (Sandbox Code Playgroud)

VLC:

Host: <ip>:8000
User-Agent: VLC/2.0.5 LibVLC/2.0.5
Range: bytes=0-
Connection: close
Icy-MetaData: 1
Run Code Online (Sandbox Code Playgroud)

服务器响应:

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
Run Code Online (Sandbox Code Playgroud)

然后服务器开始发送原始数据,这似乎是mp3流.

根据维基百科,这是SHOUTcast协议.
(我不确定这是否与Icecast使用的协议相同)

但我认为一个封闭的(未记录的)协议不可能成为流媒体的标准.
所以我的问题是将流媒体(特定的mp3文件)集成到python服务器中的最佳(最简单和最好的支持)方式是什么?
我是否必须手动实施SHOUTcast协议,或者像RTP一样的方式?
(我不介意使用第三方库)

Bra*_*rad 5

SHOUTcast客户端协议实际上与HTTP/1.0相同.唯一相关的区别是响应状态行:

ICY 200 OK
Run Code Online (Sandbox Code Playgroud)

而不是HTTP/1.0,你得到ICY.真的是这样的!从那里,它的行为相同.Web浏览器和大多数HTTP客户端忽略了这一点.Android上扼杀它和一些浏览器,但大多数都很好.Icecast的客户端流行为与SHOUTcast相同,只是它实际返回HTTP/1.0 200 OK其状态行.

现在,您已经注意到这些响应标头中有一些带有流信息的额外标头.除了一个之外的所有信息都只是额外的信息,对您要获取的数据没有任何影响.如果您没有请求元数据,那么服务器除了从源发送到它的每个字节之外什么都不做,并将其中继到每个客户端(也有一个小的服务器端缓冲区).

如果在您的请求标头中指定了Icy-MetaData: 1,那么行为会略有变化.在回复中,您将获得Icy-MetaInt: 8192或类似.这意味着每8,192个字节,就会有一大块元数据.有时,这个块只是0x00意味着没有元数据更新.其他时候会有像这样的字节0x01.如果将该值乘以16,则您知道接下来的16个字节将是ASCII元数据,例如StreamTitle: 'My Stream';StreamUrl='';,填充0x00.如果你很好奇,我在另一篇文章中更详细地描述了元数据.

所有这一切都说,最流行的流媒体协议实际上是HTTP,而SHOUTcast/Icecast /许多其他服务器都添加了一个请求标头,您可以在其中将元数据交错到流中.不请求元数据的HTTP客户端只会获得常规的MP3流,浏览器认为这只是某个文件.毕竟,浏览器并不关心你如何获取数据.

现在,您应该使用什么?您的要求:

我正在尝试编写一个Python服务器,从头到尾流式传输一个请求的mp3文件.(没有直播)

HTTP就是你所需要的.实际上,没有必要为此编写一些服务器.Apache/Nginx /什么都可以正常工作.只是一个简单的HTTP服务器!如果你想通过ID提供文件,那就是你的Python所在的位置.根据该ID,写一些内容并从磁盘中获取适当的资源.我不打算使用RTSP ...这对你需要的东西来说太多了,你将损害客户端的兼容性.

我希望能够使用任何媒体播放器(如VLC)播放该流,并能够改变播放位置.

对于该要求,只需确保您的服务器支持范围请求.客户将负责其余的事情.

总结这一切

  • SHOUTcast/Icecast服务器用于"实时"无线电流,所有客户端在(大致)同时获得相同的音频流
  • HTTP是最兼容的协议,用于向客户端提供任何内容,无论是否流式传输
  • RTSP/RTMP/RTP和所有相关协议不是必需的,除非您正在传输长时间运行或实时流,其中基于客户端带宽可用性的可变比特率很重要.(这些协议还有其他功能,但这似乎是选择它们的决定性因素.如果你想要更多信息,我建议你阅读每一个.)