Javascript node.js中的视频流
我想使用node.js流式传输视频。我跟着。从当地的情况来看,它工作得很好。但我需要从网络上传输视频 我的要求有点不同。我必须从源代码中隐藏原始URL。因此,我需要显示自己的URL,而不是显示原始URL,如Javascript node.js中的视频流,javascript,node.js,video,streaming,video-streaming,Javascript,Node.js,Video,Streaming,Video Streaming,我想使用node.js流式传输视频。我跟着。从当地的情况来看,它工作得很好。但我需要从网络上传输视频 我的要求有点不同。我必须从源代码中隐藏原始URL。因此,我需要显示自己的URL,而不是显示原始URL,如。而不是显示 使用以下代码 var indexPage, movie_webm, movie_mp4, movie_ogg; fs.readFile(path.resolve(__dirname,"ANY_LOCAL_VIDEO.mp4"), function (err, data) {
。而不是显示
使用以下代码
var indexPage, movie_webm, movie_mp4, movie_ogg;
fs.readFile(path.resolve(__dirname,"ANY_LOCAL_VIDEO.mp4"), function (err, data) {
if (err) {
throw err;
}
console.log(data.length);
movie_mp4 = data;
});
http.createServer(function (req, res) {
var reqResource = url.parse(req.url).pathname;
var total;
total = movie_mp4.length;
var range = req.headers.range;
var positions = range.replace(/bytes=/, "").split("-");
var start = parseInt(positions[0], 10);
var end = positions[1] ? parseInt(positions[1], 10) : total - 1;
var chunksize = (end-start)+1;
res.writeHead(206, { "Content-Range": "bytes " + start + "-" + end + "/" + total,
"Accept-Ranges": "bytes",
"Content-Length": chunksize,
"Content-Type":"video/mp4"});
res.end(movie_mp4.slice(start, end+1), "binary");
}).listen(8888);
对于本地视频来说,它工作得很好。但是如果我给出fs.readFile(“http://goo.gl/KgGx0s“,函数(err,data){
而不是上面的代码它不工作。我尝试将fs.readFile
更改为fs.filepath
,但仍然不工作。我收到了此错误。”
c:\git\personal\streaming-video-html5\server.js:13
throw err;
^
Error: ENOENT, open 'c:\git\personal\streaming-video-html5\http:\goo.gl\KgGx0s'
这可能是因为路径正在改变。我应该采取什么方法?可能吗?您正在寻找的是类似于 您只需获取远程视频,然后将其直接传送到您的响应 我要做的是首先向远程视频发出
HEAD
请求,以确认它接受字节范围,并获取视频的内容长度
一旦获得该信息,您就可以设置响应头,HTTP状态代码为206
,表示这是部分响应
既然您已经编写了响应头,那么您就创建了一个到远程视频的请求,沿着原始请求中的字节范围发送,并通过管道直接发送到您的响应(res
)
您可能可以缓存来自HEAD
请求的响应,这样就不必每次请求一个字节范围时都这样做
var fileUrl = 'https://ia800300.us.archive.org/1/items/night_of_the_living_dead/night_of_the_living_dead_512kb.mp4';
var range = req.headers.range;
var positions, start, end, total, chunksize;
// HEAD request for file metadata
request({
url: fileUrl,
method: 'HEAD'
}, function(error, response, body){
setResponseHeaders(response.headers);
pipeToResponse();
});
function setResponseHeaders(headers){
positions = range.replace(/bytes=/, "").split("-");
start = parseInt(positions[0], 10);
total = headers['content-length'];
end = positions[1] ? parseInt(positions[1], 10) : total - 1;
chunksize = (end-start)+1;
res.writeHead(206, {
"Content-Range": "bytes " + start + "-" + end + "/" + total,
"Accept-Ranges": "bytes",
"Content-Length": chunksize,
"Content-Type":"video/mp4"
});
}
function pipeToResponse() {
var options = {
url: fileUrl,
headers: {
range: "bytes=" + start + "-" + end,
connection: 'keep-alive'
}
};
request(options).pipe(res);
}