最近、業務上の理由により、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リモートアクセスの設定方法をステップバイステップで説明します
目次序文バックグラウンドデータの結合フロントエンドデータ表示ページ効果表示Avue.js は、既存の...
多くの場合、大規模および中規模の Web サイトでは、静的リソース (フォント ファイル、画像など)...
Ubuntu 18.04 上の Apache で動作するように phpMyAdmin をインストール...
MYSQL を使用する場合、トリガーがよく使用されますが、不適切な使用によって問題が発生する場合が...
私はパフォーマンス テストを行うために常に Loadrunner を使用してきました。 Loadru...
第二に、キーワードのランキングは、Webページの表示速度にも関係しています(参照:キーワードランキン...
タブ切り替えもプロジェクトではよく使われる技術です。一般的にタブ切り替えはjsやjqを使って実装され...
この記事の例では、古典的なマインスイーパゲームを実装するためのjsの具体的なコードを参考までに共有し...
vue+el-upload 複数ファイルの動的アップロード、参考までに具体的な内容は以下のとおりです...
ウェブフロントエンド1学生証名前性別年01張三男20 02李思女性21総人数60フォームのコンポーネ...
成果を達成する実装コードhtml <div>123WORDPRESS.COM</d...
1. 遅いクエリログ1.1 MySQL ログの種類ログは、データベースの操作や、ユーザーがデータベー...
1. チェックステータスモジュールがインストールされているかどうかを確認します。 [root@loc...
目次MySQLマスタースレーブの基本原理3つのbinlog形式の比較混合形式のバイナリログが存在する...
今日 Docker コンテナを作成したとき、誤ってイメージの名前を間違って入力しました。その結果、コ...