js を使用してネットワークカメラを呼び出し、一般的なエラーを処理します

js を使用してネットワークカメラを呼び出し、一般的なエラーを処理します

最近、業務上の理由により、Web ページ上のさまざまなネットワーク カメラにアクセスしてデバッグする必要があり、多くの信じられない問題に遭遇しました (つまり、カメラのブランドは読み取れますが、カメラの解像度は読み取れません)。そこで、この記事をメモとしてまとめ、同様の問題を抱えている友人の役に立つことを願っています。

基本コード

navigator.mediaDevices.getUserMedia({ audio: false, video: true }).then(async (stream) => {

  ビデオを document.getElementById('#video') に設定します。
 
  // 互換性の監視 if( 'srcObject' in video ) {
    
    video.srcObject = ストリーム
  } それ以外 {
    // このメソッドは、srcObject をサポートするブラウザではサポートされなくなりました。video.src = URL.createObjectURL(stream)
  }
  
  ビデオの再生を待つ()
})

互換性

caniuseの互換性から判断すると、全体的な互換性は平均的です。IEシリーズのブラウザはまったくサポートされていません。iOSはiOS 11以上を必要とするだけでなく、APPの埋め込みページでAPIを介して呼び出すこともできません。

開発中に遭遇したさまざまな問題

ブラウザコンソールにmediaDevices.getUserMediaは関数ではないと表示される

ブラウザの制限により、navigator.mediaDevices.getUserMedia は https プロトコルでは正常に使用できますが、http プロトコルでは localhost/127.0.0.1 の 2 つのドメイン名のみアクセスが許可されます。そのため、開発中に災害復旧を行う必要があり、オンラインになる際には本番環境が https プロトコル下にあるかどうかを確認する必要があります。

mediaDevices = navigator.mediaDevices || null とします  
if(メディアデバイス === null) {    
  console.warn(`https プロトコル環境であることを確認してください`)
  戻る 
}  
mediaDevices.getUserMedia({ audio: false, video: true }).then(async (stream) => {})

カメラのハードウェアパラメータを取得する

プロジェクト開発で使用する必要があるハードウェア パラメータには、主にブランドと解像度の 2 種類があります。カメラのブランド名を取得するのは比較的簡単です。mediaDevices.enumerateDevices() を直接使用して、コンピューターで使用可能な周辺機器のリストを取得し、kind フィールドを使用してカメラを除外することができます。

navigator.mediaDevices の場合:
    
 console.log("ブラウザはenumerateDevicesプロパティをサポートしていません")
 戻る
}
  
navigator.mediaDevices.enumerateDevices().then((デバイス) => {
    
  devicesList を devices.filter((device) => device.kind === 'videoinput') とします。
    
  // devicesList -> [{ kind: 'videoinput', name: 'FaceTime HD カメラ (内蔵)', deviceId: xxx }]
  // devicesList で取得した deviceId を使用してカメラを切り替えることができます。 // 具体的な方法: mediaDevices.getUserMedia({ audio: false, video: { deviceId } })
})

公式APIから直接解像度を取得することはできません。MDNに記載されている理由は、ユーザーの個人情報の保護のためであり、解像度は保護の範囲内です。 (なぜ解像度が非公開なのか非常に興味があります。)

MDN オリジナルテキスト (リンク):

プライバシー上の理由から、ユーザーのカメラとマイクの情報にはアクセスできません

しかし、取得が完全に不可能というわけではありません。カメラで録画したコンテンツはビデオタグを通じてウェブページ上で再生することができ、ビデオタグはデフォルトでサイズをカメラと同じサイズに設定するので、ビデオのサイズを取得することでカメラの解像度を取得できます。

テストの結果、得られた値はスタイルの影響を受けないため、ビデオのサイズはスタイルによって制御できますが、解像度には影響しません。

mediaDevices = navigator.mediaDevices || null とします  
if(メディアデバイス === null) {    
  console.warn(`https プロトコル環境であることを確認してください`)
  戻る 
}
  
mediaDevices.getUserMedia({ audio: false, video: true }).then(async (stream) => {    
  ビデオを document.getElementById('#video') に設定します。
  video.srcObject = ストリーム  
  ビデオの再生を待つ()    
 // 1280,720  
  console.log(ビデオ.ビデオ幅、ビデオ.ビデオ高さ)
})

カメラなし/使用許可なしなどのエラー処理

getUserMedia 自体には、カメラがない、使用権限がないなどのいくつかの一般的なエラー プロンプトが統合されています。同様のエラーのほとんどは、catch を通じて処理できます。

mediaDevices = navigator.mediaDevices || null とします
  
if(メディアデバイス === null) {
  
  console.warn(`https プロトコル環境であることを確認してください`)
  戻る 
}
  
mediaDevices.getUserMedia({ audio: false, video: true }).then(async (stream) => {
  
  ビデオを document.getElementById('#video') に設定します。
  
  video.srcObject = ストリーム
  
  ビデオの再生を待つ()
  
}).catch((エラー) => {
  
  message = error.message || error, とします。
    レスポンス = {
      「権限が拒否されました」: 「ブラウザによりこのページでのカメラの使用が禁止されています。関連する権限を有効にしてください」
      「要求されたデバイスが見つかりません」: 「カメラが検出されませんでした」
    }  
  アラート(応答[ message.toLowerCase() ] || '不明なエラー')
})

カメラを外して確認する

携帯電話のカメラは携帯電話に内蔵されているため、通常はカメラが取り外されているかどうかを確認する必要はありません。ただし、PC 上でカメラのデータ ケーブルが取り外されている場合は、カメラの状態を監視する必要があります。
最初に思い浮かぶのは、カメラが取り外されたときに getUserMedia が catch を通じてエラーを報告する可能性があるということです。しかし、多くの実験を行った結果、カメラが取り外されているときに getUserMedia はカメラが見つからないというエラーを返さず、catch を通じて直接監視することは現実的ではないことがわかりました。
ほとんど何もわからなかったときに、getUserMedia ドキュメントで次の文を見つけました。

getUserMedia は Promise を返します。Promise が成功した後のコールバック関数は、MediaStream オブジェクトをパラメーターとして受け取ります。

MediaStream は、マルチメディア (オーディオとビデオを含む) コンテンツ ストリームを受信するオブジェクトです。Google Chrome のコンソールに出力した後 (他のブラウザはテストされていません)、そのプロパティ値は次のとおりです。

id は MediaStream オブジェクトの一意の識別子、active は現在のコンテンツ ストリームがアクティブかどうか、次のフィールドは Google Chrome によって提供されるフックです。

カメラが取り外された瞬間、active が true から false に変わり、同時に oninactive フックがトリガーされます。ステータス監視により、物事ははるかに簡単になります。コードをテストした結果、ユーザーがカメラの権限を変更することも効果的であることがわかりました。

// カメラがオンラインかどうかを判定する let cameraIsOnline = false
  
定数loadWebCamera = () => {
    
  mediaDevices = navigator.mediaDevices || null とします
  
  if(メディアデバイス === null) {
  
    console.warn(`https プロトコル環境であることを確認してください`)
    戻る 
  }
  
  mediaDevices.getUserMedia({ audio: false, video: true }).then(async (stream) => {
  
    ビデオを document.getElementById('#video') に設定します。
  
    video.srcObject = ストリーム
      
    // 互換性処理 if ( stream.oninactive === null ) {
      // ストリームの中断をリッスンします。ストリームが中断された後、ステータスを監視するために再度自分自身を呼び出します stream.oninactive = () => loadWebCamera()
    }
  
    ビデオの再生を待つ()

    カメラがオンライン = true
  
  }).catch((エラー) => {
  
    message = error.message || error, とします。
      レスポンス = {
        「権限が拒否されました」: 「ブラウザによりこのページでのカメラの使用が禁止されています。関連する権限を有効にしてください」
        「要求されたデバイスが見つかりません」: 「カメラが検出されませんでした」
        「ビデオソースを開始できませんでした」: 「カメラにアクセスできません。再度接続して再試行してください」
      }
   
    カメラがオンライン = false
    アラート(応答[ message.toLowerCase() ] || '不明なエラー')
  })
}

ただし、互換性も非常に緊急であり、多くの分野はまだ提案段階にあります。実稼働環境での問題を防ぐために、開発段階で互換性をしっかり確保することをお勧めします。

これで、ウェブカメラ呼び出しの js 実装と一般的なエラー処理に関するこの記事は終了です。ウェブカメラ呼び出しの js コンテンツの詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • ネットワークカメラを呼び出すためのjsメソッド
  • jsはビデオ画面をキャプチャするためのWeb呼び出しカメラjsを実装します
  • JSはAndroid携帯のカメラを呼び出してQRコードをスキャンします
  • デバイスのカメラを呼び出すためのjsメソッド
  • JS を使用してローカルカメラ機能を呼び出す例
  • Vue2.0はカメラを呼び出して写真を撮る機能を実装し、exif.jsは写真アップロード機能を実装します。

<<:  Linux で MySQL スケジュール タスク バックアップ データを実装する方法

>>:  MySQLリモートアクセスの設定方法をステップバイステップで説明します

推薦する

MySQLはJSON内部フィールドを抽出し、数値としてダンプします

目次背景問題分析1. 属性値はJson形式であり、Json操作関数を使用して処理する必要があります。...

完全なショッピングカートを実装するためのミニプログラム

ミニプログラムは、参考までに完全なショッピングカート[すべて選択/選択解除して金額を計算/加算と減算...

Vue の echarts ツールチップにクリック イベントを追加する詳細な説明

目次必要回避策1. ツールチップを設定する2. hookToolTip変数を定義する3. メソッド内...

Spark SQL の 4 つの一般的なデータ ソースの詳細な説明

汎用ロード/書き込みメソッドオプションを手動で指定するSpark SQL の DataFrame イ...

XHTMLタグは適切に使用する必要があります

<br />123WORDPRESS.COM の以前のチュートリアルでは、Web ページ...

Linux でハードディスクのサイズを確認し、ハードディスクをマウントする方法

Linux には、マウントされたハードディスクとマウントされていないハードディスクの 2 種類のハー...

JSの高階関数5つを共有する

目次1. はじめに2. 再帰3. コールバック関数3.1 匿名コールバック関数3.2 パラメータ付き...

html.cssオーバーフローの包括的な理解

html.cssオーバーフローの包括的な理解XML/HTML コードコンテンツをクリップボードにコピ...

Jenkins統合Dockerプラグインの問題を解決するいくつかの方法

目次背景質問1エラー 2エラー 3エラー4要約する背景テスト環境では、docker プラグインを統合...

Vue3における7種類のコンポーネント通信の詳細

目次1. Vue3コンポーネント通信方式2. Vue3通信の使い方2.1 小道具2.2 $エミット2...

MySQLオンラインデッドロック分析練習

序文MySQL を学習する際に、MySQL のロック メカニズムについて簡単に理解したことがあると思...

CentOS サーバーのセキュリティ構成戦略

最近、ブルートフォース攻撃によるサーバのクラッキングが頻発しています。侵入行為を大まかに分析し、よく...

MYSQLパターンマッチングREGEXPの使用に関する一般的な話など

のようにLIKE ではデータ全体が一致する必要がありますが、REGEXP では部分的な一致のみが必要...

フォーム要素の垂直方向の中央揃えに最適なソリューション

コードをコピーコードは次のとおりです。 <!DOCTYPE html PUBLIC "...

CSS Houdini でダイナミックな波効果を実現

CSS Houdini は、CSS 分野における最もエキサイティングなイノベーションとして知られてい...