0

我正在开发一个应用程序,该应用程序从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 中观察到了这种行为。

4

1 回答 1

0

我在这里向 Chromium 开发人员提交了错误报告:

https://code.google.com/p/chromium/issues/detail?id=281710

于 2013-08-29T18:14:40.103 回答