Recorder开启手机录音功能并将录音保存本地

这个功能很简单其实,使用vue-Recorder插件就可以实现,但是如果我们只想要在某一页面中使用,不需要部署至全局的话,可以不通过package打包,只需要在cdn中引入recorder插件(这里需要注意版本)。

  1. 在 index.html中引入cdn 中的script代码:
  <script src="https://cdn.jsdelivr.net/gh/xiangyuecn/Recorder@latest/src/recorder-core.js"></script>
  <script src="https://cdn.jsdelivr.net/gh/xiangyuecn/Recorder@latest/src/engine/mp3.js"></script>
  <script src="https://cdn.jsdelivr.net/gh/xiangyuecn/Recorder@latest/src/engine/mp3-engine.js"></script>
  <script
    src="https://cdn.jsdelivr.net/gh/xiangyuecn/Recorder@latest/src/extensions/frequency.histogram.view.js"></script>
  <script src="https://cdn.jsdelivr.net/gh/xiangyuecn/Recorder@latest/src/extensions/lib.fft.js"></script>
  1. webpack.base.config.js中写入,用于在页面打包时不打包recorder包:
externals: {
    'recorder': 'Recorder'
  },
  1. 在需要用到的页面中调用
var newRec = Recorder({
        type: "mp3",
        sampleRate: 16000,
        bitRate: 16, // mp3格式,指定采样率hz、比特率kbps,其他参数使用默认配置;注意:是数字的参数必须提供数字,不要用字符串;需要使用的type类型,需提前把格式支持文件加载进来,比如使用wav格式需要提前加载wav.js编码引擎
        onProcess(buffers, powerLevel, bufferDuration, bufferSampleRate) {
          // 可视化图形绘制
          wave.input(buffers[buffers.length - 1], powerLevel, bufferSampleRate);
        },
        success:function(dd){
          console.log('dd', dd)
        },error:function(msg){
          console.log('cc', msg)
        }
      });
      this.createDelayDialog(); // 我们可以选择性的弹一个对话框:为了防止移动端浏览器存在第三种情况:用户忽略,并且(或者国产系统UC系)浏览器没有任何回调,此处demo省略了弹窗的代码
      newRec.open(
        () => {
          // 打开麦克风授权获得相关资源
          this.rec = newRec;
          // 此处创建这些音频可视化图形绘制
          wave = Recorder.FrequencyHistogramView({ elem: ".recwave" });
          // 已打开录音,可以点击录制开始录音了
          this.recStart();
        },
        (msg, isUserNotAllow) => {
          // 用户拒绝授权或不支持
          if (isUserNotAllow) {
            // 用户拒绝授权
            this.$confirm(
              "您拒绝了该问卷获取录音权限,您将不能答题,是否重新获取?",
              "提示",
              {
                type: "warning",
              }
            ).then(({ result }) => {
              if (result) {
                this.recOpen();
              } else {
                this.$toast.error(msg + ",请刷新页面重新获取");
              }
            });
          } else {
            // 设备不支持
            this.$toast.error(msg + ",您将不能答题");
          }
        }
      );
      // 权限请求被忽略
      window.waitDialogClick = () => {
        this.$toast.error("麦克风权限请求被忽略,您将不能答题");
      };
      // 开始录制
    recStart() {
      if (this.rec && Recorder.IsOpen()) {
        this.recBlob = null;
        this.rec.start();
      } else {
        this.$toast.error("未打开录音");
      }
    }
    // 暂停
    recPause() {
      if (this.rec && Recorder.IsOpen()) {
        this.rec.pause();
      } else {
        this.$toast.error("未打开录音");
      }
    },
    // 继续
    recResume() {
      if (this.rec && Recorder.IsOpen()) {
        this.rec.resume();
      } else {
        this.$toast.error("未打开录音");
      }
    },
    // 停止并上传
    recStop(isStartRecoder) {
      if (!(this.rec && Recorder.IsOpen())) {
        this.$toast.error("未打开录音");
        return;
      }
      this.rec.stop(
        (blob, duration) => {
          this.recBlob = blob;
          // 上传录音文件
        },
        (msg) => {
          this.$toast.error(msg);
        }
      );   
    },
      
  1. createDelayDialog文件:
createDelayDialog() {
      this.dialogInt = setTimeout(() => {
        // 定时8秒后打开弹窗,用于监测浏览器没有发起权限请求的情况,在open前放置定时器利于收到了回调能及时取消(不管open是同步还是异步回调的)
        this.showDialog();
      }, 8000);
    }
  1. 保存录音至本地
// 上传失败后,将音频保存在本地
    saveLocalBlob(blob){
      const url = window.URL.createObjectURL(blob);
      const a = document.createElement('a');
      a.style.display = 'none';
      a.href = url;

      a.download = this.answerVideoid;
      document.body.appendChild(a);
      a.click();
      // 用于保存时,浏览器报错,此时需要延迟2秒
      setTimeout(() => {
        window.URL.revokeObjectURL(url);
        document.body.removeChild(a);
      }, 2000);
    },
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值