在没有Content-Length的情况下进行stream式传输

我正在使用Node.js,Express(和连接)和fluent-ffmpeg。

我们希望通过http传输存储在Amazon S3上的audio文件。

除了我们希望添加一个特性,即通过ffmpeg实时转换stream之外,我们所有的工作都正在进行。

这是行之有效的,问题是有些浏览器在实际获取文件之前提前检查。

包含Range头部的传入请求,我们用S3的所有信息回复206,有一个基本问题:我们需要事先知道文件的内容长度。

我们不知道,因为它正在经历ffmpeg。

一种解决scheme可能是在存储文件(在一个特殊的头文件中)时直接在S3上写出结果的内容长度,但这意味着我们必须经历上传之后让队列进行编码的痛苦,以便知道将来的大小要求。 这也意味着,如果我们改变压缩机或预设,我们必须经历这一切,所以这不是一个可行的解决scheme。

我们也注意到Chrome和Safari请求audio标签src的方式存在很大差异,但这可能是另一个话题的讨论。

事实是,如果没有一个合适的内容长度标题,响应一切似乎中断或浏览器进入一个无限循环或愉快地重新启动stream。

想法?

这似乎是为我工作。

如果你能确认它是否在你的浏览器中给出预期的结果,那将是非常好的。

res.writeHead(200, { 'Transfer-Encoding': 'chunked' , 'Content-Type': 'audio/mpeg' , 'Accept-Ranges': 'bytes' //just to please some players, we do not actually allow seeking }); 

基本上,你告诉浏览器你要使用分块编码进行stream式传输。 一个问题可能是某些浏览器不喜欢stream式传输,而不知道它们应该总共需要多less字节。