Django从Popen进程向StreamingHttpResponse发送内容长度

时间:2015-09-23 07:35:35

标签: django audio ffmpeg streaming

我需要提供从大wav文件实时创建的ogg文件。 我可以发送内容,但我不知道为什么要向StreamingHttpResponse指出数据的可变长度。

这是我的代码:

class OggAudioStreamer(object):

    def __init__(self, archivo):
        self.archivo = archivo

    def read(self, **kwargs):
        command = 'ffmpeg -i "{0}" -ac 1 -ar 22050 -acodec libvorbis -f ogg -'.format(self.archivo)
        args = split(command)
        response = Popen(args, stdout=PIPE, stderr=PIPE,
                         bufsize=8192, universal_newlines=False)
        response_iterator = iter(response.stdout.readline, b"")

        for resp in response_iterator:
            yield resp

def ogg_stream_response(request):
    data = OggAudioStreamer('SOME WAV FILE')
    stream = StreamingHttpResponse(data.read(), content_type='audio/ogg')
    return stream

1 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题,则需要在通过Content-Length流式传输回复时发送StreamingHttpResponse标题。如果是这种情况,则无法在StreamingHttpResponse文档中明确说明:

  

StreamingHttpResponse 只应在有的情况下使用   绝对要求以前不重复整个内容   将数据传输到客户端。因为内容不可能   访问,许多中间件无法正常运行。比如说   无法为流式传输生成 ETag Content-Length 标头   响应。

在我的想法中,在请求处理期间转码音频文件并不是一个好主意,因为你可以通过这种方式耗尽所有请求处理程序。相反,我会使用某种后台处理,例如Celery