egg icon indicating copy to clipboard operation
egg copied to clipboard

视频流返回前端无法播放

Open liyang9331 opened this issue 4 years ago • 5 comments

Discussed in https://github.com/eggjs/egg/discussions/4767

Originally posted by liyang9331 September 27, 2021

ctx.set('content-type', 'video/mp4');//设置返回类型
    let stream = fs.createReadStream('./assets/test.mp4');
    if (stream) {//判断状态
      stream.on('open', function () {
        console.log('文件打开')
      });
      stream.on('end', function () {
        console.log("读取完毕")
      })
      stream.on('data', function (data) {
        // console.log("读取文件流")
        ctx.body = data
      })
      stream.on('err', function () {
        console.log("发生错误")
      })
      stream.on('close', function () {
        console.log('关闭')
        // ctx.end
      });
    }

liyang9331 avatar Sep 28 '21 05:09 liyang9331

谁跟你说 Koa 的 body 可以多次赋值,然后响应的。。。

atian25 avatar Sep 28 '21 08:09 atian25

only ctx.body = stream,koa will handle stream

whatwewant avatar Oct 08 '21 07:10 whatwewant

谁跟你说 Koa 的 body 可以多次赋值,然后响应的。。。

不可以多次响应,如何分段返回媒体流? ctx.body = stream,不是将整个媒体流返回了吗?

liyang9331 avatar Oct 11 '21 02:10 liyang9331

不可以多次响应,如何分段返回媒体流? ctx.body = stream,不是将整个媒体流返回了吗?

要多次分段返回只能自己切割后多次靠逻辑组合多次请求。

http 请求自身本来就只能 send 一次,或者你可以用 stream.PassThrough 自己控制输出速度。

hyj1991 avatar Oct 11 '21 07:10 hyj1991

谁跟你说 Koa 的 body 可以多次赋值,然后响应的。。。

不可以多次响应,如何分段返回媒体流?

ctx.body = stream,不是将整个媒体流返回了吗?

你是在 data 事件里面赋值的啊, 这是一个重复行为。而且没有 await 事件

atian25 avatar Oct 11 '21 12:10 atian25