我需要提供从大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
答案 0 :(得分:1)
如果我正确理解了您的问题,则需要在通过Content-Length
流式传输回复时发送StreamingHttpResponse
标题。如果是这种情况,则无法在StreamingHttpResponse文档中明确说明:
StreamingHttpResponse 只应在有的情况下使用 绝对要求以前不重复整个内容 将数据传输到客户端。因为内容不可能 访问,许多中间件无法正常运行。比如说 无法为流式传输生成 ETag 和 Content-Length 标头 响应。
在我的想法中,在请求处理期间转码音频文件并不是一个好主意,因为你可以通过这种方式耗尽所有请求处理程序。相反,我会使用某种后台处理,例如Celery。