【问题标题】:Streaming mp3 files with django, read from a page with <audio>使用 django 流式传输 mp3 文件,使用 <audio> 从页面读取
【发布时间】:2010-12-11 00:14:49
【问题描述】:

我正在尝试制作一个小应用程序来使用 Web 界面流式传输我的 mp3 文件,我考虑过使用 django 在 python 中玩和做服务器端。

我想要像 /stream/ID 这样的 url 来流式传输与该 ID 对应的 mp3。 我在 django 中创建了一个视图,以使用不同的方法来提供这些文件,我尝试的最后一个是 here

如果我从 firefox 访问 /stream/ID,它会直接使用 firefox-totem 或类似的插件播放 mp3。如果我将该页面与我的音频播放器一起使用,其 url 与源相同,则它根本不起作用(与 apache 提供的 mp3 文件的链接一起使用)。

这是我的观点的代码(只发送一个测试文件)

def 流(请求):
    resp = HttpResponse(FileIterWrapper(open('/.../test.mp3',"rb")),mimetype='audio/mpeg')
    resp['Content-Length'] = os.path.getsize("/.../test.mp3")
    resp['Content-Disposition'] = 'filename=test.mp3'
    返回响应

我切断了完整的路径,这不是问题。

查看 django runserver 输出时,我注意到每次音频播放器尝试时,都会出现这 2 个错误,

Traceback(最近一次调用最后一次):
  运行中的文件“/usr/lib/pymodules/python2.6/django/core/servers/basehttp.py”,第 281 行
    self.finish_response()
  文件“/usr/lib/pymodules/python2.6/django/core/servers/basehttp.py”,第 321 行,finish_response
    self.write(数据)
  文件“/usr/lib/pymodules/python2.6/django/core/servers/basehttp.py”,第 417 行,写入
    self._write(数据)
  文件“/usr/lib/python2.6/socket.py”,第 318 行,写入
    self.flush()
  文件“/usr/lib/python2.6/socket.py”,第 297 行,刷新
    self._sock.sendall(缓冲区(数据,write_offset,buffer_size))
错误:[Errno 104] 对等方重置连接
--------------------------------------
处理来自 ('127.0.0.1', 42891) 的请求时发生异常
回溯(最近一次通话最后):
  _handle_request_noblock 中的文件“/usr/lib/python2.6/SocketServer.py”,第 283 行
    self.process_request(request, client_address)
  文件“/usr/lib/python2.6/SocketServer.py”,第 309 行,在 process_request 中
    self.finish_request(request, client_address)
  文件“/usr/lib/python2.6/SocketServer.py”,第 322 行,在 finish_request
    self.RequestHandlerClass(request, client_address, self)
  __init__ 中的文件“/usr/lib/pymodules/python2.6/django/core/servers/basehttp.py”,第 562 行
    BaseHTTPRequestHandler.__init__(self, *args, **kwargs)
  __init__ 中的文件“/usr/lib/python2.6/SocketServer.py”,第 618 行
    self.finish()
  文件“/usr/lib/python2.6/SocketServer.py”,第 661 行,完成
    self.wfile.flush()
  文件“/usr/lib/python2.6/socket.py”,第 297 行,刷新
    self._sock.sendall(缓冲区(数据,write_offset,buffer_size))
错误:[Errno 32] 管道损坏

当我直接访问流 URL 时没有问题/错误。

我在 chromium 中尝试过同样的方法(最新版本,安装了 ffmpeg-extra),它适用于 apache 的 mp3,但使用流 url 时会超时。

我尝试在响应中设置不同的标题,但没有成功。 我目前正在设置内容长度、内容类型和内容处置

我正在寻找新的想法来尝试。

感谢您的帮助!

【问题讨论】:

    标签: python django audio-streaming


    【解决方案1】:

    您可以尝试使用wireshark 来观察您的浏览器/媒体播放器/apache 是否正常工作。

    【讨论】:

    • 感谢您的回答。由于某种原因,流媒体现在可以工作,可能是一些缓存问题。我仍然在python中遇到错误,所以我猜它来自浏览器为获取文件头并尝试恢复的请求。如果我看到可以解释它的东西,我会用wireshark看。无论如何感谢您的建议。
    • 你找到解决这个问题的办法了吗
    猜你喜欢
    • 2015-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    相关资源
    最近更新 更多