最近、業務上の理由により、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 は 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 を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: Linux で MySQL スケジュール タスク バックアップ データを実装する方法
>>: MySQLリモートアクセスの設定方法をステップバイステップで説明します
mysqlはブール型を返します最初のケースでは、直接戻ります select id='22a...
カテゴリ選択を選択します。テストの結果、IE と FF はこの要素を適切にサポートできることがわかり...
メモ帳プログラムは、HTML + CSS + JavaScript の 3 つの主要なフロントエンド...
HTML: タイトル見出しは <h1> - <h6> などのタグによって定...
目次紹介とデモAPI: コンテナ財産ライフサイクルコールバックイベントAPI: ドラッグ可能実際の戦...
質問: Vue にブログ投稿をアップロードするためのフォームがあり、タイトル、本文、説明、スニペット...
マウス効果では、setTimeout を使用して固定時間にノードを生成し、ノードを削除し、生成された...
環境ホストIP 192.168.0.9 Docker バージョン 19.03.2 docker-co...
Django で Web プロジェクトを開発する場合、開発およびテストのプロセスでは Django ...
目次1. 実装2. 問題点3. より良い実装方法があるかどうか検討する要約する背景は日付のタイトルで...
目次レムフォルクスワーゲンサードパーティのUIフレームワークに適応する結論モバイル開発における最も一...
最近、小さなプログラムを開発しているときに、次の設計図のような円形のパーセンテージ進捗状況バーを実装...
1. 概念分析 1: UE ユーザー エクスペリエンス <br />英語ではユーザー エ...
静的ファイルNginx は高いパフォーマンスで知られており、フロントエンドのリバース プロキシ サー...
ファイルとは何ですか?すべてのファイルは実際には文字列のストリームですが、適切な解析方法を使用すると...