我应该为流式音频使用哪种协议(非实时)?

2024-05-17 17:36:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试编写一个Python服务器,它将请求的mp3文件从头到尾进行流式处理。(无直播)
我想有功能播放流与任何媒体播放器(如VLC)和能够改变播放位置。在

{{a3/{a3}我听过很多关于流媒体的文章,但我听过很多关于流媒体的文章。在

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

我认为流式传输一个特定的媒体文件与流式传输类似网络广播的连续流没有太大区别,所以我在google上第一个webradio并下载了一个.pls或.m3u文件。
它们基本上都是包含url的文本文件。所以我启动了wireshark并将VLC指向了那个url。
我看到的基本上是HTTP流量:

VLC公司:

GET /schizoid HTTP/1.1

VLC公司:

^{pr2}$

服务器响应:

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流。在

According to Wikipedia这是SHOUTcast协议。
(我不确定这是不是冰播使用的协议)

但我认为封闭(not documented)协议不可能成为流媒体的标准。
所以我的问题是,将流媒体(特定的mp3文件)集成到python服务器中的最佳(最简单和最受支持)方法是什么?
我需要手动实现SHOUTcast协议还是像RTP这样的方法?
(我不介意使用第三方库)


Tags: 文件功能服务器httpurl协议流式mp3
1条回答
网友
1楼 · 发布于 2024-05-17 17:36:16

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

ICY 200 OK

不是HTTP/1.0,而是ICY。就这样!从那以后,它的行为是一样的。Web浏览器和大多数HTTP客户端都忽略了这一点。安卓系统和一些浏览器都被它扼杀了,但大多数都很好。Icecast的客户端流行为与SHOUTcast的相同,只是它实际上为其状态行返回HTTP/1.0 200 OK。在

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

如果在请求头中指定Icy-MetaData: 1,则行为会略有改变。在响应中,您将得到Icy-MetaInt: 8192或类似的。这意味着每8192个字节,就会有一个元数据块。有时该块只是0x00,这意味着没有元数据更新。其他时候会有一个类似0x01的字节。{16}你知道下一个{cd16}乘以这个值。我已经描述了the metadata in more detail in another post,如果你好奇的话。在

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

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

I'm trying to write a Python server that streams one requested mp3 file from start to end. (No live streaming)

HTTP就是你所需要的。实际上,不需要为此编写一些服务器。Apache/Nginx/随便什么都行。只是一个简单的HTTP服务器!如果您想按ID提供文件,那么Python就是从这里来的。写一些东西,然后根据这个ID从磁盘获取适当的资源。我不需要为此而使用RTSP。。。对于您需要的东西来说,这是太多的开销,而且您将损害客户机兼容性。在

I'd like to have the functionality to play that stream with any media player (like VLC) and be able to change playback position.

对于这个需求,只需确保您的服务器支持range requests。剩下的由客户负责。在

总结一下

  • SHOUTcast/Icecast服务器用于“直播”类广播流,所有客户机在(大致)同一时间获得相同的音频流
  • HTTP是最兼容的协议,用于向客户端传递任何内容,不管是否流式传输
  • RTSP/RTMP/RTP和所有相关的协议都是不必要的,除非您正在流式传输一个长时间运行或实时流,其中基于客户端带宽可用性的可变比特率非常重要。(这些协议还有其他特性,但这似乎是选择它们的决定因素。如果你想了解更多信息,我建议你仔细阅读。)

相关问题 更多 >