IP 摄像机 - 在 Chrome 上使用基本身份验证流式传输视频
IP Camera - Streaming video with the basic authentication on Chrome
我有一台 Amcrest IP 摄像机。我想将视频流式传输到我的网页。
它的 url 是 rtsp://mycamera.com:5554/stream
为了获取摄像头的码流,摄像头有如下APIhttp://mycamera.com/video.mjpg
它需要基本身份验证才能工作。
通过格式化 URL 并将其放入图像标签中,如下所示,我可以使其在 Firefox、Safari 上运行
<img src="http://username:password@mycamera.com/video.mjpg" />
但是,Chrome(我的v.40)不允许这种URL,浏览器会提示填写用户密码表单,或者干脆拒绝请求。在脚本中设置 header 授权:"Basic encode64(username, password)" 没有帮助,URL 总是 return 401 错误(未授权)
有时,它会引发 CORS 错误。如果我的网站是 运行 HTTPS,HTTP API 调用将被浏览器阻止。
- 禁用 IP 摄像机的身份验证:
如果相机在管理面板上没有该选项,只需添加一个没有密码的用户,使用任何用户名,如"none",然后我们可以这样设置
<iframe src="http://none:@mycamera.com/video.mjpg" width="1280" height="768"></iframe>
没有密码,我的 Chrome 不再抛出用户 name/password。 (在 Windows 的 Chrome 和 MacOSX 和 Safari 上测试)
- 将输出代理到我自己网站的服务器:
下载framework CORS of the mohsen1
安装 node js 和 运行 此服务器与网站的域相同。我们需要编辑 index.js 文件如下
var fs = require('fs');
var request = require('request');
var http = require('http');
var https = require('https');
var privateKey = fs.readFileSync('/var/private_key.pem', 'utf8');
var certificate = fs.readFileSync('/var/certificate.crt, 'utf8');
var credentials = {key: privateKey, cert: certificate};
var express = require('express');
var proxy_http_port = 9009
var proxy_https_port = 9443
var app = express();
// your express configuration here
var auth = "";
app.use(function (req, res, next) {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
next();
});
var t = app.get('/', function (req, res, next) {
var username = "";
var password = "";
if (req.query.auth) {
username = req.query.auth.split(":")[0];
password = req.query.auth.split(":")[1];
auth = 'Basic ' + new Buffer(username + ':' + password).toString('base64');
res.header('Authorization', auth);
} else {
res.send('please specify auth query param');
}
if (req.query.url) {
var options = {
method: 'GET',
url: req.query.url,
headers: {
"Authorization": auth,
//'User-Agent': req.headers['user-agent']
},
encoding: null
};
var r = request(options, function callback(error, response, body) {
if (!error && response.statusCode == 200) {
res.write(body);
delete response.headers['access-control-allow-origin'];
}
}).pipe(res);
} else {
res.send('You have to specify URL query');
}
});
http.globalAgent.maxSockets = 100;
var httpServer = http.createServer(app);
var httpsServer = https.createServer(credentials, app);
httpServer.listen(proxy_http_port);
httpsServer.listen(proxy_https_port);
Encode 下面的视频流 URL:
至:
http%3A%2F%2Fmycamera.com%2Fvideo.mjpg
流视频的URL应该是
https://mywebsite.com:9443/?auth=username:password&url=(put above encoded video URL here)
这种方法的优点是绕过大部分问题并消除错误(CORS、HTTPS),因为我的网站将请求到它自己的服务器
缺点是视频会被fetch两次,造成延迟比较大
错误 401 表示凭据无效,因此您很可能没有正确格式化基本身份验证字符串。 header 格式应该是 Authorization Basic [base64 encoded username:password] 使用冒号符号:在将整个字符串编码为 base 64 之前将两者分开。
例如,结果 header 应如下所示:
Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l
您可以尝试安装 Chrome "Advanced REST Client" 插件并使用该插件测试使用基本身份验证参数访问您的 URL link。如果您可以让它与 REST 客户端插件一起使用,那么返回并更新您的脚本以修复 auth headers.
的格式
Link 到高级 REST 客户端:
https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo?hl=en-US
Link 验证 headers 格式信息:
https://en.wikipedia.org/wiki/Basic_access_authentication
我有一台 Amcrest IP 摄像机。我想将视频流式传输到我的网页。
它的 url 是 rtsp://mycamera.com:5554/stream
为了获取摄像头的码流,摄像头有如下APIhttp://mycamera.com/video.mjpg
它需要基本身份验证才能工作。
通过格式化 URL 并将其放入图像标签中,如下所示,我可以使其在 Firefox、Safari 上运行
<img src="http://username:password@mycamera.com/video.mjpg" />
但是,Chrome(我的v.40)不允许这种URL,浏览器会提示填写用户密码表单,或者干脆拒绝请求。在脚本中设置 header 授权:"Basic encode64(username, password)" 没有帮助,URL 总是 return 401 错误(未授权)
有时,它会引发 CORS 错误。如果我的网站是 运行 HTTPS,HTTP API 调用将被浏览器阻止。
- 禁用 IP 摄像机的身份验证:
如果相机在管理面板上没有该选项,只需添加一个没有密码的用户,使用任何用户名,如"none",然后我们可以这样设置
<iframe src="http://none:@mycamera.com/video.mjpg" width="1280" height="768"></iframe>
没有密码,我的 Chrome 不再抛出用户 name/password。 (在 Windows 的 Chrome 和 MacOSX 和 Safari 上测试)
- 将输出代理到我自己网站的服务器:
下载framework CORS of the mohsen1
安装 node js 和 运行 此服务器与网站的域相同。我们需要编辑 index.js 文件如下
var fs = require('fs');
var request = require('request');
var http = require('http');
var https = require('https');
var privateKey = fs.readFileSync('/var/private_key.pem', 'utf8');
var certificate = fs.readFileSync('/var/certificate.crt, 'utf8');
var credentials = {key: privateKey, cert: certificate};
var express = require('express');
var proxy_http_port = 9009
var proxy_https_port = 9443
var app = express();
// your express configuration here
var auth = "";
app.use(function (req, res, next) {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
next();
});
var t = app.get('/', function (req, res, next) {
var username = "";
var password = "";
if (req.query.auth) {
username = req.query.auth.split(":")[0];
password = req.query.auth.split(":")[1];
auth = 'Basic ' + new Buffer(username + ':' + password).toString('base64');
res.header('Authorization', auth);
} else {
res.send('please specify auth query param');
}
if (req.query.url) {
var options = {
method: 'GET',
url: req.query.url,
headers: {
"Authorization": auth,
//'User-Agent': req.headers['user-agent']
},
encoding: null
};
var r = request(options, function callback(error, response, body) {
if (!error && response.statusCode == 200) {
res.write(body);
delete response.headers['access-control-allow-origin'];
}
}).pipe(res);
} else {
res.send('You have to specify URL query');
}
});
http.globalAgent.maxSockets = 100;
var httpServer = http.createServer(app);
var httpsServer = https.createServer(credentials, app);
httpServer.listen(proxy_http_port);
httpsServer.listen(proxy_https_port);
Encode 下面的视频流 URL:
至:
http%3A%2F%2Fmycamera.com%2Fvideo.mjpg
流视频的URL应该是
https://mywebsite.com:9443/?auth=username:password&url=(put above encoded video URL here)
这种方法的优点是绕过大部分问题并消除错误(CORS、HTTPS),因为我的网站将请求到它自己的服务器
缺点是视频会被fetch两次,造成延迟比较大
错误 401 表示凭据无效,因此您很可能没有正确格式化基本身份验证字符串。 header 格式应该是 Authorization Basic [base64 encoded username:password] 使用冒号符号:在将整个字符串编码为 base 64 之前将两者分开。
例如,结果 header 应如下所示:
Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l
您可以尝试安装 Chrome "Advanced REST Client" 插件并使用该插件测试使用基本身份验证参数访问您的 URL link。如果您可以让它与 REST 客户端插件一起使用,那么返回并更新您的脚本以修复 auth headers.
的格式Link 到高级 REST 客户端: https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo?hl=en-US
Link 验证 headers 格式信息: https://en.wikipedia.org/wiki/Basic_access_authentication