我有一个依赖第三方对象存储(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;。
答案 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类型
另请参阅我对HTML5 video not working on iPad的回答。
答案 1 :(得分:1)
我不会尝试自己在节点中重新创建流媒体服务器。
使用您拥有的代码,您的应用程序服务器将首先从SoftLayer下载完整文件,然后从RAM将其传输到客户端。对于大量文件或客户来说,这是不可持续的。
如果您的服务器位于布鲁塞尔,则不同大陆的每个客户端都会看到传输缓慢。它会在移动网络上特别痛苦,这可能是您想要获得最佳性能的地方。
使用最佳工具完成工作。您不会在几行节点中创建最佳的流媒体服务器。相信像NGINX这样的专用HTTP服务器可以为您解决此问题。此外,您编写的代码中不会出现错误。
使用SoftLayer CDN。它专门用于解决您的问题。注意:我不隶属于他们。如果您的内容在S3上,我建议您使用CloudFront。这里的关键是使用CDN进行流媒体视频。