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がブール型を返すいくつかの状況について簡単に説明します。

mysqlはブール型を返します最初のケースでは、直接戻ります select id='22a...

HTML チュートリアル、optgroup 要素の理解

カテゴリ選択を選択します。テストの結果、IE と FF はこの要素を適切にサポートできることがわかり...

JS はシンプルな todoList (メモ帳) 効果を実装します

メモ帳プログラムは、HTML + CSS + JavaScript の 3 つの主要なフロントエンド...

HTML 基本要約推奨事項 (タイトル)

HTML: タイトル見出しは <h1> - <h6> などのタグによって定...

Vueのドラッグ可能なコンポーネントであるVue Smooth DnDの使用方法の詳細な説明

目次紹介とデモAPI: コンテナ財産ライフサイクルコールバックイベントAPI: ドラッグ可能実際の戦...

Vueフォームで画像を処理する方法

質問: Vue にブログ投稿をアップロードするためのフォームがあり、タイトル、本文、説明、スニペット...

マウスの尾行効果を実現する JavaScript

マウス効果では、setTimeout を使用して固定時間にノードを生成し、ノードを削除し、生成された...

Docker-compose を使用して ELK をデプロイするためのサンプル コード

環境ホストIP 192.168.0.9 Docker バージョン 19.03.2 docker-co...

nginx+uwsgi で Django プロジェクトを開始するための詳細な手順

Django で Web プロジェクトを開発する場合、開発およびテストのプロセスでは Django ...

WeChatアプレットを使用して天井効果を実現する方法の例

目次1. 実装2. 問題点3. より良い実装方法があるかどうか検討する要約する背景は日付のタイトルで...

webpackのモバイル適応ソリューションの概要

目次レムフォルクスワーゲンサードパーティのUIフレームワークに適応する結論モバイル開発における最も一...

Vue は動的な円形のパーセンテージ進捗バーを実装します

最近、小さなプログラムを開発しているときに、次の設計図のような円形のパーセンテージ進捗状況バーを実装...

理論の普及——ユーザーエクスペリエンス

1. 概念分析 1: UE ユーザー エクスペリエンス <br />英語ではユーザー エ...

Nginx 静的サービス設定の詳細な説明 (ルートとエイリアスの指示)

静的ファイルNginx は高いパフォーマンスで知られており、フロントエンドのリバース プロキシ サー...

Linux の crw、brw、lrw などのファイル属性は何ですか?

ファイルとは何ですか?すべてのファイルは実際には文字列のストリームですが、適切な解析方法を使用すると...