san*_*eep 4 google-colaboratory
我看到 Colab 团队提供了一种通过 Colab 捕获图像的方法,但是有什么方法可以捕获视频吗?
最近我也在寻找答案时看到了这篇文章。我最终不得不编写自己的片段,因为我找不到任何东西。这就是我最终得到的结果,以防有帮助。该代码被分成两个单独的单元。我正在使用Python 3和Google Chrome:
from IPython.display import display, Javascript
from google.colab.output import eval_js
from base64 import b64decode
def record_video(filename='video.mp4'):
# This function uses the take_photo() function provided by the Colab team as a
# starting point, along with a bunch of stuff from Stack overflow, and some sample code
# from: https://developer.mozilla.org/enUS/docs/Web/API/MediaStream_Recording_API
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 = "green";
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({video: true});
let recorder = new MediaRecorder(stream, options);
document.body.appendChild(div);
div.appendChild(video);
video.srcObject = stream;
await video.play();
// Resize the output to fit the video element.
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();
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. Saved binary under filename in current working directory: {filename}"
)
except Exception as err:
# In case any exceptions arise
print(str(err))
return filename
Run Code Online (Sandbox Code Playgroud)
# Run the function, get the video path as saved in your notebook, and play it back here.
from IPython.display import HTML
from base64 import b64encode
video_width = 300
video_path = record_video()
video_file = open(video_path, "r+b").read()
video_url = f"data:video/mp4;base64,{b64encode(video_file).decode()}"
HTML(f"""<video width={video_width} controls><source src="{video_url}"></video>""")
Run Code Online (Sandbox Code Playgroud)
这是笔记本的链接:https://github.com/emilyxxie/colab_utils_and_snippets/blob/master/video_webcam_snippets.ipynb
| 归档时间: |
|
| 查看次数: |
4275 次 |
| 最近记录: |