2017-05-26 4 views
1

Je suis en train de développer sur une machine Windows mais la plate-forme cible est une Raspberry Pi en utilisant Chromium (ceci est optionnel, tout navigateur marche bien). Je connecte plusieurs caméras (disons une douzaine) au Pi et devra évidemment utiliser des hubs USB. Dans le code ci-dessous, il semble que j'obtiens des ID d'appareil différents chaque fois que je branche une caméra ou même dans une nouvelle session de navigateur. Je dois pouvoir enregistrer à partir d'une caméra spécifique, enregistrer une vidéo ou une image, allumer/éteindre l'appareil photo, etc. mais je ne peux pas le faire à moins de pouvoir obtenir une sorte d'identifiant unique pour chaque caméra.Comment puis-je obtenir un identifiant unique pour plusieurs périphériques USB (caméras) pour WebRTC (javascript)?

Je pourrais également utiliser les identifiants de flux vidéo peut-être pour identifier la caméra (par exemple/dev/video0,/dev/video1, .../dev/video n), mais je ne sais pas comment le faire dans le navigateur.

html:

<div id="container"> 
    <h1>Test Page</h1> 
    <div id="List"></div> 
    <div class="select"> 
     <p><label for="videoSource">Video source: </label><select id="videoSource"></select></p> 
     <p><label for="audioOutput">audioOutput source: </label><select id="audioOutput"></select></p> 
     <p><label for="audioInput">audioInput source: </label><select id="audioInput"></select></p> 
    </div> 
    <video muted autoplay></video> 
</div> 

javascript:

<script> 
    var DeviceInfo = ""; 
    var videoSelect = document.getElementById("videoSource"); 
    var audioOutputSelect = document.getElementById("audioOutput"); 
    var audioInputSelect = document.getElementById("audioInput"); 
    navigator.mediaDevices.enumerateDevices() 
     .then(gotDevices) 
     .catch(errorCallback); 
    function gotDevices(deviceInfos) { 
     alert("deviceInfos.length: " + deviceInfos.length); 
     for (var i = 0; i !== deviceInfos.length; ++i) { 
      var deviceInfo = deviceInfos[i]; 
      DeviceInfo += "<br>================="; 
      for (var key in deviceInfo) { 
       DeviceInfo += "<br>" + key + " => " + deviceInfo[key]; 
      } 
      var option = document.createElement('option'); 
      option.value = deviceInfo.deviceId; 
      if (deviceInfo.kind === 'audioinput') { 
       option.text = deviceInfo.label || 
       'Microphone ' + (audioInputSelect.length + 1); 
       audioInputSelect.appendChild(option); 
      } else if (deviceInfo.kind === 'audiooutput') { 
       option.text = deviceInfo.label || 'Speaker ' + 
       (audioOutputSelect.length + 1); 
       audioOutputSelect.appendChild(option); 
      } else if (deviceInfo.kind === 'videoinput') { 
       option.text = deviceInfo.label || 'Camera ' + 
       (videoSelect.length + 1); 
       videoSelect.appendChild(option); 
      } 
     } 
     document.getElementById("List").innerHTML = DeviceInfo; 
    } 
    function errorCallback(err) { 
     alert(err.name + ": " + err.message); 
    } 
</script> 

Exemple de sortie:

================= 
toJSON => function toJSON() { [native code] } 
deviceId => 68KeeWjqTyTiECj/vjwuwWSMNXraaUu/sz5CDSnbNg0= 
kind => videoinput 
label => 
groupId => 
================= 
toJSON => function toJSON() { [native code] } 
deviceId => wuJ0e0dyB7bUyO3L6MHV6CD8v+FQRRZ0V9oSS/IMebg= 
kind => videoinput 
label => 
groupId => 
================= 
toJSON => function toJSON() { [native code] } 
deviceId => BdtXeGDVhh2g68rfu4cOg9yZoS7WdgTNr8nXOThLfPU= 
kind => videoinput 
label => 
groupId => 
================= 
toJSON => function toJSON() { [native code] } 
deviceId => mAc/SogzkQKpq8O3Zto64+SlOwsg1kKdXJLxua5t328= 
kind => audioinput 
label => 
groupId => 
================= 
toJSON => function toJSON() { [native code] } 
deviceId => n1or62DRNYW0zC4yQVox75nQhBZb0BYR9C/VWB1GLkM= 
kind => audioinput 
label => 
groupId => 
================= 
toJSON => function toJSON() { [native code] } 
deviceId => 74K5qAhhroD8esqAYW+9P8jxs4yvdWnPQ1Ia8OYJZqc= 
kind => audioinput 
label => 
groupId => 
================= 
toJSON => function toJSON() { [native code] } 
deviceId => rHIqRAFL4ZcfTqJc214llo5XxeDLm+pTG/DoicpOryM= 
kind => audioinput 
label => 
groupId => 

Notez également que l'étiquette est vide (Windows/Firefox) mais dans Raspbian/Chrome je obtenir des étiquettes. Malheureusement, ils ne sont pas uniques (par exemple USB2.0 Camera (1871: 0142)) Si j'étais en quelque sorte capable d'utiliser ces étiquettes ... Ce page dit label "Retourne un DOMString qui est une étiquette décrivant ce périphérique (par exemple" USB externe Webcam ") Disponible uniquement pendant l'utilisation de MediaStream active ou lorsque des autorisations permanentes ont été accordées." Je n'ai aucune idée de quoi ou comment faire des "permissions persistantes".

Toute aide appréciée. Et je suis prêt à utiliser une technologie différente, à savoir fswebcam en quelque sorte liée au navigateur (URL personnalisé) ou php ou autre.

Répondre

-1

Il peut s'agir d'un problème de sécurité pour les navigateurs qui souhaitent conserver le même deviceid, les sites Web peuvent suivre l'utilisateur en utilisant deviceid comme un cookie de navigateur.

Vous pouvez obtenir le nom du fournisseur de périphérique à partir du libellé deviceInfo ou de l'étiquette MediaTrack, si tous proviennent du même fournisseur, puis pointez sur here. Ou creusez chromium devices et créez votre version personnalisée.

1

Le deviceId est ce ID. Il est unique à l'origine de la page pour des raisons de confidentialité, mais il persistera à travers les sessions de navigation comme un cookie, après que la permission de caméra ou de microphone a été accordée une fois à une page de votre origine. Après cela, il devrait persister jusqu'à ce que l'utilisateur efface ses cookies. En d'autres termes, si l'utilisateur a déjà accordé getUserMedia accès à votre page dans le passé, que ce soit hier ou il y a un an, alors les identifiants que vous obtenez maintenant correspondront à ce qu'ils étaient alors, dans les pages de votre origine l'utilisateur n'a pas effacé ses cookies depuis lors.

Le champ label est également vide jusqu'à ce que vous l'ayez fait, encore une fois pour des raisons de confidentialité.

Débrancher et rebrancher les périphériques ne devrait pas avoir d'importance. Les identifiants devraient toujours être utilisables.

+0

Thanx @jib mais les identifiants changent donc comment peuvent-ils être réutilisés? Le Pi peut redémarrer et ensuite nous devons reprogrammer tout pour utiliser les nouveaux ID. – Chiwda

+0

@ Chihi Je voudrais isoler le problème alors. Les identifiants sont censés être stockés dans un stockage semblable à un cookie. Est-ce que cela fonctionne dans un navigateur de bureau normal pour vous?Si oui, il y a un bug dans votre version de framboise pi. A-t-il du stockage? Dans le pire des cas, utilisez les étiquettes comme d'autres l'ont suggéré (elles exigent d'abord le succès du GUM, comme je le mentionne). – jib

+0

Ils (IDs) fonctionnent de la même manière sur Windows 10 et le Pi. Oui, je comprends qu'ils ont besoin d'un getUsermedia() réussi, mais que, par définition, ils sont recréés chaque fois qu'ils sont appelés. – Chiwda