Jon*_*Ong 4 audio streaming stream audio-streaming node.js
快速版:Content-Range当不知道体长时如何发送正确的标题?
我有一个FLAC文件.我想将其转码为MP3并立即将其流式传输给用户.到目前为止我有这样的事情:
function transcode(file) {
var spawn = require('child_process').spawn
var decode = spawn('flac', [
'--decode',
'--stdout',
file
])
var encode = spawn('lame', [
'-V0',
'-',
'-'
])
decode.stdout.pipe(encode.stdin)
return encode
}
var express = require('express')
var app = express()
app.get('/somefile.mp3', function (req, res) {
res.setHeader('Accept-Ranges', 'bytes')
res.setHeader('Content-Range', 'bytes')
res.setHeader('Content-Type', 'audio/mpeg')
transcode(file).stdout.pipe(res)
})
Run Code Online (Sandbox Code Playgroud)
这按预期工作,但它是"流式",所以我不能跳过.显然我需要做些Content-Range什么.使用:https://github.com/visionmedia/node-range-parser
function sliceStream(start, writeStream, readStream) {
var length = 0
var passed = false
readStream.on('data', function (buf) {
if (passed) return writeStream.write(buf);
length += buf.length
if (length < start) return;
passed = true
writeStream.write(buf.slice(length - start))
})
readStream.on('end', function () {
writeStream.end()
})
}
var parseRange = require('range-parser')
app.get('/somefile.mp3', function (req, res) {
var ranges = parseRange(Infinity, req.headers['range'])
if (ranges === -1 || ranges === -2) return res.send(400);
var start = ranges[0].start
res.setHeader('Accept-Ranges', 'bytes')
res.setHeader('Content-Type', 'audio/mpeg')
if (!start) {
res.setHeader('Content-Range', 'bytes')
transcode(file).stdout.pipe(res)
return
}
res.setHeader('Content-Range', 'bytes ' + start + '-')
sliceStream(start, transcode(file).stdout, res)
})
Run Code Online (Sandbox Code Playgroud)
这就是我被困住的地方.由于我没有等到整首歌被编码,我不知道这首歌的大小.由于我刚刚在Chrome中获得"取消",因此我假设Content-Range标题格式不正确而没有大小.
另外,我现在只是在我的浏览器中打开这首歌,所以我认为它使用了该<audio>元素.
建议?
是的,Content-Range没有大小,您的标题会出错.但是,您可以尝试发送服务器已经转码的当前大小.虽然我怀疑Chrome会优雅地处理不断变化的尺寸......
206 Partial Content状态(可能这是由库处理,不确定).0-,但其他浏览器会发送.事实上,有些人可能会在一个请求中发送多个范围(支持中的诅咒).Content-Range响应标头,因为您还没有包含您要发送的内容的结束索引.它应该如下所示:Content-Range: bytes 0-2048/3980841416 Requested Range Not Satisfiable状态响应.编辑:我没有测试过这种特殊情况,但是如果你是从FLAC转码到192kbps的CBR MP3,我想如果你发送一个稍微不准确的内容长度(关闭),只会有一组限制可能性小于1000位):
Content-Range您最初响应的范围之外的范围,直到您关闭连接或发送416状态.<audio>抛出一个MEDIA_ERR_NETWORK或者MEDIA_ERR_DECODE您只需要优雅处理的错误.(在这种情况下,音频仍将被裁剪.)| 归档时间: |
|
| 查看次数: |
5286 次 |
| 最近记录: |