videostream不适用于iOS / Safari

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

node.js-code(从w3c-websitestream式传输video)的简化版本如下所示:

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'被用作HTML5video播放器的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

要运行它,只需运行“node bin / www”并浏览到“ http:// localhost:3000 / testVideo ”。

我不会尝试在自己的节点上重新创build一个stream媒体服务器。

服务器性能不好

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

遍布全球

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

stream媒体很难

使用最好的工具来完成这项工作。 你不会在几行节点上创build最好的stream媒体服务器。 相信像NGINX这样的专用HTTP服务器可以为您解决这个问题。 而且,在你没有写的代码中不会有错误。

build议:

使用SoftLayer CDN 。 它是专门为解决你的问题而打造的。 注意:我不属于他们。 如果您的内容是在S3上,我build议您使用CloudFront。 这里的关键是使用CDNstreamvideo。

iOS对于video的传输方式非常特别。

Safari Web内容指南 – configuration您的服务器

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

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

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

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

确保您的HTTP服务器为影片文件扩展名发送正确的MIMEtypes;

扩展MIMEtypes

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

另请参阅我的答案HTML5video不能在iPad上工作 。