uniapp上传音频文件到服务器

视频教程地址:

【uniapp录音上传组件,将录音上传到django服务器】 https://www.bilibili.com/video/BV1wi4y1p7FL/?share_source=copy_web&vd_source=e66c0e33402a09ca7ae1f0ed3d5ecf7c

  • uniapp 录制音频文件上传到django服务器保存到服务器 ,要求uniapp显示录制进度波形图 请提供完整代码
  • 以下是一个示例代码,演示了如何在uniapp中录制音频文件并将其上传到Django服务器,并在uniapp中显示录制进度波形图。

    在uniapp的页面中,你可以使用uni-voice组件来录制音频,并使用uni-upload组件来上传文件。在Django服务器端,你可以使用Django的文件上传功能来保存音频文件。

    uniapp页面代码(index.vue):

     
<template><view class="container"><view class="waveform" :style="{ width: waveformWidth + 'px' }"></view><view class="controls"><button @tap="startRecording" :disabled="isRecording">开始录制</button><button @tap="stopRecording" :disabled="!isRecording">停止录制</button><button @tap="uploadFile" :disabled="!recordedFile">上传文件</button></view></view>
</template><script>
export default {data() {return {isRecording: false,recordedFile: null,waveformWidth: 0,audioContext: null,audioRecorder: null,audioChunks: [],};},mounted() {this.audioContext = new (window.AudioContext || window.webkitAudioContext)();},methods: {startRecording() {this.isRecording = true;this.audioChunks = [];navigator.mediaDevices.getUserMedia({ audio: true }).then((stream) => {this.audioRecorder = new MediaRecorder(stream);this.audioRecorder.addEventListener('dataavailable', (event) => {this.audioChunks.push(event.data);this.drawWaveform();});this.audioRecorder.start();}).catch((error) => {console.error('Error accessing microphone:', error);});},stopRecording() {this.isRecording = false;this.audioRecorder.stop();this.audioRecorder.stream.getTracks().forEach((track) => track.stop());this.audioRecorder = null;this.recordedFile = new File(this.audioChunks, 'recorded_audio.wav', { type: 'audio/wav' });},drawWaveform() {const waveformElement = this.$refs.waveform;const canvas = waveformElement.getContext('2d');const width = waveformElement.width;const height = waveformElement.height;const data = new Uint8Array(this.audioChunks.reduce((acc, chunk) => acc + chunk.byteLength, 0));let offset = 0;this.audioChunks.forEach((chunk) => {const reader = new FileReader();reader.onload = () => {const array = new Uint8Array(reader.result);data.set(array, offset);offset += array.length;canvas.clearRect(0, 0, width, height);canvas.fillStyle = '#000000';for (let i = 0; i < width; i++) {const value = data[Math.floor(i * (data.length / width))];const barHeight = (value / 255) * height;canvas.fillRect(i, height - barHeight, 1, barHeight);}};reader.readAsArrayBuffer(chunk);});},uploadFile() {const formData = new FormData();formData.append('audio', this.recordedFile);uni.uploadFile({url: 'http://your-django-server/upload/',filePath: this.recordedFile.path,name: 'audio',formData: formData,success: (res) => {console.log('File uploaded:', res);},fail: (error) => {console.error('Error uploading file:', error);},});},},
};
</script><style>
.container {display: flex;flex-direction: column;align-items: center;justify-content: center;height: 100vh;
}.waveform {width: 300px;height: 100px;background-color: #f0f0f0;
}.controls {display: flex;justify-content: center;margin-top: 20px;
}button {margin: 0 10px;
}
</style>

在Django服务器端,你需要设置一个视图函数来处理文件上传请求,并将音频文件保存到服务器上的某个目录中。以下是一个简单的示例代码:

 
  • from django.http import JsonResponsedef upload_file(request):if request.method == 'POST' and request.FILES.get('audio'):audio_file = request.FILES['audio']with open('path/to/save/audio.wav', 'wb') as f:for chunk in audio_file.chunks():f.write(chunk)return JsonResponse({'success': True})return JsonResponse({'success': False, 'message': 'Invalid request'})
    

    请将上述代码保存为一个Django视图函数,并将其添加到你的Django项目的URL配置中。

    注意:上述代码仅为示例,你可能需要根据你的具体需求进行适当的修改和调整。

  • 要保存文mp3文件
  • 如果你想保存音频文件为MP3格式,你可以使用lamejs库来将录制的音频文件转换为MP3格式。以下是修改后的示例代码:

    uniapp页面代码(index.vue):

     
<template><view class="container"><view class="waveform" :style="{ width: waveformWidth + 'px' }"></view><view class="controls"><button @tap="startRecording" :disabled="isRecording">开始录制</button><button @tap="stopRecording" :disabled="!isRecording">停止录制</button><button @tap="convertToMp3" :disabled="!recordedFile">转换为MP3</button><button @tap="uploadFile" :disabled="!mp3File">上传文件</button></view></view>
</template><script>
import lamejs from 'lamejs';export default {data() {return {isRecording: false,recordedFile: null,mp3File: null,waveformWidth: 0,audioContext: null,audioRecorder: null,audioChunks: [],};},mounted() {this.audioContext = new (window.AudioContext || window.webkitAudioContext)();},methods: {startRecording() {this.isRecording = true;this.audioChunks = [];navigator.mediaDevices.getUserMedia({ audio: true }).then((stream) => {this.audioRecorder = new MediaRecorder(stream);this.audioRecorder.addEventListener('dataavailable', (event) => {this.audioChunks.push(event.data);this.drawWaveform();});this.audioRecorder.start();}).catch((error) => {console.error('Error accessing microphone:', error);});},stopRecording() {this.isRecording = false;this.audioRecorder.stop();this.audioRecorder.stream.getTracks().forEach((track) => track.stop());this.audioRecorder = null;this.recordedFile = new File(this.audioChunks, 'recorded_audio.wav', { type: 'audio/wav' });},drawWaveform() {const waveformElement = this.$refs.waveform;const canvas = waveformElement.getContext('2d');const width = waveformElement.width;const height = waveformElement.height;const data = new Uint8Array(this.audioChunks.reduce((acc, chunk) => acc + chunk.byteLength, 0));let offset = 0;this.audioChunks.forEach((chunk) => {const reader = new FileReader();reader.onload = () => {const array = new Uint8Array(reader.result);data.set(array, offset);offset += array.length;canvas.clearRect(0, 0, width, height);canvas.fillStyle = '#000000';for (let i = 0; i < width; i++) {const value = data[Math.floor(i * (data.length / width))];const barHeight = (value / 255) * height;canvas.fillRect(i, height - barHeight, 1, barHeight);}};reader.readAsArrayBuffer(chunk);});},convertToMp3() {const wavData = new Uint8Array(this.audioChunks.reduce((acc, chunk) => acc + chunk.byteLength, 0));let offset = 0;this.audioChunks.forEach((chunk) => {const array = new Uint8Array(chunk);wavData.set(array, offset);offset += array.length;});const wavFile = new Blob([wavData], { type: 'audio/wav' });const mp3Encoder = new lamejs.Mp3Encoder(1, this.audioContext.sampleRate, 128);const samples = new Int16Array(wavData.buffer);const mp3Data = [];let remaining = samples.length;let index = 0;while (remaining >= 0) {const bufferSize = Math.min(remaining, 1152);const buffer = samples.subarray(index, index + bufferSize);const mp3Buffer = mp3Encoder.encodeBuffer(buffer);mp3Data.push(mp3Buffer);remaining -= bufferSize;index += bufferSize;}const mp3Buffer = mp3Encoder.flush();mp3Data.push(mp3Buffer);const mp3DataBlob = new Blob(mp3Data, { type: 'audio/mp3' });this.mp3File = new File([mp3DataBlob], 'recorded_audio.mp3', { type: 'audio/mp3' });},uploadFile() {const formData = new FormData();formData.append('audio', this.mp3File);uni.uploadFile({url: 'http://your-django-server/upload/',filePath: this.mp3File.path,name: 'audio',formData: formData,success: (res) => {console.log('File uploaded:', res);},fail: (error) => {console.error('Error uploading file:', error);},});},},
};
</script><style>
.container {display: flex;flex-direction: column;align-items: center;justify-content: center;height: 100vh;
}.waveform {width: 300px;height: 100px;background-color: #f0f0f0;
}.controls {display: flex;justify-content: center;margin-top: 20px;
}button {margin: 0 10px;
}
</style>

请确保在uniapp项目中安装了lamejs库,可以使用以下命令进行安装:

 
npm install lamejs

在Django服务器端,你需要修改视图函数来处理MP3文件的上传和保存。以下是一个简单的示例代码:

 
  • from django.http import JsonResponsedef upload_file(request):if request.method == 'POST' and request.FILES.get('audio'):audio_file = request.FILES['audio']with open('path/to/save/audio.mp3', 'wb') as f:for chunk in audio_file.chunks():f.write(chunk)return JsonResponse({'success': True})return JsonResponse({'success': False, 'message': 'Invalid request'})
    

    请将上述代码保存为一个Django视图函数,并将其添加到你的Django项目的URL配置中。

    注意:上述代码仅为示例,你可能需要根据你的具体需求进行适当的修改和调整。

  • npm install lamejs 下载不下来
  • 如果你无法通过npm install lamejs命令下载lamejs库,可能是由于网络问题或库的可用性问题。你可以尝试以下解决方案:

    1. 使用淘宝镜像:在命令行中执行以下命令,将npm的镜像源切换为淘宝镜像,然后再次尝试安装:

       
  • npm config set registry https://registry.npm.taobao.org
    
  • 使用cnpm:cnpm是淘宝镜像提供的npm镜像的命令行工具,可以尝试使用cnpm来安装:

     
    1. npm install -g cnpm --registry=https://registry.npm.taobao.org
      cnpm install lamejs
      
    2. 手动下载:如果以上方法仍然无法下载,你可以尝试手动下载lamejs库的压缩包。你可以在https://www.npmjs.com/package/lamejs上找到lamejs的页面,然后下载最新版本的压缩包。下载完成后,解压缩并将其中的文件复制到你的uniapp项目中的合适位置。

    请注意,以上解决方案仅供参考,具体的操作可能因个人环境和网络条件而有所不同。如果问题仍然存在,请尝试在其他网络环境下进行安装,或者考虑使用其他类似的库来处理音频文件的转换。

  • npm ERR! code CERT_HAS_EXPIRED
    npm ERR! errno CERT_HAS_EXPIRED
    npm ERR! request to https://registry.npm.taobao.org/cnpm failed, reason: certificate has expirednpm ERR! A complete log of this run can be found in:
    npm ERR!     C:\Users\Administrator\AppData\Local\npm-cache\_logs\2024-01-25T09_21_52_636Z-debug-0.log
  • 这个错误提示表明你的npm证书已过期,导致无法从https://registry.npm.taobao.org下载lamejs库。你可以尝试以下解决方案:

    1. 更新npm:运行以下命令来更新npm到最新版本:

       
  • npm install -g npm
    
  • 清除npm缓存:运行以下命令来清除npm缓存:

     
  • npm cache clean --force
    
  • 使用其他镜像源:尝试使用其他npm镜像源来安装lamejs。你可以尝试使用npm的官方镜像源或其他可靠的镜像源。运行以下命令来切换镜像源:

     
  • npm config set registry https://registry.npmjs.org/
    
  • 使用代理:如果你在使用代理服务器,请确保npm配置了正确的代理设置。你可以通过运行以下命令来配置代理:

     
    1. npm config set proxy http://your-proxy-server:port
      npm config set https-proxy http://your-proxy-server:port
      

    如果以上解决方案仍然无法解决问题,可能是由于网络或其他环境问题导致的。你可以尝试在其他网络环境下进行安装,或者考虑使用其他类似的库来处理音频文件的转换。

这里笔者使用手动下载的方式

要手动下载lamejs到UniApp项目中,可以按照以下步骤进行操作:

  1. 打开lamejs的GitHub页面:https://github.com/zhuker/lamejs

  2. 在页面上找到并点击绿色的 “Code” 按钮,然后选择 “Download ZIP” 下载lamejs的源代码压缩包。

  3. 解压下载的ZIP文件,得到一个名为 “lamejs-master” 的文件夹。

  4. 打开你的UniApp项目,在项目的根目录下找到 “static” 文件夹(如果没有则手动创建一个)。

  5. 将解压得到的 “lamejs-master” 文件夹复制到 “static” 文件夹中。

  6. 在你的UniApp项目中,找到需要使用lamejs的页面或组件。

  7. 在需要使用lamejs的页面或组件中,使用相对路径引入lamejs的相关文件。例如,如果你在页面的script标签中引入lamejs,可以使用以下代码:

 
  • import lamejs from '@/static/lamejs-master/lame.min.js';
    
    1. 现在你可以在页面或组件中使用lamejs的功能了。

    请注意,以上步骤假设你已经安装了UniApp开发环境,并且已经创建了一个UniApp项目。如果你的项目结构有所不同,你需要根据实际情况进行相应的调整。

lamejs (v1.2.1) - Pure JavaScript MP3 Encoder | BootCDN - Bootstrap 中文网开源项目免费 CDN 加速服务

 

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

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

相关文章

docker 网络及如何资源(CPU/内存/磁盘)控制

安装Docker时&#xff0c;它会自动创建三个网络&#xff0c;bridge&#xff08;创建容器默认连接到此网络&#xff09;、 none 、host docker网络模式 Host 容器与宿主机共享网络namespace&#xff0c;即容器和宿主机使用同一个IP、端口范围&#xff08;容器与宿主机或其他使…

第140期 为什么有人无脑吹分布式(20240126)

数据库管理140期 2024-01-26 第140期 为什么有人无脑吹分布式&#xff08;20240126&#xff09;1 环境2 场景3 首席补刀总结 第140期 为什么有人无脑吹分布式&#xff08;20240126&#xff09; 作者&#xff1a;胖头鱼的鱼缸&#xff08;尹海文&#xff09; Oracle ACE Associa…

C++ 设计模式之解释器模式

【声明】本题目来源于卡码网&#xff08;卡码网KamaCoder&#xff09; 【提示&#xff1a;如果不想看文字介绍&#xff0c;可以直接跳转到C编码部分】 【设计模式大纲】 【简介】 --什么是解释器模式&#xff08;第22种设计模式&#xff09; 解释器模式&#xff08;Interpreter…

CodeGPT

GitCode - 开发者的代码家园 gitcode.com/ inscode.csdn.net/liujiaping/java_1706242128563/edit?openFileMain.java&editTypelite marketplace.visualstudio.com/items?itemNameCSDN.csdn-codegpt&spm1018.2226.3001.9836&extra%5Butm_source%5Dvip_chatgpt_c…

实力上榜!安全狗入选《CCSIP 2023中国网络安全行业业全景册(第六版)》多个细项

1月24日&#xff0c;Freebuf发布了《CCSIP 2023中国网络安全行业业全景册&#xff08;第六版&#xff09;》。 作为国内云原生安全领导厂商&#xff0c;安全狗也入选多个细分领域。 厦门服云信息科技有限公司&#xff08;品牌名&#xff1a;安全狗&#xff09;创办于2013年&…

学习gin框架知识的小注意点

Gin框架的初始化 有些项目中 初始化gin框架写的是&#xff1a; r : gin.New() r.Use(logger.GinLogger(), logger.GinRecovery(true)) 而不是r : gin.Default() 为什么呢&#xff1f; 点击进入Default源码发现其实他也是new两个中间件&#xff0c;&#xff08;Logger&…

【并发编程】锁死的问题——如何解决?以及如何避免?

目录 1.如何解决 一、死锁的定义和原因 1.1 定义 1.2 原因 二、常见的死锁场景 2.1 线程间相互等待资源 2.2 嵌套锁的循环等待 2.3 对资源的有序请求 三、死锁排查的方法 3.1 使用jstack命令 3.2 使用jconsole 3.3 使用VisualVM 四、常见的解决方案 4.1 避免嵌套锁…

STK姿态分析(一)矢量组件

文章目录 内容简介一、卫星矢量二、卫星坐标平面三、卫星姿态球面 – 内容简介 接下来一系列文章将进行STK目标&#xff08;卫星、导弹、火箭、飞机、船舶&#xff09;姿态分析的仿真。本篇将使用矢量&#xff08;vector&#xff09;组件对卫星姿态、传感器指向等进行3D可视化…

注册表学习——注册表结构

简介&#xff1a;注册表是由很多项和值构成的。 HEKY_USERS&#xff08;HKU&#xff09; 主要保存默认用户及当前登录用户配置信息。 .DEFAULT 该项是针对未来创建的新用户所保存的默认配置项。 S-1-5-18等项 这些项叫作安全标识符&#xff08;SID&#xff09;用来表示Windows操…

Linux(linux版本 centos 7) 下安装 oracle 19c详细教程(新手小白易上手)

一、安装前准备 1、下载预安装包 wget http://yum.oracle.com/repo/OracleLinux/OL7/latest/x86_64/getPackage/oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm预安装包下载成功 2、下载oracle安装包 下载地址如下 https://www.oracle.com/cn/database/technologies…

渲染与创造之美:互为表里的艺术

在五彩斑斓的艺术世界中&#xff0c;渲染与创造是两股不可或缺的力量。它们之间的关系&#xff0c;恰如弓与箭&#xff0c;互为表里&#xff0c;共同塑造出无数令人叹为观止的视觉景象。创造之美是指通过创新思维和创造力&#xff0c;将想象具象化为现实&#xff0c;创造出新的…

引领未来:云原生在产品、架构与商业模式中的创新与应用

文章目录 一、云原生产品创新二、云原生架构设计三、云原生商业模式变革《云原生落地 产品、架构与商业模式》适读人群编辑推荐内容简介目录 随着云计算技术的不断发展&#xff0c;云原生已经成为企业数字化转型的重要方向。接下来将从产品、架构和商业模式三个方面&#xff0c…

最小覆盖子串(Leetcode76)

例题&#xff1a; 分析: 比如现在有字符串&#xff08;s&#xff09;&#xff0c;s "ADOBECODEBANC", 给出目标字符串 t "ABC", 题目就是要从原始字符串&#xff08;s&#xff09;中找到一个子串&#xff08;res&#xff09;可以覆盖目标字符串 t &…

微信小程序(十六)slot插槽

注释很详细&#xff0c;直接上代码 上一篇 温馨提醒&#xff1a;此篇需要自定义组件的基础&#xff0c;如果不清楚请先看上一篇 新增内容&#xff1a; 1.单个插槽 2.多个插槽 单个插糟 源码&#xff1a; myNav.wxml <view class"navigationBar custom-class">…

师如灯塔,照我前行:我在誉天的RHCA认证之旅

时光荏苒&#xff0c;岁月如梭。2022年10月&#xff0c;我踏上了通向RHCA&#xff08;Red Hat Certified Architect&#xff09;证书的征程。2023年11月&#xff0c;我成功拿到了RHCA证书&#xff0c;也给这段旅程画上了圆满的句号。 而在这充满挑战和成长的旅程中&#xff0c;…

防火墙ip配置

如图所示需要配置该拓扑的ip 1.首先在交换机7上创建vlan 2 3 [Huanwei]vlan batch 2 3 2.分别进入0/0/3 和0/0/2接口 [Huawei-GigabitEthernet0/0/3]port link-type access [Huawei-GigabitEthernet0/0/2]port link-type access 3.定义所属vlan [Huawei-GigabitEthernet0…

【python爬虫】爬虫编程技术的解密与实战

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a; 爬虫】网络爬虫探秘⏰诗赋清音&#xff1a;云生高巅梦远游&#xff0c; 星光点缀碧海愁。 山川深邃情难晤&#xff0c; 剑气凌云志自修。 目录 &#x1f33c;实验目的 &#x1f…

数字孪生系统的难点

数字孪生系统的开发和实施涉及一些技术难点&#xff0c;这些难点需要综合应用多个领域的知识和技术来克服。以下是一些数字孪生系统开发中的技术难点&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1…

【每日一题】4.LeetCode——杨辉三角

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有限&#xff0c;欢迎各位大佬指点&…

监听元素宽高变化---new ResizeObserver

参考&#xff1a;ResizeObserver API详解-CSDN博客 有的时候需要监听某个元素的宽高变化&#xff0c;这个时候可以使用JS的 resizeObserver 钩子函数。 用于监视元素的大小变化。它可以观察一个或多个 DOM 元素&#xff0c;以便在元素的大小或形状发生变化时触发回调函数。R…