前端录入音频并上传

news2024/9/23 21:29:45

目录

  • 纯 js 实现(有问题)
  • 使用插件 `recorder-core` (没问题)

纯 js 实现(有问题)

上传音频文件时 blob 数据中 size 一直是0,导致上传之后音频不可播放(本地录制后本地是可以播放的)在这里插入图片描述

<template>
  <div>
    <button v-if="!isRecording" @click="startRecording">开始录音</button>
    <button v-else @click="stopRecording">停止录音</button>
    <audio v-show="recordedAudio" ref="audioPlayer" controls></audio>
    <!-- <audio src="./法老-百变酒精.mp3" controls></audio> -->
  </div>
</template>

<script>
import { UploadOssFiles } from '@/api/service'

export default {
  data() {
    return {
      isRecording: false,
      recordedAudio: null,
      mediaRecorder: null,
      chunks: []
    }
  },
  methods: {
    startRecording() {
      navigator.mediaDevices
        .getUserMedia({ audio: true })
        .then((stream) => {
          this.isRecording = true
          this.mediaRecorder = new MediaRecorder(stream)
          this.mediaRecorder.addEventListener('dataavailable', this.handleDataAvailable)
          this.mediaRecorder.start()
        })
        .catch((error) => {
          console.error('无法访问麦克风:', error)
        })
    },
    stopRecording() {
      this.isRecording = false
      this.mediaRecorder.stop()
      // this.mediaRecorder.state = 'inactive'

      const blob = new Blob(this.chunks, { type: 'audio/webm' })
      // const blob = new Blob(this.chunks, { type: 'audio/mp3' })
      console.log('blob----', blob)
      const formData = new FormData()
      // formData.append('audio', blob, 'recording.webm')
      formData.append('files', blob, 'recording.webm')
      // formData.append('files', blob, 'recording.mp3')
      // 发送音频数据到后端的API接口
      UploadOssFiles(formData)
        .then((response) => {
          // 处理后端返回的响应
        })
        .catch((error) => {
          // 处理请求错误
        })
    },
    handleDataAvailable(event) {
      this.chunks.push(event.data)
      if (this.mediaRecorder.state === 'inactive') {
        this.processRecordedAudio()
      }
    },
    processRecordedAudio() {
      const blob = new Blob(this.chunks, { type: 'audio/webm' })
      // const blob = new Blob(this.chunks, { type: 'audio/mp3' })
      this.recordedAudio = URL.createObjectURL(blob)
      console.log('this.recordedAudio----', this.recordedAudio)
      this.$refs.audioPlayer.src = this.recordedAudio
    }
  }
}
</script>

代码来源

使用插件 recorder-core (没问题)

在这里插入图片描述

<template>
  <div>
    <!-- 按钮 -->
    <button @click="recOpen">打开录音,请求权限</button>
    | <button @click="recStart">开始录音</button> | <button @click="recStop">结束录音</button> |
    <button @click="recPlay">本地试听</button>
    <div style="padding-top: 5px">
      <!-- 波形绘制区域 -->
      <div style="border: 1px solid #ccc; display: inline-block; vertical-align: bottom">
        <div ref="recwave" style="height: 100px; width: 300px" />
      </div>
    </div>
  </div>
</template>

<script>
import { UploadOssFiles } from '@/api/service'

// 必须引入的核心
import Recorder from 'recorder-core'

// 引入mp3格式支持文件;如果需要多个格式支持,把这些格式的编码引擎js文件放到后面统统引入进来即可
import 'recorder-core/src/engine/mp3'
import 'recorder-core/src/engine/mp3-engine'
// 录制wav格式的用这一句就行
// import 'recorder-core/src/engine/wav'

// 可选的插件支持项,这个是波形可视化插件
import 'recorder-core/src/extensions/waveview'

// ts import 提示:npm包内已自带了.d.ts声明文件(不过是any类型)

export default {
  name: '',
  components: {},

  data() {
    return {
      rec: null,
      recBlob: null,
      wave: null
    }
  },

  methods: {
    // 申请录音权限
    recOpen() {
      // 创建录音对象
      this.rec = Recorder({
        type: 'mp3', // 录音格式,可以换成wav等其他格式
        sampleRate: 16000, // 录音的采样率,越大细节越丰富越细腻
        bitRate: 16, // 录音的比特率,越大音质越好
        onProcess: (
          buffers,
          powerLevel,
          bufferDuration,
          bufferSampleRate,
          newBufferIdx,
          asyncEnd
        ) => {
          // 录音实时回调,大约1秒调用12次本回调
          // 可实时绘制波形,实时上传(发送)数据
          if (this.wave) this.wave.input(buffers[buffers.length - 1], powerLevel, bufferSampleRate)
        }
      })

      // 打开录音,获得权限
      this.rec.open(
        () => {
          console.log('录音已打开')
          if (this.$refs.recwave) {
            // 创建音频可视化图形绘制对象
            this.wave = Recorder.WaveView({ elem: this.$refs.recwave })
          }
        },
        (msg, isUserNotAllow) => {
          // 用户拒绝了录音权限,或者浏览器不支持录音
          console.log((isUserNotAllow ? 'UserNotAllow,' : '') + '无法录音:' + msg)
        }
      )
    },
    // 开始录音
    recStart() {
      if (!this.rec) {
        console.error('未打开录音')
        return
      }
      this.rec.start()
      console.log('已开始录音')
    },
    // 结束录音
    recStop() {
      if (!this.rec) {
        console.error('未打开录音')
        return
      }
      this.rec.stop(
        (blob, duration) => {
          // blob就是我们要的录音文件对象,可以上传,或者本地播放
          this.recBlob = blob
          // 简单利用URL生成本地文件地址,此地址只能本地使用,比如赋值给audio.src进行播放,赋值给a.href然后a.click()进行下载(a需提供download="xxx.mp3"属性)
          var localUrl = (window.URL || webkitURL).createObjectURL(blob)
          console.log('录音成功', blob, localUrl, '时长:' + duration + 'ms')

          this.upload(blob) // 把blob文件上传到服务器

          this.rec.close() // 关闭录音,释放录音资源,当然可以不释放,后面可以连续调用start
          this.rec = null
        },
        (err) => {
          console.error('结束录音出错:' + err)
          this.rec.close() // 关闭录音,释放录音资源,当然可以不释放,后面可以连续调用start
          this.rec = null
        }
      )
    },
    // 上传录音
    upload(blob) {
      console.log('blob----', blob)
      // 使用FormData用multipart/form-data表单上传文件
      // 或者将blob文件用FileReader转成base64纯文本编码,使用普通application/x-www-form-urlencoded表单上传
      var form = new FormData()
      form.append('files', blob, 'recorder.mp3') // 和普通form表单并无二致,后端接收到upfile参数的文件,文件名为recorder.mp3

      UploadOssFiles(form)
        .then((response) => {
          // 处理后端返回的响应
        })
        .catch((error) => {
          // 处理请求错误
        })
    },
    // 本地播放录音
    recPlay() {
      // 本地播放录音试听,可以直接用URL把blob转换成本地播放地址,用audio进行播放
      var localUrl = URL.createObjectURL(this.recBlob)
      var audio = document.createElement('audio')
      audio.controls = true
      document.body.appendChild(audio)
      audio.src = localUrl
      audio.play() // 这样就能播放了

      // 注意不用了时需要revokeObjectURL,否则霸占内存
      setTimeout(function () {
        URL.revokeObjectURL(audio.src)
      }, 5000)
    }
  }
}
</script>

<style lang='scss' scoped>
</style>

代码来源

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1019875.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是CORS(跨源资源共享)?如何解决前端中的CORS问题?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ CORS&#xff08;跨源资源共享&#xff09;⭐ 解决前端中的CORS问题的方法⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为…

【前端知识】Three 学习日志(三)—— 光源对物体表面的影响

Three 学习日志&#xff08;三&#xff09;—— 光源对物体表面的影响 一、设置材质为受光照影响 //MeshLambertMaterial受光照影响 const material new THREE.MeshLambertMaterial();此时&#xff0c;场景中一片漆黑&#xff0c;无法看到原来的物体&#xff0c;需要设置光源…

24v转5v稳压芯片-5A大电流输出ic

这款24V转5V5A汽车充电芯片具有以下特性和参数&#xff1a; - 宽输入电压范围&#xff1a;4.5V至36V - 最大输出电流&#xff1a;5.0A - 高达92%的转换效率 - 恒流/恒压模式控制 - 最大占空比100% - 可调输出电压 - 2%的输出电压精度 - 集成40mΩ高侧开关 - 集成18mΩ低侧开关 …

网络安全深入学习第六课——热门框架漏洞(RCE— Weblogic反序列化漏洞)

文章目录 一、Weblogic介绍二、Weblogic反序列化漏洞历史三、Weblogic框架特征1、404界面2、登录界面 四、weblogic常用弱口令账号密码五、Weblogic漏洞介绍六、Weblogic漏洞手工复现1、获取账号密码&#xff0c;这是一个任意文件读取的漏洞1&#xff09;读取SerializedSystemI…

K8s(Kubernetes)学习(六)——Ingress

第六章 Ingress 什么是 IngressIngress 和 Service 区别Ingress 控制器 Traefik 使用Ingress Route的定义 1 简介 https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/ Ingress 是一种 Kubernetes 资源类型&#xff0c;它允许在 Kubernetes 集群中暴露…

浏览器报错内容:Provisional headers are shown

浏览器报错内容&#xff1a;Provisional headers are shown 如下图&#xff1a; 解决方法&#xff1a;nginx 443 启用HTTP/2模式&#xff0c;如下图&#xff1a; server {listen 443 ssl http2;server_name callcenterda.umworks.com;client_max_body_size 200M;ssl_session_…

Idea注释相关配置模板

设置-编辑器-实时模板。 这里可以自己建立一个文件夹&#xff0c;建立自己的模板 1、普通多行注释 2、方法注释 我的方法注释模板文本&#xff1a; ** *$param$$return$ **/ 点击编辑变量&#xff1a; 两个默认值分别为&#xff1a; groovyScript("if(\"${…

倾情奉献,纯css(无图,无JS)原创中秋贺卡!!!

&#x1fab4; 背景故事 中秋节马上就要到了&#xff0c;在这里我提前祝大家生活美满万年长&#xff0c;阖家幸福永平安&#xff01;&#x1f973; 好了进入正题&#xff0c;最近掘金出了一个“中秋创意投稿”活动&#xff0c;我向来对这种可以写一些具有创意性的代码的活动很…

问题记录:两台Ubuntu之间传输文件(SCP)

1.查看IP地址 首先查看目标设备的 IP 地址&#xff1a;要把文件传到哪台机器上&#xff0c;就看哪台机器的 IP 地址&#xff0c;有两种方法 1.在终端输入 ifconfig: 2.设置里面看 2. 在自己的PC端 ping 一下目标机器的 IP 地址&#xff0c;看是否可以连接 ping 172.17.160…

使用ROS与Movelt实现myCobot 280运动轨迹规划和控制

ROS的技术案例 Introduction 今天这篇文章将记录我使用myCobot 280 M5stack 在ROS当中是如何使用的。为什么使用ROS呢&#xff0c;因为提及到机器人都离不开ROS这个操作系统&#xff0c;今天是我们第一次使用ROS这个系统。 今天我将从ROS的介绍&#xff0c;环境的配置以及mycob…

DPU加速AI应用“遍地开花”,中科驭数亮相2023全球AI芯片峰会

9月15日&#xff0c;2023全球AI芯片峰会&#xff08;GACS 2023&#xff09;在深圳举行&#xff0c;聚集了全球AI芯片产业的领军者和中坚力量&#xff0c;共探AI芯片的求新、求变、求索之径。中科驭数高级副总裁张宇应邀在智算中心算力与网络高峰论坛发表题为《基于DPU的高效AI大…

《2023年中国数字孪生行业报告》丨附下载_三叠云

✦ ✦✦ ✦✦ ✦✦ ✦ 随着近年来人工智能、物联网、虚拟现实等技术的持续发展以及元宇宙概念的兴起&#xff0c;数字孪生概念进一步完善&#xff0c;适用范围不断拓宽。然而非业界人士对数字孪生概念仍缺乏统一认知。对此&#xff0c;本报告介绍数字孪生概念、行业情况、市场…

java开发之个微机器人的开发

简要描述&#xff1a; 根据消息回调收到的xml转发文件消息&#xff0c;适用于同内容大批量发送 请求URL&#xff1a; http://域名地址/sendRecvFile 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#…

uniapp 使用subNVue原生子窗体显示弹框或悬浮框

效果展示 在uniapp中&#xff0c;我们可以使用subNVue原生子窗体来解决web-view等原生页面中弹框无法显示的问题。 subNVue原生子窗体是uniapp提供的一种原生组件&#xff0c;可以在uniapp中嵌入原生页面&#xff0c;并且可以与uniapp页面进行通信。我们可以在原生页面中使用…

web浏览器公网远程访问jupyter notebook【内网穿透】

文章目录 前言1. Python环境安装2. Jupyter 安装3. 启动Jupyter Notebook4. 远程访问4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5. 固定公网地址 前言 Jupyter Notebook&#xff0c;它是一个交互式的数据科学和计算环境&#xff0c;支持多种编程语言&#xff0c;如…

leetcode 102.二叉树的层序遍历

⭐️ 二叉树的层序遍历I 题目描述 &#x1f31f; leetcode链接&#xff1a;二叉树的层序遍历I 思路&#xff1a; 使用一个辅助队列来层序遍历二叉树&#xff0c;不同的是需要使用一个二维数组来存放每个节点&#xff0c;而每一层的所有节点又需要是一个一维数组。 而最重要的问…

DNS解析流程

DNS 层次结构如下&#xff1a; 根 DNS 服务器 &#xff1a;返回顶级域 DNS 服务器的 IP 地址顶级域 DNS 服务器&#xff1a;返回权威 DNS 服务器的 IP 地址权威 DNS 服务器 &#xff1a;返回相应主机的 IP 地址 为了提高 DNS 的解析性能&#xff0c;很多网络都会就近部署 DNS …

如何在idea中新建第一个java小程序

如何在idea中新建第一个java小程序 1.打开软件2.新建项目3.找到安装的jdk文件路径4.继续下一步5.创建项目名称并配置项目路径6.点击完成即可。7.在项目文件的src文件夹下创建java类&#xff0c;程序等7.1其他java项目或文件不能运行的原因&#xff1a; 8.新建类并运行程序9.输入…

构建本地Web小游戏网站:Ubuntu下的快速部署与公网用户远程访问

文章目录 前言1. 本地环境服务搭建2. 局域网测试访问3. 内网穿透3.1 ubuntu本地安装cpolar内网穿透3.2 创建隧道3.3 测试公网访问 4. 配置固定二级子域名4.1 保留一个二级子域名4.2 配置二级子域名4.3 测试访问公网固定二级子域名 前言 网&#xff1a;我们通常说的是互联网&am…

数据库 MVCC 详解

目录 1. 什么是 MVCC&#xff1f; 2. MVCC 的好处&#xff1f; 3. 快照读&#xff1f;当前读分别是什么&#xff1f;怎么理解&#xff1f; 3.1 快照读 3.2 当前读 4. 数据库的四种隔离级别 5. MVCC 实现原理 5.1 隐藏字段 5.2 undo log(版本链) 5.3 readView 6. re…