美文网首页
MediaRecorder录屏并定时上传

MediaRecorder录屏并定时上传

作者: Neuro_annie | 来源:发表于2024-08-19 17:52 被阅读0次
    // 开始屏幕录制
    async startRecording() {
      const stream = await invokeGetDisplayMedia();
      if(!stream) return;
      let videoIndex = 0;  //录屏分片序号
      let dataArr = [];  // 本地看视频
      let mediaRecorderTimer = null;  // 定时上传录屏文件
      const mime = MediaRecorder.isTypeSupported("video/webm;codecs=h264")
        ? "video/webm;codecs=h264"
        : "video/webm";
      const mediaRecorder = new MediaRecorder(stream, { mimeType: mime });
      mediaRecorder.ondataavailable = event => {
        if (event.data && event.data.size > 0) {
          dataArr.push(event.data); 
          if(mediaRecorder.state === 'inactive') {  // 判断是否停止录制
            // to do
            let mediaBlob = new Blob(dataArr, { type: "video/webm" });
            document.getElementById("recVideo").src = window.URL.createObjectURL(mediaBlob);
          }
          const formData = new FormData();
          formData.append("videoIndex", videoIndex)
          formData.append("file", event.data)
          request({
            url: '/upload',
            method: 'post',
            headers: { 'Content-Type': 'multipart/form-data' },
            responseType: 'blob',
            data: formData,
            timeout: 1000 * 60 * 10,
          })
          videoIndex++;
        }
      };
    
      // 初始化开始
      mediaRecorder.start();
    
      // 监听停止录屏
      mediaRecorder.onstop = () => {
        clearInterval(mediaRecorderTimer);
       mediaRecorderTimer = null;
      } 
    
      // 设置定时上传录屏分片
     mediaRecorderTimer = setInterval(() => {
        if (mediaRecorder) {
          mediaRecorder.requestData();
        }
      }, 10000); // 每10000毫秒请求一次
    }
    
    // 获取屏幕录制授权
    async invokeGetDisplayMedia() {
      return new Promise(async (resolve, reject) => {
        if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
          const displaymediastreamconstraints = {
            video: true,
            audio: {
              echoCancellation: true,
              noiseSuppression: true,
              sampleRate: 44100,
            },
            screen: true,
            preferCurrentTab: true,
          };
          const stream = await navigator.mediaDevices.getDisplayMedia(
            displaymediastreamconstraints
          );
          if (stream) {
            resolve(stream);
          } else {
            reject(false);
          }
        } else {
          console.log('浏览器不支持getUserMedia');
          reject(false);
        }
      });
    }
    

    注意
    让后端拿到全部的视频流文件再去转成视频,如果拿到第一个就转,那么后面的切片文件会缺少头部数据,视频将无法正常拼接。

    相关文章

      网友评论

          本文标题:MediaRecorder录屏并定时上传

          本文链接:https://www.haomeiwen.com/subject/dcnmkjtx.html