您好,登錄后才能下訂單哦!
背景
我在開發小程序的時候,有需求要實現錄音功能,并能上傳給服務器。小程序錄音功能我是使用的微信的wx.getRecorderManager()實現的,通過該方法創建實例,實例錄音得到的文件是本地臨時文件,上傳文件需要使用微信的wx.uploadFile(Object object)方法,這就是本次項目的背景。
小程序端
html頁面主要是第一個按鈕,兩個事件,長按開始錄音,松手停止錄音。第二個按鈕只是一個播放錄音的功能,用于確定錄音是否成功
<!--pages/record/record.wxml--> <button bindtap="playVoice" type="primary" disabled="{{tempFilePath === ''}}">播放錄音</button> <button type="warn" bindtouchstart="beginRecord" bindtouchend="endRecord">長按開始錄音,松手停止錄音</button>
js部分主要就是兩個事件
// pages/record/record.js // 兩個實例聲明在Page之外,方便訪問 const recorderManager = wx.getRecorderManager() //這是錄音功能的實例,必須的 const innerAudioContext = wx.createInnerAudioContext(); //這是播放錄音功能需要的實例 Page({ data: { tempFilePath: '' //存放錄音文件的臨時路徑 }, // 播放錄音 playVoice: function(e) { innerAudioContext.onPlay(() => { console.log('開始播放') }) innerAudioContext.onError((res) => { console.log(res.errMsg) console.log(res.errCode) }) innerAudioContext.play(); }, // 錄音 beginRecord:function(e) { // 監聽錄音開始事件 recorderManager.onStart(() => { console.log('recorder start') }) // 監聽已錄制完指定幀大小的文件事件。如果設置了 frameSize,則會回調此事件。 recorderManager.onFrameRecorded((res) => { const { frameBuffer } = res console.log('frameBuffer.byteLength', frameBuffer.byteLength) }) //錄音的參數 const options = { duration: 60000, //錄音時間,默認是60s,提前松手會觸發button的bindtouchend事件,執行停止函數并上傳錄音文件。超過60s不松手會如何并未測試過 sampleRate: 44100, numberOfChannels: 1, encodeBitRate: 192000, format: 'mp3', //錄音格式,這里是mp3 frameSize: 50 //指定幀大小,單位 KB。傳入 frameSize 后,每錄制指定幀大小的內容后,會回調錄制的文件內容,不指定則不會回調。暫僅支持 mp3 格式。 } //開始錄音 recorderManager.start(options); }, //停止錄音并上傳數據 endRecord:function(e) { const self = this; //停止錄音 recorderManager.stop(); //監聽錄音停止事件,執行上傳錄音文件函數 recorderManager.onStop((res) => { console.log('recorder stop', res) //返回值res.tempFilePath是錄音文件的臨時路徑 (本地路徑) self.setData({ tempFilePath: res.tempFilePath }) innerAudioContext.src = res.tempFilePath //上傳錄音文件 var uploadTask = wx.uploadFile({ //沒有method,自動為POST請求 filePath: res.tempFilePath, name: 'recordFile', //這個隨便填 url: 'http://localhost:3000/record', //填寫自己服務器的地址。 header: { "Content-Type": "multipart/form-data" //必須是這個格式 }, success:(e) => { console.log('succeed!'); console.log(e); }, fail: (e) => { console.log('failed!'); console.log(e); } }); uploadTask.onProgressUpdate((e) => { console.log(e); console.log('期望上傳的總字節數:' + e.totalBytesExpectedToSend); console.log('已經上傳的字節數' + e.totalBytesSent); }) }) } })
到這里,小程序部分的代碼就已經完成了。
node服務器端
前提:
node服務器我是用的是 express 框架,如果有不會的朋友,可以先簡單了解一下express。
要后端能解析用戶上傳的文件,需要合適的中間件。可以參考文章末尾的講解nodejs使用connect-multiparty實現文件上傳(文件接收)后端。
首先項目需要安裝 express 和 connect-multiparty
npm install express npm install connnect-multiyparty
大家學node的,上面兩句不應該看不懂。我不加 --save 是因為新版的node和npm不需要加就會給你保存在package.json文件內。
//這是我的路由文件的代碼片段,監聽端口號3000等設置在我的另一個文件內。 //這只是代碼片段,大概率跑不起來,只起一個demo的作用。如果需要完整的代碼,可以留言給我。 const express = require('express'); const multiparty = require('connect-multiparty'); var router = express.Router(); var multipartMiddleware = multiparty(); router.use(multiparty({uploadDir:'./temp'})); //將接收文件的地址更改為當前目錄下的temp文件夾。如果沒有,則需要新建該文件夾。 // 處理錄音文件 //只需要這樣處理,上傳的MP3文件就會保存在指定的目錄下了。 router.post('/record', multipartMiddleware, (request, response) => { console.log('received a request'); console.log(request.files); request.on('end', () => { response.send('通信完成'); }) })
鄭重提示:保存下來的是臨時文件,短時間內就會自動刪除,所以大家需要及時處理文件,比如寫入到新文件中
這個框架已經兩年沒更新了,所以這個框架這不一定是好的,但是是可行的
下面看下nodejs使用connect-multiparty實現文件上傳(文件接收)后端
文件上傳
文件上傳是服務器經常會用到的一項功能。做了幾次文件上傳功能,發現文件接收后端還是沒那么容易。嘗試過不同的中間件,折騰來折騰去,發現connect-multiparty用起來比較簡單,適配nodejs版本v0.12.11。
用法
var multipart = require('connect-multiparty'); var multipartMiddleware = multipart(); app.post('/upload', multipartMiddleware, function(req, resp) { console.log(req.body, req.files); // don't forget to delete all req.files when done });
前端用multipart/form-data的形式上傳數據,后端通過中間件connect-multipary接收。
注意,接收結果req.files是一個對象,包含POST上傳的參數和一個臨時文件,文件一般在/tmp目錄下,可以將文件移動到指定位置。
var fs = require('fs'); var source = fs.createReadStream(path); var dest = fs.createWriteStream(output); source.pipe(dest); source.on('end', function() { fs.unlinkSync(path);}); //delete source.on('error', function(err) { });
參考
connect-multiparty
總結
到此這篇關于微信小程序錄音實現功能并上傳(使用node解析接收)的文章就介紹到這了,更多相關微信小程序錄音上傳內容請搜索億速云以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持億速云!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。