vue 在线录音录屏实现

前言

如何实现浏览器的在线录屏、系统声音以及麦克风

一、在线录屏实现

需借助浏览器的navigator.mediaDevices.getDisplayMedia以及navigator.mediaDevices.getUserMedia实现此功能,包含浏览器内置声音、麦克风输入、视频输入以及预览等功能
在这里插入图片描述

二、使用

1.录屏

开启屏幕权限

let screenStream = await navigator.mediaDevices.getDisplayMedia({
 video: true
});

2.系统声音

代码如下(示例):

await navigator.mediaDevices.getDisplayMedia({
  audio: true
});

3.麦克风

代码如下(示例):

navigator.mediaDevices.getUserMedia({
 audio: true,
});

4.视频

代码如下(示例):

navigator.mediaDevices.getUserMedia({
  video: true,
});

5.如何同时录屏以及系统声音

代码如下(示例):

let screenStream = await navigator.mediaDevices.getDisplayMedia({
 video: true,
 audio: true
});

5.如何同时录屏以及系统声音

代码如下(示例):

let screenStream = await navigator.mediaDevices.getDisplayMedia({
 video: true,
 audio: true
});

在这里插入图片描述

6.如何同时录屏、系统声音以及麦克风

代码如下(示例):

// 屏幕权限
      let screenStream = await navigator.mediaDevices.getDisplayMedia({
        video: true,
        audio: checkList.value.includes("voice")?true:false
      });

      // 获取麦克风
      let audioPromiseStream = navigator.mediaDevices.getUserMedia({
          audio: true,
        });
        
     let stream = new MediaStream([...screenStream.getTracks(),...audioPromiseStream.getTracks()]);

7.如何实现完整的视频录制

<template>
  <div>
    <h2>视频录制</h2>
    <button @click="startScreenRecording">Start Recording</button>
    <button @click="stopScreenRecording">Stop Recording</button>

    <br />
    <video v-if="videoUrl" controls :src="videoUrl"></video>
  </div>
</template>

<script>
import RecordRTC from "recordrtc";
import { ElMessage } from "element-plus";
let mediaRecorder;

let recordedChunks = [];
export default {
  data() {
    return {
      videoUrl: "",
    };
  },
  methods: {
    getScreenStream() {
      console.log("getScreenStream进来了");
      return new Promise(async (resolve, reject) => {
        try {
          console.log("promise进来了");
          // if (
          //   navigator.mediaDevices &&
          //   navigator.mediaDevices.getDisplayMedia
          // ) {
          const videoStream = await navigator.mediaDevices.getDisplayMedia({
            video: true,
          });

          // 获取音频流
          const audioStreamPromise = navigator.mediaDevices.getUserMedia({
            audio: true,
          });

          console.log("audioStreamPromise====", audioStreamPromise);

          audioStreamPromise
            .then((audioStream) => {
              let stream = new MediaStream([
                ...videoStream.getTracks(),
                ...audioStream.getTracks(),
              ]);
              resolve(stream);
            })
            .catch((error) => {
              console.error("获取音频流失败", error);
              // 处理错误,可能需要停止视频流或通知用户
              reject(error);
            });

          // return endstream;

          // }
        } catch (error) {
          console.log(error);
          if(error.message.indexOf("Permission") > -1){
            ElMessage.error("请开启电脑屏幕共享权限");
          } else {
            ElMessage.error(error);
          }
          reject(error);
        }
      });
    },
    startRecording(stream) {
      const that = this;
      recordedChunks = [];

      if (!stream) {
        ElMessage.error("steam不正确");
        return;
      }

      // 监听暂停
      if (stream) {
        stream.getTracks().forEach((track) => {
          track.addEventListener("ended", () => {
            that.stopScreenRecording();
          });
        });
      }

      //
      mediaRecorder = new MediaRecorder(stream, {
        mimeType: "video/webm; codecs=vp9,opus",
      });

      mediaRecorder.ondataavailable = function (event) {
        if (event.data.size > 0) {
          recordedChunks.push(event.data);
        }
      };

      mediaRecorder.onstop = function () {
        const blob = new Blob(recordedChunks, {
          type: "video/webm",
        });

        that.downloadRecording(blob);
      };

      mediaRecorder.start();
    },
    async startScreenRecording() {
      console.log("开始录音");
      const stream = await this.getScreenStream();

      console.log("stream====", stream);
      this.startRecording(stream);
    },

    stopScreenRecording() {
      if (mediaRecorder && mediaRecorder.state !== "inactive") {
        mediaRecorder.stop();
      }
    },

    downloadRecording(blob) {
      const url = URL.createObjectURL(blob);

      console.log("blob===", blob);

      this.videoUrl = url;

      const a = document.createElement("a");

      document.body.appendChild(a);

      a.style = "display: none";

      a.href = url;

      a.download = "screen_recording.webm";

      a.click();

      window.URL.revokeObjectURL(url);
    },
  },
};
</script>

总结

亲测有效,欢迎评论收藏…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

COCO_356

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值