视频流不适用于iOS / Safari

时间:2016-05-02 22:43:42

标签: javascript ios node.js html5

我有一个依赖第三方对象存储(SoftLayer)来提供视频文件的Web应用程序。当用户请求视频时,我的node.js-server从对象存储中获取文件并将其流式传输到客户端。我的代码适用于Android和Android中的浏览器桌面计算机上的Firefox和Chrome。很遗憾,该视频无法在Safari / iOS中播放。

node.js-code的简化版本(从w3c网站流式传输视频)如下所示:

router.get('/testFile', function (req, res) {
  var range = req.headers.range;
  var positions = range.replace(/bytes=/, "").split("-");
  var start = parseInt(positions[0], 10);

  var objectPath = "http://www.w3schools.com/html/mov_bbb.mp4"
    request.get({
      url: objectPath,
      headers: {},
      encoding: null
    }, function (err, data) {
      if (err) {
        console.log('error', err);
      }else {
        var total = data.body.length;
        var end = positions[1] ? parseInt(positions[1], 10) : total - 1;
        var chunksize = (end - start) + 1;
        console.log("bytes " + start + "-" + end + "/" + total);
        res.writeHead(206, {
          "Content-Range": "bytes " + start + "-" + end + "/" + total,
          "Accept-Ranges" : "bytes",
          "Content-Length": chunksize
        });
        var bodyStream = new streambuffers.ReadableStreamBuffer({
          frequency: 1,
          chunksize: 256
        });
        bodyStream.pipe(res);
        bodyStream.put(data.body);
      }
    });
});

' / testFile'然后用作HTML5视频播放器的src:

<!DOCTYPE html>
<html>
  <head>
    <title>Movie</title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1>Test video</h1>
    <video controls="true" preload="none">
      <source src="/testFile" type="video/mp4"/>
    </video>
  </body>
</html>

这个简单的项目可以在这里查看:https://bitbucket.org/Duffman/stream-video

要运行它,只需运行&#34; node bin / www&#34;并冲浪到#34; http://localhost:3000/testVideo&#34;。

2 个答案:

答案 0 :(得分:1)

iOS非常关注视频的投放方式。

Safari Web Content Guide - Configuring Your Server

  

托管iOS媒体文件的HTTP服务器必须支持字节范围   请求,iOS用于在媒体播放中执行随机访问。

如果您不确定媒体服务器是否支持字节范围请求,可以使用curl命令行工具从服务器上的文件下载短片段:

curl --range 0-99 http://example.com/test.mov -o /dev/null

如果工具报告它下载了100个字节,则介质服务器正确处理了字节范围请求。

确保您的HTTP服务器为电影文件扩展名发送正确的MIME类型;

扩展程序MIME类型

  • .mov:video / quicktime
  • .mp4:video / mp4
  • .m4v:video / x-m4v
  • .3gp:video / 3gpp

另请参阅我对HTML5 video not working on iPad的回答。

答案 1 :(得分:1)

我不会尝试自己在节点中重新创建流媒体服务器。

服务器性能不好

使用您拥有的代码,您的应用程序服务器将首先从SoftLayer下载完整文件,然后从RAM将其传输到客户端。对于大量文件或客户来说,这是不可持续的。

在全球范围内缓慢

如果您的服务器位于布鲁塞尔,则不同大陆的每个客户端都会看到传输缓慢。它会在移动网络上特别痛苦,这可能是您想要获得最佳性能的地方。

流媒体很难

使用最佳工具完成工作。您不会在几行节点中创建最佳的流媒体服务器。相信像NGINX这样的专用HTTP服务器可以为您解决此问题。此外,您编写的代码中不会出现错误。

建议:

使用SoftLayer CDN。它专门用于解决您的问题。注意:我不隶属于他们。如果您的内容在S3上,我建议您使用CloudFront。这里的关键是使用CDN进行流媒体视频。