-
-
Save prof3ssorSt3v3/48621be79794a8a3adeed7971786d4d8 to your computer and use it in GitHub Desktop.
<!DOCTYPE html> | |
<html lang="en"> | |
<head> | |
<meta charset="UTF-8"> | |
<title>MediaCapture and Streams API</title> | |
<meta name="viewport" content="width=device-width"> | |
<link rel="stylesheet" href="main.css"> | |
</head> | |
<body> | |
<header> | |
<h1>MediaCapture, MediaRecorder and Streams API</h1> | |
</header> | |
<main> | |
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Impedit molestiae itaque facere totam saepe tempore esse temporibus, quae reprehenderit aliquid iusto ea laborum, iure eligendi odio exercitationem sapiente illum quos.</p> | |
<p><button id="btnStart">START RECORDING</button><br/> | |
<button id="btnStop">STOP RECORDING</button></p> | |
<video controls></video> | |
<video id="vid2" controls></video> | |
<!-- could save to canvas and do image manipulation and saving too --> | |
</main> | |
<script> | |
let constraintObj = { | |
audio: false, | |
video: { | |
facingMode: "user", | |
width: { min: 640, ideal: 1280, max: 1920 }, | |
height: { min: 480, ideal: 720, max: 1080 } | |
} | |
}; | |
// width: 1280, height: 720 -- preference only | |
// facingMode: {exact: "user"} | |
// facingMode: "environment" | |
//handle older browsers that might implement getUserMedia in some way | |
if (navigator.mediaDevices === undefined) { | |
navigator.mediaDevices = {}; | |
navigator.mediaDevices.getUserMedia = function(constraintObj) { | |
let getUserMedia = navigator.webkitGetUserMedia || navigator.mozGetUserMedia; | |
if (!getUserMedia) { | |
return Promise.reject(new Error('getUserMedia is not implemented in this browser')); | |
} | |
return new Promise(function(resolve, reject) { | |
getUserMedia.call(navigator, constraintObj, resolve, reject); | |
}); | |
} | |
}else{ | |
navigator.mediaDevices.enumerateDevices() | |
.then(devices => { | |
devices.forEach(device=>{ | |
console.log(device.kind.toUpperCase(), device.label); | |
//, device.deviceId | |
}) | |
}) | |
.catch(err=>{ | |
console.log(err.name, err.message); | |
}) | |
} | |
navigator.mediaDevices.getUserMedia(constraintObj) | |
.then(function(mediaStreamObj) { | |
//connect the media stream to the first video element | |
let video = document.querySelector('video'); | |
if ("srcObject" in video) { | |
video.srcObject = mediaStreamObj; | |
} else { | |
//old version | |
video.src = window.URL.createObjectURL(mediaStreamObj); | |
} | |
video.onloadedmetadata = function(ev) { | |
//show in the video element what is being captured by the webcam | |
video.play(); | |
}; | |
//add listeners for saving video/audio | |
let start = document.getElementById('btnStart'); | |
let stop = document.getElementById('btnStop'); | |
let vidSave = document.getElementById('vid2'); | |
let mediaRecorder = new MediaRecorder(mediaStreamObj); | |
let chunks = []; | |
start.addEventListener('click', (ev)=>{ | |
mediaRecorder.start(); | |
console.log(mediaRecorder.state); | |
}) | |
stop.addEventListener('click', (ev)=>{ | |
mediaRecorder.stop(); | |
console.log(mediaRecorder.state); | |
}); | |
mediaRecorder.ondataavailable = function(ev) { | |
chunks.push(ev.data); | |
} | |
mediaRecorder.onstop = (ev)=>{ | |
let blob = new Blob(chunks, { 'type' : 'video/mp4;' }); | |
chunks = []; | |
let videoURL = window.URL.createObjectURL(blob); | |
vidSave.src = videoURL; | |
} | |
}) | |
.catch(function(err) { | |
console.log(err.name, err.message); | |
}); | |
/********************************* | |
getUserMedia returns a Promise | |
resolve - returns a MediaStream Object | |
reject returns one of the following errors | |
AbortError - generic unknown cause | |
NotAllowedError (SecurityError) - user rejected permissions | |
NotFoundError - missing media track | |
NotReadableError - user permissions given but hardware/OS error | |
OverconstrainedError - constraint video settings preventing | |
TypeError - audio: false, video: false | |
*********************************/ | |
</script> | |
</body> | |
</html> |
Downloads MUST be initiated by the user. They have to click the anchor with the express intention of downloading a file. This can't be done before the file is generated.
i have a problem that i think it might be with my apache settings but i'm not sure, so i use the code you published without editing and it still didn't work for me i didn't event get the notification to use my camera when i refreshed my http://localhost/
I have received the blob at server side using multer.
But
- type of file in req.file is converted to text/plain
But how do I save it as a video file there?
@prof3ssorSt3v3 please help me sir.
@prof3ssorSt3v3 Hey, I'm not able to seek in the HTML video player of chrome browser. Is there any configurations that I need to perform to achieve seeking in the player?
Hi
am struggling to store captured video using webcam( js) into file server
Any idea on how can i directly download the video when i press stop recording button?