私はnavigate.getUserMedia()メソッドを使用してモバイルでビデオをキャプチャし、それをさらに処理しています。しかし、現時点では、フロントカメラを使用してビデオをキャプチャしています。背面カメラにアクセスするにはどうすればよいですか?
以下は、アプリケーションで使用しているサンプルコードです。
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia;
if (navigator.getUserMedia){
navigator.getUserMedia({video: true}, successCallback, errorCallback);
前もって感謝します
詳細は this を参照してください。
使用するカメラはデバイスに任されています。「ユーザーエージェントは、デフォルトでユーザーのプライマリまたはシステムのデフォルトカメラまたはマイク(あるいはその両方)を使用してメディアストリームを生成することをお勧めします。」
質問したいのは、デフォルトのカメラをどのように変更できるかということです。しかし、コメントセクションで述べたように、これは使用するデバイスのオペレーティングシステム、ベンダー、またはモデルによって異なり、大きな問題になる可能性があります。
編集(後の回答に基づいて受け入れられた回答を改善する):
カメラのソースを変更する方法については、このブログを参照してください。
このsimpl.infoの例は、MediaStreamTrack.getSources
を使用して複数のビデオソースから選択する方法を示しています。
https://simpl.info/getusermedia/sources/
これがChrome 32で機能することを確認できます。
facingMode
を使用して、前面カメラまたは背面カメラの「ユーザー」または「環境」をそれぞれ選択できます。ブラウザのサポートについては不明ですが、Android Chrome 58。
使用する
navigator.getUserMedia({video: { facingMode: { exact: "environment" } } },
successCallback, errorCallback);
または、他のカメラへのフォールバックを許可する
navigator.getUserMedia({video: { facingMode: "environment" } },
successCallback, errorCallback);
の代わりに
navigator.getUserMedia({video: true}, successCallback, errorCallback);
https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia から
//----------------------------------------------------------------------
// Here we list all media devices, in order to choose between
// the front and the back camera.
// videoDevices[0] : Front Camera
// videoDevices[1] : Back Camera
// I used an array to save the devices ID
// which i get using devices.forEach()
// Then set the video resolution.
//----------------------------------------------------------------------
navigator.mediaDevices.enumerateDevices()
.then(devices => {
var videoDevices = [0,0];
var videoDeviceIndex = 0;
devices.forEach(function(device) {
console.log(device.kind + ": " + device.label +
" id = " + device.deviceId);
if (device.kind == "videoinput") {
videoDevices[videoDeviceIndex++] = device.deviceId;
}
});
var constraints = {width: { min: 1024, ideal: 1280, max: 1920 },
height: { min: 776, ideal: 720, max: 1080 },
deviceId: { exact: videoDevices[1] }
};
return navigator.mediaDevices.getUserMedia({ video: constraints });
})
.then(stream => {
if (window.webkitURL) {
video.src = window.webkitURL.createObjectURL(stream);
localMediaStream = stream;
} else if (video.mozSrcObject !== undefined) {
video.mozSrcObject = stream;
} else if (video.srcObject !== undefined) {
video.srcObject = stream;
} else {
video.src = stream;
}})
.catch(e => console.error(e));
簡単に言うと、faceingMode制約をサポートしていない古いデバイスのリアカメラを選択する場合は、ビデオ内でsourceId: { exact: device.id }
制約を使用する必要があります:{}構成。
長い:
export interface SourceInfo {
facing: string; // "environment"
id: string; // "bcb8d32aebb99fdf1d5f2fdb4ec4ec28a381b83f5e3c96cbcb30c4ab757380da"
kind: string; // "video"
label: string; // ""
}
コード(TypeScript):
(navigator as any).getUserMedia =
(navigator as any).getUserMedia ||
(navigator as any).webkitGetUserMedia ||
(navigator as any).mozGetUserMedia ||
(navigator as any).msGetUserMedia;
if (navigator.getUserMedia && (window as any).MediaStreamTrack) {
(MediaStreamTrack as any).getSources((sources: SourceInfo[]) => {
this.videoSources = sources.filter((source: SourceInfo) => {
return source.kind === 'video';
// or source.facing === 'environment'
});
// console.log('got video sources', this.videoSources);
try {
const rearCameraDevice = this.videoSources.find((device: SourceInfo) => device.facing === 'environment');
const anyCameraDevice = this.videoSources[0];
const constraints = {
video: {
mandatory: {
sourceId: rearCameraDevice.id || anyCameraDevice.id
}
// these both not work with old constraints...it's new syntax
// deviceId: this.videoSources[0].id
// deviceId: { exact: this.videoSources[0].id }
}
};
navigator.getUserMedia(
<any>constraints,
this.successOldStream.bind(this),
this.errorOldStream.bind(this)
);
} catch (error) {
console.error(error);
}
});
} else {
console.error('your browser not supported camera/media capturing')
}