zoukankan      html  css  js  c++  java
  • vue 录屏 'getDisplayMedia' of undefined

    点击录屏,报错:“getDisplayMedia” of undefined,无法调用浏览器原生api,获取不了屏幕流

     webpack.dev.conf.js  中配置项修改

    host: 'localhost',

     

    <template>
      <div class="container">
        <section class="item">
          <span class="type-name">文件名称:</span>
          <input type="text" v-model.trim="fileName"/>
          <span>.mp4</span>
        </section>
        <section class="item">
          <span class="type-name">录制时长</span>
          <span>{{timeLong}}s</span>
        </section>
        <section>
          <button class="media-btn" @click="clicks()" title="点击开始录制">{{txt}}</button>
        </section>
      </div>
    </template>
    
    <script>
    export default {
      data() {
        return {
          timeout: 0,
          recordedBlobs: [],
          fileName: "",
          txt: "开始录制",
          status: false,
          stream: null,
          options: {
            audioBitsPerSecond: 128000,
            videoBitsPerSecond: 4500000,
            mimeType: "video/webm",
          },
          startTime: 0,
          timeLong: 0,
          timeLongs: null,
          endTime: 0,
        };
      },
      watch: {
        status(a) {
          if (a) {
            this.txt = "停止录制";
          } else {
            this.txt = "开始录制";
          }
        },
      },
      methods: {
        clicks() {
          if (this.status) {
            this.stopReset();
            this.status = false;
            clearInterval(this.timesLongs);
          } else {
            this.startScreen();
          }
        },
        cauTime() {
          this.timeLongs = setInterval(() => {
            this.timeLong = (new Date().getTime() - this.startTime) / 1000;
          }, 200);
        },
        stopReset() {
          this.stream.getTracks().forEach((track) => track.stop());
          this.recordedBlobs = [];
        },
        startScreen() {
        //注意,加上 audio: true 之后底部可以拖动的停止就失效了,正在fixing
          navigator.mediaDevices.getDisplayMedia({ video: true, audio: true }).then(
            (stream) => {
              this.status = !this.status;
              console.log("开始录制");
              this.startTime = new Date().getTime();
              this.cauTime();
    
              this.stream = stream;
              const mediaRecorder = new MediaRecorder(stream, this.options);
              mediaRecorder.ondataavailable = (event) => {
                if (event.data.size > 0) {
                  this.status = false;
                  clearInterval(this.timeLongs);
                  console.log(
                    "结束录制,录制时长:" +
                      this.timeLong+
                      "s"
                  );
                  this.recordedBlobs.push(event.data);
                  this.download();
                  this.stopReset();
                }
              };
              mediaRecorder.start();
            },
            (error) => console.log(error)
          );
        },
        download() {
          const blob = new Blob(this.recordedBlobs, { type: "video/mp4" });
          const url = URL.createObjectURL(blob);
          const a = document.createElement("a");
          document.body.appendChild(a);
          a.style.display = "none";
          a.href = url;
          if (this.fileName) {
            a.download = this.fileName + ".mp4";
          } else {
            a.download = new Date() + ".mp4";
          }
          a.click();
          window.URL.revokeObjectURL(url);
        },
      },
    };
    </script>
    
    <style scoped>
    .container {
       450px;
      height: 250px;
      border: 1px solid;
    }
    .item {
      display: flex;
      align-items: center;
      margin: 25px 0;
      font-size: 20px;
    }
    .item .unit {
      margin-left: 10px;
    }
    .item input {
      height: 30px;
      padding: 1px;
      padding-left: 5px;
    }
    .item input[type="text"] {
       180px;
    }
    .item input[type="number"] {
       80px;
    }
    .type-name {
       30%;
    }
    .media-btn {
      background: rgb(146, 224, 214);
      border: none;
      padding: 8px;
      border-radius: 5px;
      cursor: pointer;
      font-weight: 800;
      outline: none;
    }
    .media-btn:hover {
      background: rgb(155, 235, 224);
    }
    
    .tip {
      background-color: rgb(248, 243, 172);
      display: inline-block;
      padding: 19px;
      font-size: 25px;
      font-weight: 900;
      border-radius: 3px;
      margin-top: 19px;
    }
    </style>
    
    //使用
    
    <Screen/>
    ...
    
    import Screen'@/components/screen.vue';
    
    components: {
        Screen
      }
    
    demo:https://mingchen3398.gitee.io/tools/screen-vue/index.html#/
    
    注意,navigator.mediaDevices.getDisplayMedia({ video: true, audio: true }),
    此处加上 audio:true之后,点击停止共享整个页面的停止都失效了,只能刷新页面解决,之前的录屏也不会被保存!!!

    原文链接:https://blog.csdn.net/weixin_41727824/article/details/107707949

  • 相关阅读:
    爬虫大作业之爬取笔趣阁小说
    数据结构化与保存
    使用正则表达式,取得点击次数,函数抽离
    爬取校园新闻首页的新闻
    网络爬虫练习
    Hadoop综合大作业
    理解MapReduce
    熟悉常用的HBase操作
    熟悉常用的HDFS操作
    爬虫大作业
  • 原文地址:https://www.cnblogs.com/minghan/p/14323828.html
Copyright © 2011-2022 走看看