Javascript: Menampilkan Preview Dan List Camera Device
Contoh koding untuk menampilkan preview dan list camera device di Javascript
Jadi semua device camera (video input) yang ada pada client browser ditampilkan pada list, setelah dipilih salah satu tampil juga preview dari camera tersebut
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Camera Device</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<h1 class="my-4">Camera Device</h1>
<button class="btn btn-primary btn-block mb-2" id="btnMulai">Mulai</button>
<a href="index.php" id="btnSelesai" class="btn btn-danger btn-block mb-4 d-none">Selesai</a>
<div class="form-group mb-2 d-none" id="formKamera">
<label for="selectKamera">Pilih Kamera</label>
<select class="form-control" id="selectKamera"></select>
</div>
<div class="d-flex justify-content-center">
<video id="video" autoplay class="mb-2" style="width: 300px; height: 300px; display: none;"></video>
</div>
</div>
<script>
// inisialisasi
const video = document.getElementById("video");
const deviceList = document.getElementById("selectKamera");
const btnMulai = document.getElementById("btnMulai");
const btnSelesai = document.getElementById("btnSelesai");
const formKamera = document.getElementById("formKamera");
let currentStream;
// mengambil semua list device (video input)
function getVideoDevices() {
navigator.mediaDevices
.enumerateDevices()
.then((devices) => {
// bersihkan dulu semua opsi untuk select kamera
while (deviceList.firstChild) {
deviceList.removeChild(deviceList.firstChild);
}
// ambil device dengan jenis video input
const videoDevices = devices.filter(
(device) => device.kind === "videoinput"
);
// membuat option untuk select kamera
videoDevices.forEach((device, index) => {
const option = document.createElement("option");
option.value = device.deviceId;
option.text = device.label || `Camera ${index + 1}`;
deviceList.appendChild(option);
});
// jika ada list, tampilkan preview dari device pertama
if (videoDevices.length > 0) {
const firstDeviceId = videoDevices[0].deviceId;
setupWebcam(firstDeviceId);
}
})
.catch((err) => {
console.error("Error enumerating video devices: ", err);
});
}
// setup preview kamera berdasarkan device id
function setupWebcam(deviceId) {
// cek device id, jika tidak tersedia maka tampilkan camera default
const constraints = {
video: deviceId ? {
deviceId: {
exact: deviceId
}
} : true
};
navigator.mediaDevices
.getUserMedia(constraints)
.then((stream) => {
stopStream();
currentStream = stream;
video.srcObject = stream;
})
.catch((err) => {
console.error("Error accessing the webcam: ", err);
});
}
function stopStream() {
if (currentStream) {
currentStream.getTracks().forEach((track) => track.stop());
}
}
// button mulai saat di klik
btnMulai.addEventListener('click', function() {
formKamera.classList.remove("d-none");
btnSelesai.classList.remove("d-none");
video.style.display = "block";
// akses camera permission
navigator.mediaDevices.getUserMedia({
video: true
})
.then(() => {
// load semua list device
getVideoDevices();
})
.catch((err) => {
console.error("Error accessing the webcam: ", err);
});
});
// set preview berdasarkan pilihan device
deviceList.addEventListener('change', function() {
const selectedDeviceId = deviceList.value;
if (selectedDeviceId) {
setupWebcam(selectedDeviceId);
}
});
</script>
</body>
</html>
- Hanya bekerja pada environment
localhost
danhttps
- Jika diakses dengan device Android (online), maka hanya bisa preview kamera depan saja
- Bisa menggunakan aplikasi DroidCam untuk mengakses dengan device Android secara localhost (offline)