带有节点 js 的部分内容视频流到 IOS
Partial content video stream with node js to IOS
我正在尝试制作一个 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 无法启动 playing/streaming
有人知道为什么 IOS safari 不喜欢这个吗?
(视频:格式:h.264、568x320、AAC、22050 hz、784.65 kbit/s、.mp4)
响应 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
header 的值类似于 0-9,50-499,1000-
。在这些情况下,您需要回复 multipart/byteranges
。
我正在尝试制作一个 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 无法启动 playing/streaming
有人知道为什么 IOS safari 不喜欢这个吗?
(视频:格式:h.264、568x320、AAC、22050 hz、784.65 kbit/s、.mp4)
响应 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
header 的值类似于 0-9,50-499,1000-
。在这些情况下,您需要回复 multipart/byteranges
。