作者: 文章来源:
本文原地址:https://www.mimiwuqi.com/webqianduan/196605.html
目录文章目录如题,今天我们用纯 web 技术,实现摄像头+麦克风 视频的录制功能,代码约 100 余行, 主要涉及的知识点:
video标签使用。
注意:
video和 MediaRecorder这里需要用的就是 MediaDevices,对应的 API 就是navigator.mediaDevices.getUserMedia
核心代码如下:
const stream = await navigator.mediaDevices.getUserMedia({
video: { facingMode: "environment" }, // 唤起内面的摄像头,
audio: true // 需要音频,例如麦克风
})
// 把流传给 video 元素,即可看到摄像头内容
videoEL.srcObject = stream;
// 初始化 MediaRecorder
mediaRecorder = new MediaRecorder(stream, { mimeType: "video/webm" });
注意事项:
user为前置的摄像头,environment为后置摄像头。{ mimeType: "video/webm" }录制必然有开始和停止两个操作,实现方式很多,我们就采用最简单的两个按钮形式, 并分别给注册上相关的事件处理程序。
代码如下:
这里有一个小的知识点,任何有 id 属性的节点,你均可使用 id 属性对应的变量直接访问该元素。
<button id="btnRecord" >录制</button>
<button id="btnStop" >停止</button>
btnRecord.addEventListener("click", () => {
startRecord(mediaRecorder);
mediaRecorder.start();
});
btnStop.addEventListener("click", () => {
mediaRecorder.stop();
})
是不是很简单。 注意上面停止按钮点击后,我们调用了mediaRecorder.stop方法,其之后会触发recorder.onstop事件,这个时候,我们唤起弹出框,让用户输入视频的名字,然后将内容保存到 indexedDB 即可。
indexedDB 的存取有很多封装库,indexedDB 参见部分列出了不少于 10 个库,这里我们采用 idb-keyval库,其简单且小巧的(~600B)基于 Promise 的键值对存储,使用也是极其简单,get, set 就行了。
具备上面的知识后,看代码:是不是很简单。
function startRecord(recorder) {
var chunks = [];
// 收集数据
recorder.ondataavailable = function (e) {
chunks.push(e.data);
}
// 监听停止事件
recorder.onstop = async () => {
var clipName = prompt('请输入视频的名字');
var blob = new Blob(chunks, { 'type': 'audio/mp4;' });
await idbKeyval.set(clipName + ".mp4", blob);
listHistory();
}
}
历史嘛,那就是读取 keys,严格意义上,应该使用 indexedDB 的游标来读取,本文为了简单,直接读取所有的 keys,然后判断文件后缀来过滤。
async function listHistory() {
list.innerHTML = null;
const keys = await idbKeyval.keys();
console.log("keys:", keys);
keys.filter(k => k.endsWith(".mp4")).forEach(key => {
const divEl = document.createElement("div");
divEl.textContent = key;
divEl.onclick = () => playVideo(key);
list.appendChild(divEl);
});
}
到此为止,我们就差点击某个历史视频之后的播放逻辑了,也很简单:
async function playVideo(key) {
const blob = await idbKeyval.get(key);
// 生成地址
fplayer.src = URL.createObjectURL(blob);
fplayer.style.display = "block";
fplayer.play();
}
到此文本,所有的核心代码都已经实现了。
是不是很简单,一切都看起来没那么难,这样,你才容易入坑啊。
原文链接:点击这里
更多 建站教程 请访问 https://www.mimiwuqi.com/webqianduan/