Spaces:
Running
Running
from IPython.display import display, Javascript, HTML | |
from google.colab.output import eval_js | |
from base64 import b64decode, b64encode | |
def record_video(filename): | |
js = Javascript(""" | |
async function recordVideo() { | |
const options = { mimeType: "video/webm; codecs=vp9" }; | |
const div = document.createElement('div'); | |
const capture = document.createElement('button'); | |
const stopCapture = document.createElement("button"); | |
capture.textContent = "Start Recording"; | |
capture.style.background = "orange"; | |
capture.style.color = "white"; | |
stopCapture.textContent = "Stop Recording"; | |
stopCapture.style.background = "red"; | |
stopCapture.style.color = "white"; | |
div.appendChild(capture); | |
const video = document.createElement('video'); | |
const recordingVid = document.createElement("video"); | |
video.style.display = 'block'; | |
const stream = await navigator.mediaDevices.getUserMedia({audio:true, video: true}); | |
let recorder = new MediaRecorder(stream, options); | |
document.body.appendChild(div); | |
div.appendChild(video); | |
video.srcObject = stream; | |
video.muted = true; | |
await video.play(); | |
google.colab.output.setIframeHeight(document.documentElement.scrollHeight, true); | |
await new Promise((resolve) => { | |
capture.onclick = resolve; | |
}); | |
recorder.start(); | |
capture.replaceWith(stopCapture); | |
await new Promise((resolve) => stopCapture.onclick = resolve); | |
recorder.stop(); | |
let recData = await new Promise((resolve) => recorder.ondataavailable = resolve); | |
let arrBuff = await recData.data.arrayBuffer(); | |
// stop the stream and remove the video element | |
stream.getVideoTracks()[0].stop(); | |
div.remove(); | |
let binaryString = ""; | |
let bytes = new Uint8Array(arrBuff); | |
bytes.forEach((byte) => { | |
binaryString += String.fromCharCode(byte); | |
}) | |
return btoa(binaryString); | |
} | |
""") | |
try: | |
display(js) | |
data = eval_js('recordVideo({})') | |
binary = b64decode(data) | |
with open(filename, "wb") as video_file: | |
video_file.write(binary) | |
print(f"Finished recording video at:{filename}") | |
except Exception as err: | |
print(str(err)) | |
def show_video(video_path, video_width=600): | |
video_file = open(video_path, "r+b").read() | |
video_url = f"data:video/mp4;base64,{b64encode(video_file).decode()}" | |
return HTML(f"""<video width={video_width} controls><source src="{video_url}"></video>""") |