我正在使用Node.js,Express(和connect)和fluent-ffmpeg。
我们希望通过http。
流式传输存储在Amazon S3上的音频文件除了我们想添加一个功能,即通过ffmpeg对流进行实时转换外,我们都在工作。
这很好用,问题是有些浏览器在实际获取文件之前会提前检查。
包含Range标头的传入请求,我们使用带有来自S3的所有信息的206回复,它有一个基本问题:我们需要事先知道文件的内容长度。
我们不知道因为它正在通过ffmpeg。
一种解决方案可能是在存储文件时(在特殊标题中)直接在S3上写出结果内容长度,但这意味着我们必须经历上传后编码队列的痛苦才知道未来请求的大小。 这也意味着如果我们改变压缩器或预设,我们必须再次经历这一切,所以它不是一个可行的解决方案。
我们还注意到Chrome和Safari请求音频标记src的方式存在很大差异,但这可能是另一个主题的讨论。
事实是,如果没有适当的内容长度标头响应,一切似乎都会中断或浏览器进入无限循环或快乐重启流。
想法?
答案 0 :(得分:2)
这似乎对我有用。
如果您能确认它是否也能在您的浏览器中提供预期效果,那就太棒了。
res.writeHead(200, {
'Transfer-Encoding': 'chunked'
, 'Content-Type': 'audio/mpeg'
, 'Accept-Ranges': 'bytes' //just to please some players, we do not actually allow seeking
});
基本上,您告诉浏览器您将使用分块编码进行流式传输。一个问题可能是某些浏览器不喜欢流式传输而不知道他们应该总共需要多少字节。