【问题标题】:Partial content video stream with node js to IOS带有节点js的部分内容视频流到IOS
【发布时间】:2016-08-11 10:56:03
【问题描述】:

我正在尝试制作一个 mp4 视频文件以流式传输到 ios 设备。我正在使用 IIS 服务器从域中捕获 https 连接,然后将代理反向代理到本地主机上的 express(nodejs) 服务器。这是我的节点 js:

    var range = req.headers.range;
    var contentType = _mime2.default.lookup(filename);

    if (req.get('Range') == null){
        console.log("hei");
        res.status(200);
        res.set('Connection', 'keep-alive');
        res.set('Content-Type',contentType);
        res.set('Content-Length', data.length);
        res.set("Accept-Ranges", "bytes");
      res.end(data)
    }else{
      var total = data.length;
      var split = range.split(/[-=]/);
      var ini = +split[1];
      var end = split[2]?+split[2]:total-1;
      var chunkSize = end - ini + 1;
     if (parseInt(ini) >= total || parseInt(end) >= total) {
       //Indicate the acceptable range.
        res.status(416);
        res.set("Content-Range",'bytes */' + total); // File size.
       //Return the 416 'Requested Range Not Satisfiable'.
         res.end();
     }
      res.status(206);
      res.set('Connection', 'keep-alive');
      res.set("Content-Range","bytes " + ini + "-" + end + "/" + total);
      res.set("Accept-Ranges", "bytes");
      res.set("Content-Length", chunkSize);
      res.set("Content-Type", contentType);
      res.end(data.slice(ini, chunkSize+ini));
    }
  }).catch(function (err) {
    res.status(404);
    res.set('Content-Type', 'text/plain');
    res.end('File not found.');
  });

[![被火狐捕获][1]][1]

不同浏览器上的行为:

  • Chrome 会下载整个视频
  • Firefox 可以正常播放视频
  • OSX Safari 下载整个视频
  • IOS Safari 无法开始播放/流式传输

有人知道为什么 IOS safari 不喜欢这个吗?

(视频:格式:h.264、568x320、AAC、22050 hz、784.65 kbit/s、.mp4)

【问题讨论】:

  • 你能分享一下你如何将数据发送到服务器的iOS代码吗?

标签: ios node.js iis express video-streaming


【解决方案1】:

回复Content-Type 不正确。应该是video/mp4。此外,尚不清楚您的 data 变量来自何处,但您可能应该这样做:

res.status(206);
res.set('Connection', 'keep-alive');
res.set("Content-Range","bytes " + ini + "-" + end + "/" + total);
res.set("Accept-Ranges", "bytes");
res.set("Content-Length", chunkSize);
res.set("Content-Type", contentType);
fs.createReadStream(filename, { start: ini, end: end }).pipe(res)

您不需要将整个文件缓冲区放在内存中。除此之外,您可能还需要在同一请求中处理多个字节范围。其中请求 Range 标头的值类似于 0-9,50-499,1000-。在这些情况下,您需要回复 multipart/byteranges 回复。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-23
  • 2016-09-17
  • 1970-01-01
  • 2018-07-20
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
相关资源
最近更新 更多