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

我们希望通过 http 流式传输存储在 Amazon S3 上的音频文件。

我们都在工作,除了我们想添加一个功能,通过 ffmpeg 对流进行即时转换。

这运行良好,问题在于某些浏览器在实际获取文件之前会提前检查。

包含 Range header 的传入请求,我们使用来自 S3 的所有信息回复 206,有一个基本问题:我们需要提前知道文件的内容长度。

我们不知道,因为它正在通过 ffmpeg。

一种解决方案可能是在存储文件时直接在 S3 上写出结果内容长度(在一个特殊的 header 中),但这意味着我们必须经历上传后排队进行编码的痛苦才能知道 future 的大小要求。
这也意味着如果我们更改压缩器或预设,我们必须重新进行所有这些操作,因此这不是一个可行的解决方案。

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

事实是,如果没有适当的内容长度 header 作为响应,一切似乎都会中断,或者浏览器进入无限循环或愉快地重新启动流。

想法?

最佳答案

这似乎对我有用。

如果您能确认它是否也在您的浏览器中给出了预期的结果,那就太好了。

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

基本上,您告诉浏览器您将使用分块编码进行流式传输。一个问题可能是某些浏览器不喜欢流式传输而不知道他们总共应该期望多少字节。

关于html - 没有 Content-Length 响应的流式传输,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7236097/

10-09 22:26