我正在开发一个应用程序,该应用程序从shoutcast/icecast 流(MP3 格式)中解析元数据并将音频无元数据中继到带有标签的网页
建筑学:
带有 Python 2.7 的 Windows 7
localhost:8080 -> Tornado 应用程序在 / 上提供音频播放器,在 /metadata 上提供元数据
localhost:8000 -> Python 套接字中继解析的流,没有 HTTP 标头,只有流数据
...
其他套接字连接到 discogs/gracenote api 以收集其他元数据
使用这样的音频标签:
<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
套接字处理看起来像这样,基本上它解析来自广播流的元数据并将 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 中观察到了这种行为。