如何使用koa2传输视频文件?

时间:2019-06-05 07:28:56

标签: javascript node.js video-streaming

我想使用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>

1 个答案:

答案 0 :(得分:0)

响应中包含错误的标题Content-Range${start}-${end}/${fileSize}应该更改bytes ${start}-${end}/${fileSize}