WebRTC录制音视频流之后,最终是通过Blob对象将数据保存成多媒体文件的,而Blob与ArrayBuffer和ArrayBufferView有着密切的关系。
1. ArrayBuffer
ArrayBuffer对象表示通用的、固定长度的二进制数据缓冲区,可以直接使用ArrayBuffer存储图片和音视频文件。但是并不能直接对ArrayBuffer进行访问,只有对ArrayBuffer具体类型化之后,才能够对访问并存储到内存中。
2. ArrayBufferView
ArrayBufferView并不是一个具体的数据类型,而是不同类型Array的总称,这些类型包括:Int8Array、Uint8Array、DataView等等。
以Int8Array为例,当对数据进行实例化之后,计算机会在内存中为其分配一块内存空间,在该空间中的每一个元素是8位整数。
ArrayBuffer和ArrayBufferView的区别在于,ArrayBufferView指的是Int8Array、Uint8Array以及DataView等类型的总称,而这些类型都是使用ArrayBuffer类实现的。
3. Blob
Blob是Javascript的大型二进制对象类型,WebRTC最终是使用Blob将录制好的的音视频流保存成多媒体文件的,而Blob的底层是由ArrayBuffer对象的封装类实现的,即Int8Array、Uint8Array等。
如何录制并保存音视频文件到本地
如何录制并保存音视频文件到本地
<template>
<div class="panel">
<video class="small_panel" autoplay playsinline></video>
</div>
<video class="small_panel panel" id="recvideo"></video>
<div class="record_operate">
<button @click="handleStartRecord">开始录制</button>
<button @click="handleRecVideo">回放</button>
<button @click="handleDownloadVideo">下载</button>
</div>
</template>
<script>
import { defineComponent, onMounted } from "vue";
export default defineComponent({
name: "TestWebRTC",
setup () {
// 采集视频数据
const getUserMedia = () => {
const mediaStreamConstrains = {
video: true,
};
const localVideo = document.querySelector('video');
navigator.mediaDevices.getUserMedia(mediaStreamConstrains).then((mediaStream) => {
localVideo.srcObject = mediaStream;
// 将mediaStream挂载到window上
window.mediaStream = mediaStream;
}).catch((error) => {
console.log('[Error]getUSerMedia:', error);
});
};
// 音视频录制,缓存音视频流
let mediaBufferArray = [];
// 开始录制音视频
const handleStartRecord = () => {
mediaBufferArray = [];
const options = { // 使用vp8编码
mimeType: "video/webm;codecs=vp8",
};
if (!MediaRecorder.isTypeSupported(options.mimeType)) {
console.log("[Error]mimeType not Supported");
return;
}
let mediaRecorder = null;
try {
mediaRecorder = new MediaRecorder(window.mediaStream, options);
} catch (e) {
console.log("[Error]init MediaRecorder:", e);
return;
}
mediaRecorder.ondataavailable = (e) => {
if (e && e.data && e.data.size > 0) {
mediaBufferArray.push(e.data);
}
};
// 开始录制
// 这里设定每10ms下发一次Buffer
mediaRecorder.start(10);
};
// 音视频回放
const handleRecVideo = () => {
let blob = new Blob(mediaBufferArray, { type: 'video/webm' });
const recVideo = document.querySelector('video#recvideo');
recVideo.src = window.URL.createObjectURL(blob);
recVideo.srcObject = null;
recVideo.controls = true;
recVideo.play();
};
const handleDownloadVideo = () => {
const blob = new Blob(mediaBufferArray, { type: 'video/webm' });
const url = window.URL.createObjectURL(blob);
const aTag = document.createElement('a');
aTag.href = url;
aTag.download = 'video_' + new Date().getTime() + '.webm';
document.body.appendChild(aTag);
aTag.click();
aTag.remove();
};
onMounted(() => {
getUserMedia();
});
return {
handleStartRecord,
handleRecVideo,
handleDownloadVideo,
};
}
})
</script>
<style scoped>
.panel { text-align: center; margin-top: 20px; }
.small_panel { width: 160px; height: 160px; }
</style>
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有