我正在开发一个解析shoutcast / icecast流(MP3格式)元数据的应用程序,并将音频sans-metadata中继到带有标签的网页
架构:
Windows 7 w / Python 2.7
localhost:8080 - > Tornado应用程序提供音频播放器和/元数据/元数据
localhost:8000 - > Python套接字中继解析流w / NO HTTP头,只流数据
...
其他套接字连接到discogs / gracenote apis以收集其他元数据
使用这样的音频标签:
<audio id="stream" preload="none" src="http://localhost:8000"></audio>
我希望能够在浏览器中听到流,并限制浏览器只向我的服务器发送一个连接。它可以工作,但是当我刷新页面时,浏览器将像往常一样开始缓冲流,然后通过发送RST数据包突然取消连接。
在python后端,我在套接字处理的主循环中收到以下错误:
error: [Errno 10053] An established connection was aborted by the software in your host machine
套接字处理看起来像这样,基本上它解析shoutcast流中的元数据并将mp3数据发送回客户端:
while self.running:
data = ''
for i in range(bytes):
data += self.s_stream_in.recv(1)
print "sending..."
self.conn.sendall(data)
length = ord(self.s_stream_in.recv(1)) * 16
if length > 0:
data = self.s_stream_in.recv(length)
in_queue.put(data)
bytes = metaint
我在python后端代码中尝试了各种各样的东西来防止这些RST发生,包括设置各种套接字标志并确保没有防火墙/防病毒软件干扰连接。然后我决定使用音频标签中的原始源流来查看它是否有相同的问题。添加分号以告诉shoutcast发送流而不是Web界面。
<audio id="stream" preload="none" src="http://streamerepsilon.jazz.fm:8000/;"></audio>
惊喜,惊喜!原始流表现出相同的行为:与mp3流的初始连接工作正常,但是当页面刷新时,RST数据包被发送到流服务器。我在Chrome中观察到了这种行为。