2017-05-26 4 views
1

私は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などにリンクして使用したいと考えています。

答えて

-1

ブラウザは同じdeviceidを維持することがセキュリティ上の問題であり、ウェブサイトはbrowseridのようなdeviceidを使用してユーザーを追跡できます。

deviceInfoラベルまたはMediaTrackラベルからデバイスベンダー名を取得できます。すべて同じベンダーのものである場合は、hereを押します。またはchromium devicesを掘り下げてカスタムバージョンを構築してください。

1

deviceIdはそのIDです。これはプライバシーの理由からページの起源に固有のものですが、カメラやマイクの許可が最初に元のページに1回許可された後は、クッキーのようなブラウジングセッションにまたがって保持されます。その後、ユーザーがCookieをクリアするまで保持されます。

つまり、ユーザーが過去にあなたのページへのアクセスをgetUserMediaに許可したことがある場合は、昨日または1年前になります。次に取得したIDは、元のページそれ以来、ユーザーはCookieをクリアしていません。

labelフィールドは、これを行うまでは空白で、プライバシー上の理由から再び空白になります。

デバイスの取り外しと再接続は問題ではありません。 IDはまだ使用可能でなければなりません。

+0

Thanx @jibしかし、IDはどのように変更して再利用できますか? Piが再起動し、新しいIDを使用するためにすべてを再プログラムする必要があります。 – Chiwda

+0

@Chiwdaそれで問題を切り分けます。 IDはクッキーのようなストレージに格納されているはずです。それはあなたのための通常のデスクトップブラウザで動作しますか?もしそうなら、ラズベリーパイバージョンにバグがあります。それはストレージを持っていますか?最悪の場合は、他の人が提案したようにラベルを使用してください(言及したように、最初にgUMの成功が必要です)。 – jib

+0

これらのIDはWindows 10とPiで同じに動作します。はい、私は彼らが成功したgetUsermedia()を必要としていることを理解していますが、それは定義されることによって、呼び出されるたびに再作成されることを意味します。 – Chiwda

関連する問題