当前位置: 首页 > news >正文

uni-app录音功能

纯纯干货,cv即用

<template><!-- 录音页面 --><view class="page"><view class="tape_box"><view class="upload_box1"><view class="upload_top"><view class="upload_img_title">录音</view></view><view class="tape_calculagraph">{{ formatTime }}</view><view class="upload_pate_con"><!-- 点击录音按钮 --><image @click="toggleRecording":src="isRecording ? '../../static/isks.png' : '../../static/isks.png'" mode=""style="width: 60px;height: 50px;"></image></view><view class="clear_tape" @click="clearRecording" v-if="recordingAvailable">清除录音</view><!-- H5 平台的音频播放器 --><view v-if="recordingAvailable" class="audio-player"><audio ref="h5Audio" :src="audioURL" controls autoplay title="自定义的音频名称" @play="onAudioPlay"@pause="onAudioPause" @ended="onAudioEnded"></audio></view></view></view></view>
</template><script setup>
import { ref, computed, onMounted, onBeforeUnmount, onUnmounted } from 'vue';
// 录音相关变量
const isRecording = ref(false);
const time = ref(0);
const formatTime = computed(() => {const minutes = String(Math.floor(time.value / 60)).padStart(2, '0');const seconds = String(time.value % 60).padStart(2, '0');return `${minutes}:${seconds}`;
});
let timer = null;// 平台检测
const systemInfo = uni.getSystemInfoSync();
const platform = systemInfo.platform;// 录音管理器
let recorderManager = null;// H5录音相关变量
let mediaRecorder = null;
let audioChunks = [];
let audioBlob = null;
const recordingAvailable = ref(false);
let audioURL = '';// 播放相关变量
const isPlaying = ref(false);
const h5Audio = ref(null);// 初始化录音和播放功能
onMounted(() => {if (['ios', 'android', 'devtools'].includes(platform)) {initNativeRecorder();isPlaying.value = false;} else if (['windows', 'mac'].includes(platform)) {initH5Recorder();} else {uni.showToast({title: '当前平台不支持录音',icon: 'none',});}
});// 清理资源
onBeforeUnmount(() => {if (h5Audio.value) {h5Audio.value.removeEventListener('play', onAudioPlay);h5Audio.value.removeEventListener('pause', onAudioPause);h5Audio.value.removeEventListener('ended', onAudioEnded);}
});onUnmounted(() => {clearInterval(timer);if (recorderManager && recorderManager.stop) {recorderManager.stop();}if (mediaRecorder && mediaRecorder.state !== 'inactive') {mediaRecorder.stop();}
});// 初始化原生平台的录音管理器
function initNativeRecorder() {recorderManager = uni.getRecorderManager();recorderManager.onStart(() => {console.log('开始录音');});recorderManager.onStop((res) => {console.log('录音已停止', res);isRecording.value = false;clearInterval(timer);time.value = 0;recordingAvailable.value = true;audioURL = res.tempFilePath;});recorderManager.onError((err) => {console.error('录音错误', err);isRecording.value = false;clearInterval(timer);time.value = 0;uni.showToast({title: '录音失败',icon: 'none',});});
}// 初始化H5平台的录音器
function initH5Recorder() {if (!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) {uni.showToast({title: '浏览器不支持录音功能',icon: 'none',});return;}
}// 切换录音状态
function toggleRecording() {if (isRecording.value) {stopRecording();} else {startRecording();}
}// 开始录音
function startRecording() {if (['ios', 'android', 'devtools'].includes(platform)) {uni.authorize({scope: 'scope.record',success() {recorderManager.start({format: 'mp3',});isRecording.value = true;timer = setInterval(() => {time.value += 1;}, 1000);},fail() {uni.showModal({content: '请打开录音功能权限',confirmText: '确认',cancelText: '取消',success: (res) => {if (res.confirm) {uni.openSetting();}},});},});} else {// H5平台录音navigator.mediaDevices.getUserMedia({audio: true,}).then((stream) => {mediaRecorder = new MediaRecorder(stream);mediaRecorder.start();isRecording.value = true;timer = setInterval(() => {time.value += 1;}, 1000);mediaRecorder.ondataavailable = (e) => {audioChunks.push(e.data);};mediaRecorder.onstop = () => {audioBlob = new Blob(audioChunks, { type: 'audio/mp3' });audioChunks = [];recordingAvailable.value = true;audioURL = URL.createObjectURL(audioBlob);if (h5Audio.value) {h5Audio.value.src = audioURL;}};}).catch((err) => {console.error('录音失败:', err);uni.showToast({title: '无法访问麦克风',icon: 'none',});});}
}// 停止录音
function stopRecording() {if (['ios', 'android', 'devtools'].includes(platform)) {recorderManager.stop();} else {if (mediaRecorder && mediaRecorder.state !== 'inactive') {mediaRecorder.stop();isRecording.value = false;clearInterval(timer);time.value = 0;}}
}// 清除录音
function clearRecording() {recordingAvailable.value = false;audioURL = '';time.value = 0;
}// H5音频播放事件处理
function onAudioPlay() {isPlaying.value = true;
}function onAudioPause() {isPlaying.value = false;
}function onAudioEnded() {isPlaying.value = false;
}
</script><style>
.page {position: fixed;top: 0;left: 0;right: 0;bottom: 0;background-color: rgba(0, 0, 0, 0.5);display: flex;justify-content: center;align-items: center;
}.tape_box {background-color: white;width: 90%;padding: 20px;border-radius: 10px;box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);text-align: center;
}.upload_top {display: flex;justify-content: space-between;align-items: center;
}.upload_img_title {flex: 1;text-align: center;font-size: 18px;font-weight: bold;
}.tape_calculagraph {margin: 10px 0;font-size: 24px;font-weight: bold;
}.upload_pate_con image {width: 50px;height: 50px;cursor: pointer;
}.clear_tape {margin-top: 10px;color: #00daca;cursor: pointer;
}.audio-player audio {width: 100%;margin-top: 10px;
}
</style>

相关文章:

uni-app录音功能

纯纯干货&#xff0c;cv即用 <template><!-- 录音页面 --><view class"page"><view class"tape_box"><view class"upload_box1"><view class"upload_top"><view class"upload_img_title…...

C语言【调试】(个人笔记版)

调试 前言一、Bug二、调试工具1.DeBug2.Release 三、调试快捷键1、断点 四、调试时查看程序的当前信息1、查看临时变量2、查看内存3、查看调用堆栈、汇编、寄存器 总结 前言 这篇文章大都是我的个人笔记&#xff1a; 调试在日常程序设计中是很重要的。调试说白了就是为了解决代…...

连锁收银系统

商淘云连锁管理系统助力连锁企业实现“人货账”全方位数字化管理&#xff0c;它依托连锁品牌进销存管理实现门店订货、线下收银、线上商城、会员营销等一体化管理。 门店订货补货支持连锁直营、加盟 不同门店不同进货价、不同门店不同商品、不同门店在线或者账期支付、门店PC或…...

5.2024.10.21

2024.10.21 学习和复习 学习QT的流程控制、函数、内联函数复习C语言printf练习 问题及解决方案 C学到函数之后有些吃力代码逻辑能力不大行&#xff0c;需要巩固一下C语言基础再挤多点时间去学习嵌入式写代码前先把大概思路写出来 碎碎念 最近作业比较多&#xff0c;有点静不下…...

前端Socket互动小游戏开发体验分享

随着实时网络通信技术的不断发展&#xff0c;基于WebSocket的前端互动小游戏成为了一种非常流行的选择。WebSocket允许客户端和服务器之间进行双向通信&#xff0c;为游戏互动带来了更快的响应时间和更流畅的体验。本文将通过一个简单的互动小游戏来探讨前端如何利用WebSocket技…...

react项目,通过自定义 separator 属性来修改日期选择器中间的分隔符:

1. 引入必要的依赖 确保你已经引入了 DatePicker 组件和 moment 库。 import React, { Component } from react; import { DatePicker } from antd; import moment from moment; const { RangePicker } DatePicker; const dateFormat "YYYY/MM/DD"; 2. 定义父组…...

双十一有啥好用的家居好物推荐?2024性价比高的超声波清洗机推荐

双十一今天晚上就可以越热开抢了&#xff0c;还不知道购买什么物品的小伙伴们赶紧来看看我这篇文章&#xff0c;在众多家居好物中&#xff0c;超声波清洗机以其高效、便捷的特点&#xff0c;成为了许多家庭的必备神器。2024年&#xff0c;市场上涌现出了不少性价比超高的产品&a…...

比亚迪车机安装第三方应用教程

比亚迪车机安装第三方应用教程 比亚迪车机U盘安装APP&#xff0c; 无论是dlink3.0还是4.0都是安卓系统&#xff0c;因此理论上安卓应用是都可以安装的&#xff0c;主要就是横屏和竖屏的区别。在比亚迪上安装软件我主要推荐两种方法。 第一种&#xff0c;直接从电脑端下载安装布…...

移动零---双指针法

目录 一&#xff1a;题目 二:算法原理讲解 三&#xff1a;代码编写 一&#xff1a;题目 题目链接&#xff1a;https://leetcode.cn/problems/move-zeroes/description/ 二:算法原理讲解 三&#xff1a;代码编写 void moveZeroes2(vector<int>& nums) {for (int d…...

MoeCTF 2024 ---Misc方向WP

安全杂项 signin 题目描述&#xff1a; xdsec的小伙伴们和参赛者来上课&#xff0c;碰巧这一天签到系统坏了&#xff0c;作为老师的你&#xff0c;要帮他们 教师代签。 特殊提醒&#xff1a;luo同学今天好像在宿舍打游戏&#xff0c;不想来上课&#xff0c;这是严重的缺勤行为…...

【我的 RT 学习手札】信息收集

相关笔记整理自B站up主泷羽sec全栈渗透测试教学&#xff08;免费&#xff09; 视频链接为泷羽sec的个人空间-泷羽sec个人主页-哔哩哔哩视频 笔记只是方便师傅学习知识&#xff0c;以下网站只涉及学习内容&#xff0c;其他的都与本人无关&#xff0c;切莫逾越法律红线&#xff0…...

CMake变量:CMAKE_FIND_LIBRARY_SUFFIXES

CMAKE_FIND_LIBRARY_SUFFIXES是CMake中的一个变量&#xff0c;用于指定在查找库文件时使用的后缀列表。当CMake需要找到库文件时&#xff0c;它会尝试在这些后缀后添加库名来构建库文件的完整路径。例如&#xff0c;如果库名为mylib&#xff0c;并且CMAKE_FIND_LIBRARY_SUFFIXE…...

在使用 RabbitMQ 作为消息代理时,多个 Celery 实例(或应用)可以共享同一个 RabbitMQ 实例

在使用 RabbitMQ 作为消息代理时&#xff0c;多个 Celery 实例&#xff08;或应用&#xff09;可以共享同一个 RabbitMQ 实例。这样做可以简化基础设施管理&#xff0c;同时允许不同的 Celery 应用之间进行消息传递和协作。下面是如何配置多个 Celery 实例以使用同一个 RabbitM…...

ARM在嵌入式开发中的作用有哪些?

ARM在嵌入式开发中的作用主要体现在以下几个方面&#xff1a; 架构优势&#xff1a; ARM架构基于RISC&#xff08;精简指令集计算机&#xff09;&#xff0c;具有精简而高效的指令集&#xff0c;适合资源受限的环境。低功耗设计使得ARM处理器在移动设备和嵌入式系统中非常受欢…...

-webkit-box-orient属性丢失?

在实际项目场景当中&#xff0c;我们经常会遇到需要对超长文本溢出省略的场景&#xff1a; 我们经常会这样写—— 单行省略&#xff1a; overflow: hidden; //文本溢出隐藏text-overflow: ellipsis; //文本溢出显示省略号white-space: nowrap; //不换行 多行省略&#xff1a…...

openKylin系统SSH服务配置结合cpolar轻松实现开放麒麟远程连接

前言 本文主要介绍如何在openKlyin系统中设置ssh连接&#xff0c;并结合cpolar内网穿透工具实现远程也可以ssh连接本地局域网内部署的openKlyin系统. openKylin是中国首个基于Linux 的桌面操作系统开发者平台&#xff0c;通过开放操作系统源代码的方式&#xff0c;打造具有自…...

我的世界之合成

合成&#xff08;Crafting&#xff09;是一种在Minecraft中获得多种方块、工具和其他资源的方法。合成时&#xff0c;玩家必须先把物品从物品栏移入合成方格中。22的简易合成方格可以直接在物品栏中找到&#xff0c;而33的合成方格需要使用工作台或合成器来打开。 目录 1合成系…...

java基于SpringBoot+Vue+uniapp微信小程序的自助点餐系统的详细设计和实现(源码+lw+部署文档+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…...

AI 编译器学习笔记之八 -- Python基础学习

2、正则表达式 re.sub 正则替换&#xff1a;cleaned_text re.sub(r"[^\w\s]", "", text) - CSDN文库 3、在Python中&#xff0c;shape 是一个用于描述数组维度的属性&#xff0c;通常用在NumPy数组对象上&#xff0c;而不是标准的列表。 【Python】解决Py…...

盘点近几年腾讯的精选面试题(c/c++研发岗)

map插入方式有几种&#xff1f; 1)用insert函数插入pair数据&#xff0c; mapStudent.insert(pair<int, string>(1, “student_one”)); 2)用insert函数插入value_type数据 mapStudent.insert(map<int, string>::value_type (1, “student_one”)); 3)在insert函…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...

实战设计模式之模板方法模式

概述 模板方法模式定义了一个操作中的算法骨架&#xff0c;并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下&#xff0c;重新定义算法中的某些步骤。简单来说&#xff0c;就是在一个方法中定义了要执行的步骤顺序或算法框架&#xff0c;但允许子类…...

python数据结构和算法(1)

数据结构和算法简介 数据结构&#xff1a;存储和组织数据的方式&#xff0c;决定了数据的存储方式和访问方式。 算法&#xff1a;解决问题的思维、步骤和方法。 程序 数据结构 算法 算法 算法的独立性 算法是独立存在的一种解决问题的方法和思想&#xff0c;对于算法而言&a…...