const ensureInput = (value: unknown): HTMLInputElement => {
if (!(value instanceof HTMLInputElement)) throw "Invalid HTML element!"
return value
}
const ensureVideo = (value: unknown): HTMLVideoElement => {
if (!(value instanceof HTMLVideoElement)) throw "Invalid HTML element!"
return value
}
async function play() {
// Get video stream
const webcam = await navigator.mediaDevices.getUserMedia({
audio: true,
video: true,
})
// Display video
const video = ensureVideo(document.querySelector("video"))
video.srcObject = webcam
// Recorder
const mediaRecorder = new MediaRecorder(webcam, {
mimeType: "video/webm",
videoBitsPerSecond: 3000000,
})
const user = ensureInput(document.querySelector("#user")).value
const password = ensureInput(document.querySelector("#password")).value
const server = ensureInput(document.querySelector("#server")).value
const port = ensureInput(document.querySelector("#port")).value
const mount = ensureInput(document.querySelector("#mount")).value
const url = `ws://${user}:${password}@${server}:${port}/${mount}`
const ws = new window.Webcast.Socket({
mediaRecorder,
url: url,
info: {},
})
// Start recording
mediaRecorder.start(1000 / 20) // 20 fps
function stop() {
mediaRecorder.stop()
webcam.getTracks().forEach(track => track.stop())
video.srcObject = null
}
ensureInput(document.querySelector("#stop")).addEventListener("click", stop)
}
window.onload = function () {
ensureInput(document.querySelector("#start")).addEventListener("click", play)
}