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.
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
@ 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
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