私はWindowsマシンで開発していますが、ターゲットプラットフォームはChromiumを使用したラズベリーパイです(これは任意ですが、ブラウザは問題ありません)。私はPiに複数のカメラ(ダースなど)を接続しており、明らかにUSBハブを使用する必要があります。以下のコードでは、カメラを接続するたびに、または新しいブラウザセッションでも、異なるデバイスIDを取得するように見えます。私は、特定のカメラ、録画ビデオまたは画像からカメラをオン/オフなどにすることができる必要がありますが、私は各カメラに一意の識別子を得ることができなければできません。WebRTC(javascript)用の複数のUSBデバイス(カメラ)の一意のIDを取得するにはどうすればよいですか?
ビデオフィード識別子を使用して、おそらくカメラを識別することもできます(たとえば、/ dev/video0、/ dev/video1、.../dev/video n)。ブラウザ。
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>
サンプル出力:
=================
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 =>
お知らせもそのラベルが(Windowsの/ Firefoxの)空白が、私はやるRaspbian /クロムでありますラベルを取得します。残念ながら、これらは一意ではありません(例:USB2.0カメラ(1871:0142))もし私が何とかこれらのラベルを使うことができたら... pageはラベルに "このデバイスを説明するラベルであるDOMStringを返しますWebcam ")。アクティブなMediaStreamを使用している間、または永続的なパーミッションが付与されている場合にのみ利用できます。私は "パーシステントパーミッション"を何で、どのように行うのか分かりません。
助けてください。そして、私は別の技術、すなわちfswebcamを何らかの形でブラウザ(カスタムURL)やphpなどにリンクして使用したいと考えています。
Thanx @jibしかし、IDはどのように変更して再利用できますか? Piが再起動し、新しいIDを使用するためにすべてを再プログラムする必要があります。 – Chiwda
@Chiwdaそれで問題を切り分けます。 IDはクッキーのようなストレージに格納されているはずです。それはあなたのための通常のデスクトップブラウザで動作しますか?もしそうなら、ラズベリーパイバージョンにバグがあります。それはストレージを持っていますか?最悪の場合は、他の人が提案したようにラベルを使用してください(言及したように、最初にgUMの成功が必要です)。 – jib
これらのIDはWindows 10とPiで同じに動作します。はい、私は彼らが成功したgetUsermedia()を必要としていることを理解していますが、それは定義されることによって、呼び出されるたびに再作成されることを意味します。 – Chiwda