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リモートアクセスの設定方法をステップバイステップで説明します

推薦する

複数レベルの複雑な動的ヘッダーの avue-crud 実装例

目次序文バックグラウンドデータの結合フロントエンドデータ表示ページ効果表示Avue.js は、既存の...

Apache クロスドメイン リソース アクセス エラーの解決策

多くの場合、大規模および中規模の Web サイトでは、静的リソース (フォント ファイル、画像など)...

Ubuntu 18.04 に phpMyAdmin をインストールするための詳細なチュートリアル

Ubuntu 18.04 上の Apache で動作するように phpMyAdmin をインストール...

MySQL でトリガーを無効化および有効化するチュートリアル [推奨]

MYSQL を使用する場合、トリガーがよく使用されますが、不適切な使用によって問題が発生する場合が...

Apache での ab パフォーマンス テスト結果を分析する

私はパフォーマンス テストを行うために常に Loadrunner を使用してきました。 Loadru...

ウェブページの読み込み速度を上げる6つのヒント

第二に、キーワードのランキングは、Webページの表示速度にも関係しています(参照:キーワードランキン...

タブ切り替えを実装するための HTML サンプル コード

タブ切り替えもプロジェクトではよく使われる技術です。一般的にタブ切り替えはjsやjqを使って実装され...

jsは古典的なマインスイーパゲームを実装します

この記事の例では、古典的なマインスイーパゲームを実装するためのjsの具体的なコードを参考までに共有し...

vue+el-upload は複数ファイルの動的アップロードを実現します

vue+el-upload 複数ファイルの動的アップロード、参考までに具体的な内容は以下のとおりです...

Tableとdivの簡単な紹介と使い方

ウェブフロントエンド1学生証名前性別年01張三男20 02李思女性21総人数60フォームのコンポーネ...

CSS3で実装されたテキストポップアップ効果

成果を達成する実装コードhtml <div>123WORDPRESS.COM</d...

さまざまなMySQLインデックスの使用方法の詳細な説明

1. 遅いクエリログ1.1 MySQL ログの種類ログは、データベースの操作や、ユーザーがデータベー...

Nginx 構成検出サービスのステータスを実装する方法

1. チェックステータスモジュールがインストールされているかどうかを確認します。 [root@loc...

MySQL はどのようにしてマスターとスレーブの一貫性を確保するのでしょうか?

目次MySQLマスタースレーブの基本原理3つのbinlog形式の比較混合形式のバイナリログが存在する...

Dockerで同じIDを持つ2つのイメージを削除する

今日 Docker コンテナを作成したとき、誤ってイメージの名前を間違って入力しました。その結果、コ...