0

J'ai une caméra IP Amcrest. Je voudrais diffuser de la vidéo sur ma page Web. Son URL est rtsp://mycamera.com:5554/streamCaméra IP - Diffuser de la vidéo avec l'authentification de base sur Chrome

Afin d'obtenir le flux de la caméra, l'appareil dispose d'une API suivante http://mycamera.com/video.mjpg

Il nécessite l'authentification de base au travail.

En formatant l'URL et de le mettre dans la balise d'image comme ci-dessous, je peux le faire fonctionner sur Firefox, Safari

<img src="http://username:[email protected]/video.mjpg" /> 

Cependant, Chrome (v.40 sur le mien) ne permet pas ce genre de URL, le navigateur affichera le formulaire de mot de passe de l'utilisateur à remplir ou refusera simplement la demande. Paramètre d'en-tête Autorisation: "Basic encodage64 (nom d'utilisateur, mot de passe)" dans le script n'aide pas, l'URL renvoie toujours 401 erreur (non autorisé)

Parfois, il soulève l'erreur CORS. Si mon site Web est exécuté avec HTTPS, l'appel de l'API HTTP sera bloqué par le navigateur.

Répondre

0
  1. désactiver l'authentification de la caméra IP:

Si l'appareil ne dispose pas de cette option sur le panneau d'administration, il suffit d'ajouter un utilisateur sans mot de passe avec un nom d'utilisateur comme « aucun », alors nous pouvons configurer comme ceci

<iframe src="http://none:@mycamera.com/video.mjpg" width="1280" height="768"></iframe> 

Sans mot de passe, mon Chrome ne jette plus le nom d'utilisateur/mot de passe. (Testé sur Chrome de Windows et MacOSX & Safari)

  1. Proxy la sortie sur le serveur de mon propre site web:

Télécharger les framework CORS du mohsen1

Installez le noeud js et exécutez ce serveur sur le même avec le domaine du site Web. Nous devons modifier le fichier index.js comme ci-dessous

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 l'URL du flux vidéo ci-dessous:

http://mycamera.com/video.mjpg

à:

http% 3A% 2F% 2Fmycamera.com% 2Fvideo.MJPG

L'URL du flux vidéo doit être

https://mywebsite.com:9443/?auth=username:password&url=(put above encoded video URL here) 

L'avantage de cette approche est de contourner la plupart des problèmes autour et se débarrasser des erreurs (CORS, HTTPS) parce que mon site demandera à son propre serveur

L'inconvénient est que la vidéo serait chercher deux fois, cela a causé beaucoup de retard.

2nd approach diagram

0

erreur 401 signifie des informations d'identification non valides si il y a une bonne chance que vous êtes tout simplement pas formater correctement la chaîne auth de base. Le format d'en-tête doit être l'autorisation de base [base64 nom d'utilisateur codé: mot de passe] en utilisant un symbole de deux points: pour séparer les deux avant de coder cette chaîne entière dans la base 64.

Par exemple, l'en-tête résultant devrait ressembler à ceci: Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l

Vous pouvez essayer d'installer le plug-in Chrome "Advanced REST Client" et utiliser ce plugin pour tester l'accès à votre lien URL avec les paramètres d'authentification de base. Si vous pouvez le faire fonctionner avec le plugin client REST, revenez en arrière et mettez à jour votre script pour corriger le format des en-têtes auth.

Lien vers avancée REST Client: https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo?hl=en-US

Lien vers auth informations format en-têtes: https://en.wikipedia.org/wiki/Basic_access_authentication