zoukankan      html  css  js  c++  java
  • vue 使用浏览器实现录音功能

    在项目vue中遇到使用浏览器实现录音功能

    要在https下才能实现! 要在https下才能实现!! 要在https下才能实现!!!

    如果不是https,解决方案  https://www.cnblogs.com/Sabo-dudu/p/12449985.html

    注意:  这里输入的文件格式为mp3,因为 wav格式的文件太大了。

    项目是基于 vue-cli3 的pc端应用

    1. 下载文件,下载完成后把它放在  根目录  public  文件夹下。 

    下载地址 链接: https://pan.baidu.com/s/1lSve9B5zbCS21TzOEAhm8w  提取码: qf69

     2. 然后在 index.html 中全局引入 

        <script type="text/javascript" src="/recorder/js/recorder.js"></script>
    

     3. 创建组件 mRecorder.vue 

    <template>
      <div class="wrap-recorder">
        <el-row>
          <el-col>
            <svg
              @click="handleClick"
              :class="['icon', {anirecorder: recording } ]"
              t="1581399509621"
              viewBox="0 0 1024 1024"
              version="1.1"
              xmlns="http://www.w3.org/2000/svg"
              p-id="3242"
              width="50"
              height="50"
            >
              <path
                d="M512 1024a512 512 0 1 1 512-512 512 512 0 0 1-512 512z m0-992a480 480 0 1 0 480 480A480 480 0 0 0 512 32z m16 623.2V736h48a16 16 0 0 1 0 32h-128a16 16 0 0 1 0-32h48v-80.8A160 160 0 0 1 352 496a16 16 0 0 1 32 0 128 128 0 0 0 256 0 16 16 0 0 1 32 0 160 160 0 0 1-144 159.2zM512 592a96 96 0 0 1-96-96v-144a96 96 0 0 1 192 0v144a96 96 0 0 1-96 96z m64-240a64 64 0 0 0-128 0v144a64 64 0 0 0 128 0v-144z"
                p-id="3243"
                fill="#707070"
              />
            </svg>
          </el-col>
        </el-row>
        <p class="tip">{{ tiptext }}</p>
      </div>
    </template>
    <script>
    export default {
      data() {
        return {
          tiptext: "点击录音",
          recording: false, // 标记是否在录音
          intervaltimerid: "", // 间隔时间定时器编号
          recorder: null,
          time: 0
        };
      },
      mounted() {
        this.init();
      },
      methods: {
        init() {
          this.recorder = new MP3Recorder({
            //numChannels: 1,     //声道数,默认为1
            //sampleRate: 8000,   //采样率,一般由设备提供,比如 48000
            bitRate: 128, //比特率,不要低于64,否则可能录制无声音(人声)
            //useMediaRecorder: true, //是否使用MediaRecorder录音(不支持转码为mp3文件)
            //recorderType: "video/webm;codes=vp9",  //默认编码,仅 useMediaRecorder 为true且浏览器支持时生效
            //录音结束事件
            complete: (blob, ext) => {
              var url = URL.createObjectURL(blob);
              this.$emit("handleStop", {
                url: url,
                mblob: blob
              });
            }
          });
        },
        // 点击处理
        handleClick() {
          //录音支持检测
          if (!this.recorder.support) return;
          this.recording = !this.recording;
          this.$emit("handleStop", {
            url: "",
            mblob: null,
          });
          if (this.recording) {
            this.time = 0;
            this.tiptext = "录音中 " + this.time + "s";
            this.recorder.start(this.successFun(), this.errorFun());
          } else {
            clearInterval(this.intervaltimerid);
            this.recorder.stop();
            this.tiptext = "点击录音";
          }
        },
        writeError() {},
        successFun() {
          this.intervaltimerid = setInterval(() => {
            // 开始累积
            if (this.time == 120) {
              this.recorder.stop();
              this.recording = false;
              this.tiptext = "点击录音";
              this.$message.warning("对不起,录音只支持120秒以内的语音!");
              clearInterval(this.intervaltimerid);
              return false;
            }
            this.time = this.time + 1;
            this.tiptext = "录音中 " + this.time + "s";
          }, 1000);
        },
        errorFun(e) {
          // clearInterval(this.intervaltimerid);
          // switch (e.code || e.name) {
          //   case "PERMISSION_DENIED":
          //   case "PermissionDeniedError":
          //     // this.writeError("用户拒绝提供设备。");
          //     break;
          //   case "NOT_SUPPORTED_ERROR":
          //   case "NotSupportedError":
          //     // this.writeError("浏览器不支持硬件设备。");
          //     break;
          //   case "MANDATORY_UNSATISFIED_ERROR":
          //   case "MandatoryUnsatisfiedError":
          //     // this.writeError("无法发现指定的硬件设备。");
          //     break;
          //   default:
          //     // this.writeError(
          //     //   "无法打开麦克风。异常信息:" + (e.code || e.name)
          //     // );
          //     break;
          // }
        }
      }
    };
    </script>
    <style scoped lang="scss">
    .wrap-recorder {
      text-align: center;
      .icon {
        cursor: pointer;
      }
      .tip {
        padding-top: 20px;
      }
    }
    .anirecorder {
      position: relative;
      animation: mymove 5s infinite;
      animation-direction: alternate;
      animation-timing-function: ease-in-out;
    }
    
    @keyframes mymove {
      0% {
        transform: scale(1); /*开始为原始大小*/
      }
      25% {
        transform: scale(1.1); /*放大1.1倍*/
      }
      50% {
        transform: scale(0.9);
      }
      75% {
        transform: scale(1.1);
      }
    }
    </style>
     
    View Code

    4. 然后引入该组件

     <MRecorder @handleStop="handelEndRecord" />
    
    methods:{
      // 录音处理结束事件
        handelEndRecord(param) {
          this.msource = param;
        },
    }

    整个流程就完成了,生成的mp3 格式很小,便于上传。

  • 相关阅读:
    一个星期自动态的网站设计
    java特权制度设计篇
    mac默认截图、截图代码
    NSDateFormatter
    vlan 以及 Linux实现的IEEE 802.1Q VLAN
    gtk+blade+anjuta 的简单实例
    NetBSD是个开源到源码的系统
    创作gtk源码级vim帮助文档 tags
    linux 怎么使用一个c/c++库
    linux 终端控制-- 多彩输出 格式排版
  • 原文地址:https://www.cnblogs.com/Sabo-dudu/p/13566170.html
Copyright © 2011-2022 走看看