前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >利用WebRTC录制采样的音视频

利用WebRTC录制采样的音视频

作者头像
码农帮派
发布于 2021-01-12 06:52:42
发布于 2021-01-12 06:52:42
1.5K00
代码可运行
举报
文章被收录于专栏:码农帮派码农帮派
运行总次数:0
代码可运行

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等。

如何录制并保存音视频文件到本地

如何录制并保存音视频文件到本地

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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>

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农帮派 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验