我想使用Koa2流式传输支持http 206(部分内容)的视频文件。该代码在Firefox上运行良好,但在Chrome上无法运行。 Chrome仅请求一次视频,然后再停止请求。我默认使用nodejs 10。
const fs = require('fs')
const fsPromises = require('fs').promises
const Koa = require('koa')
function rangeParse (str) {
const token = str.split('=')
if (!token || token.length !== 2 || token[0] !== 'bytes') {
return null
}
return token[1]
.split(',')
.map((range) => {
return range.split('-').map((value) => {
if (value === '') {
return Infinity
}
return Number(value)
})
})
.filter((range) => {
return !isNaN(range[0]) && !isNaN(range[1]) && range[0] <= range[1]
})
}
const app = new Koa()
app.use(async ctx => {
let range = ctx.header.range
if (!range) {
return
}
const ranges = rangeParse(range)
let [start, end] = ranges[0]
const path = 'c:\\Users\\lenovo\\Downloads\\big_buck_bunny_720p_5mb.mp4'
const stats = await fsPromises.lstat(path)
const fileSize = stats.size
ctx.status = 206
end = end === Infinity ? fileSize - 1 : end
ctx.set('Content-Type', 'video/mp4')
ctx.set('Accept-Ranges', 'bytes')
ctx.set('Content-Range', `${start}-${end}/${fileSize}`)
ctx.set('Content-Length', end - start + 1)
ctx.body = fs.createReadStream(path, { start, end })
})
app.listen(3000)
<!DOCTYPE html>
<html>
<body>
<video style="height: 100%; width: 100%;" controls src="http://127.0.0.1:3000/"></video>
</body>
</html>
答案 0 :(得分:0)
响应中包含错误的标题Content-Range
。 ${start}-${end}/${fileSize}
应该更改bytes ${start}-${end}/${fileSize}
。