最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

微信小程序錄音實(shí)現(xiàn)功能并上傳(使用node解析接收)

 更新時(shí)間:2020年02月26日 14:14:21   作者:weixin_43188227  
在我們的日常開(kāi)發(fā)中經(jīng)常會(huì)遇到錄音功能,并上傳到服務(wù)器,今天小編給大家分享微信小程序錄音功能實(shí)現(xiàn)并上傳錄音文件,使用node解析接收,需要的朋友可以參考下

背景

我在開(kāi)發(fā)小程序的時(shí)候,有需求要實(shí)現(xiàn)錄音功能,并能上傳給服務(wù)器。小程序錄音功能我是使用的微信的wx.getRecorderManager()實(shí)現(xiàn)的,通過(guò)該方法創(chuàng)建實(shí)例,實(shí)例錄音得到的文件是本地臨時(shí)文件,上傳文件需要使用微信的wx.uploadFile(Object object)方法,這就是本次項(xiàng)目的背景。

小程序端

html頁(yè)面主要是第一個(gè)按鈕,兩個(gè)事件,長(zhǎng)按開(kāi)始錄音,松手停止錄音。第二個(gè)按鈕只是一個(gè)播放錄音的功能,用于確定錄音是否成功

<!--pages/record/record.wxml-->
<button bindtap="playVoice" type="primary" disabled="{{tempFilePath === ''}}">播放錄音</button>
<button type="warn" bindtouchstart="beginRecord" bindtouchend="endRecord">長(zhǎng)按開(kāi)始錄音,松手停止錄音</button>

js部分主要就是兩個(gè)事件

// pages/record/record.js
// 兩個(gè)實(shí)例聲明在Page之外,方便訪問(wèn)
const recorderManager = wx.getRecorderManager() //這是錄音功能的實(shí)例,必須的
const innerAudioContext = wx.createInnerAudioContext(); //這是播放錄音功能需要的實(shí)例
Page({
 data: {
 tempFilePath: '' //存放錄音文件的臨時(shí)路徑
 },
 // 播放錄音
 playVoice: function(e) {
 innerAudioContext.onPlay(() => {
 console.log('開(kāi)始播放')
 })
 innerAudioContext.onError((res) => {
 console.log(res.errMsg)
 console.log(res.errCode)
 })
 innerAudioContext.play();
 },
 // 錄音
 beginRecord:function(e) {
 // 監(jiān)聽(tīng)錄音開(kāi)始事件
 recorderManager.onStart(() => {
 console.log('recorder start')
 })
 // 監(jiān)聽(tīng)已錄制完指定幀大小的文件事件。如果設(shè)置了 frameSize,則會(huì)回調(diào)此事件。
 recorderManager.onFrameRecorded((res) => {
 const { frameBuffer } = res
 console.log('frameBuffer.byteLength', frameBuffer.byteLength)
 })
 //錄音的參數(shù)
 const options = {
 duration: 60000, //錄音時(shí)間,默認(rèn)是60s,提前松手會(huì)觸發(fā)button的bindtouchend事件,執(zhí)行停止函數(shù)并上傳錄音文件。超過(guò)60s不松手會(huì)如何并未測(cè)試過(guò)
 sampleRate: 44100,
 numberOfChannels: 1,
 encodeBitRate: 192000,
 format: 'mp3', //錄音格式,這里是mp3
 frameSize: 50 //指定幀大小,單位 KB。傳入 frameSize 后,每錄制指定幀大小的內(nèi)容后,會(huì)回調(diào)錄制的文件內(nèi)容,不指定則不會(huì)回調(diào)。暫僅支持 mp3 格式。
 }
 //開(kāi)始錄音
 recorderManager.start(options); 
 },
 //停止錄音并上傳數(shù)據(jù)
 endRecord:function(e) {
 const self = this;
 //停止錄音
 recorderManager.stop();
 //監(jiān)聽(tīng)錄音停止事件,執(zhí)行上傳錄音文件函數(shù)
 recorderManager.onStop((res) => {
 console.log('recorder stop', res)
 //返回值res.tempFilePath是錄音文件的臨時(shí)路徑 (本地路徑) 
 self.setData({
 tempFilePath: res.tempFilePath
 })
 innerAudioContext.src = res.tempFilePath
 //上傳錄音文件
 var uploadTask = wx.uploadFile({
 //沒(méi)有method,自動(dòng)為POST請(qǐng)求
 filePath: res.tempFilePath,
 name: 'recordFile',  //這個(gè)隨便填
 url: 'http://localhost:3000/record', //填寫自己服務(wù)器的地址。
 header: {
 "Content-Type": "multipart/form-data" //必須是這個(gè)格式
 },
 success:(e) => {
 console.log('succeed!');
 console.log(e); 
 },
 fail: (e) => {
 console.log('failed!');
 console.log(e); 
 }
 });
 uploadTask.onProgressUpdate((e) => {
 console.log(e);
 console.log('期望上傳的總字節(jié)數(shù):' + e.totalBytesExpectedToSend);
 console.log('已經(jīng)上傳的字節(jié)數(shù)' + e.totalBytesSent); 
 })
 })
 }
})

到這里,小程序部分的代碼就已經(jīng)完成了。

node服務(wù)器端

前提:

node服務(wù)器我是用的是 express 框架,如果有不會(huì)的朋友,可以先簡(jiǎn)單了解一下express
要后端能解析用戶上傳的文件,需要合適的中間件??梢詤⒖嘉恼履┪驳闹v解nodejs使用connect-multiparty實(shí)現(xiàn)文件上傳(文件接收)后端。
首先項(xiàng)目需要安裝 express 和 connect-multiparty

npm install express

npm install connnect-multiyparty

大家學(xué)node的,上面兩句不應(yīng)該看不懂。我不加 --save 是因?yàn)樾掳娴膎ode和npm不需要加就會(huì)給你保存在package.json文件內(nèi)。

//這是我的路由文件的代碼片段,監(jiān)聽(tīng)端口號(hào)3000等設(shè)置在我的另一個(gè)文件內(nèi)。
//這只是代碼片段,大概率跑不起來(lái),只起一個(gè)demo的作用。如果需要完整的代碼,可以留言給我。

const express = require('express');
const multiparty = require('connect-multiparty');

var router = express.Router();
var multipartMiddleware = multiparty();
router.use(multiparty({uploadDir:'./temp'})); //將接收文件的地址更改為當(dāng)前目錄下的temp文件夾。如果沒(méi)有,則需要新建該文件夾。

// 處理錄音文件
//只需要這樣處理,上傳的MP3文件就會(huì)保存在指定的目錄下了。
router.post('/record', multipartMiddleware, (request, response) => {
 console.log('received a request');
 console.log(request.files);
 request.on('end', () => {
 response.send('通信完成');
 })
 
})

鄭重提示:保存下來(lái)的是臨時(shí)文件,短時(shí)間內(nèi)就會(huì)自動(dòng)刪除,所以大家需要及時(shí)處理文件,比如寫入到新文件中

這個(gè)框架已經(jīng)兩年沒(méi)更新了,所以這個(gè)框架這不一定是好的,但是是可行的

下面看下nodejs使用connect-multiparty實(shí)現(xiàn)文件上傳(文件接收)后端

文件上傳

文件上傳是服務(wù)器經(jīng)常會(huì)用到的一項(xiàng)功能。做了幾次文件上傳功能,發(fā)現(xiàn)文件接收后端還是沒(méi)那么容易。嘗試過(guò)不同的中間件,折騰來(lái)折騰去,發(fā)現(xiàn)connect-multiparty用起來(lái)比較簡(jiǎn)單,適配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的形式上傳數(shù)據(jù),后端通過(guò)中間件connect-multipary接收。
注意,接收結(jié)果req.files是一個(gè)對(duì)象,包含POST上傳的參數(shù)和一個(gè)臨時(shí)文件,文件一般在/tmp目錄下,可以將文件移動(dòng)到指定位置。

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

總結(jié)

到此這篇關(guān)于微信小程序錄音實(shí)現(xiàn)功能并上傳(使用node解析接收)的文章就介紹到這了,更多相關(guān)微信小程序錄音上傳內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • this,this,再次討論javascript中的this,超全面(經(jīng)典)

    this,this,再次討論javascript中的this,超全面(經(jīng)典)

    在JavaScript中,this 的概念比較復(fù)雜。除了在面向?qū)ο缶幊讨?,this 還是隨處可用的。這篇文章介紹了javascript中的this相關(guān)知識(shí),對(duì)javascript this相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧
    2016-01-01
  • javascript作用域容易記錯(cuò)的兩個(gè)地方分析

    javascript作用域容易記錯(cuò)的兩個(gè)地方分析

    javascript作用域容易記錯(cuò)的兩個(gè)地方分析,學(xué)習(xí)js的朋友可以參考下
    2012-06-06
  • 微信小程序如何實(shí)現(xiàn)五星評(píng)價(jià)功能

    微信小程序如何實(shí)現(xiàn)五星評(píng)價(jià)功能

    這篇文章主要介紹了微信小程序如何實(shí)現(xiàn)五星評(píng)價(jià)功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • 微信小程序?qū)崿F(xiàn)皮膚功能(夜間模式)

    微信小程序?qū)崿F(xiàn)皮膚功能(夜間模式)

    這篇文章主要給大家介紹了關(guān)于利用微信小程序?qū)崿F(xiàn)皮膚功能,也就是實(shí)現(xiàn)夜間模式的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-06-06
  • 使用echarts實(shí)現(xiàn)3d柱狀圖+折線圖

    使用echarts實(shí)現(xiàn)3d柱狀圖+折線圖

    這篇文章主要為大家詳細(xì)介紹了如何使用echarts實(shí)現(xiàn)3d柱狀圖和折線圖,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以了解一下
    2024-12-12
  • 在VS?Code中使用Snippet?Craft擴(kuò)展提高編碼效率的過(guò)程詳解

    在VS?Code中使用Snippet?Craft擴(kuò)展提高編碼效率的過(guò)程詳解

    這篇文章主要介紹了在VS?Code中使用Snippet?Craft擴(kuò)展提高編碼效率,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-08-08
  • JS的千分位算法實(shí)現(xiàn)思路

    JS的千分位算法實(shí)現(xiàn)思路

    本文為大家講解下JS的千分位算法的具體實(shí)現(xiàn),先去除空格,判斷是否空值和非數(shù);針對(duì)是否有小數(shù)點(diǎn),分情況處理;感興趣的朋友可以參考下
    2013-07-07
  • JS實(shí)現(xiàn)無(wú)限級(jí)網(wǎng)頁(yè)折疊菜單(類似樹(shù)形菜單)效果代碼

    JS實(shí)現(xiàn)無(wú)限級(jí)網(wǎng)頁(yè)折疊菜單(類似樹(shù)形菜單)效果代碼

    這篇文章主要介紹了JS實(shí)現(xiàn)無(wú)限級(jí)網(wǎng)頁(yè)折疊菜單(類似樹(shù)形菜單)效果代碼,涉及JavaScript基于鼠標(biāo)事件實(shí)現(xiàn)針對(duì)頁(yè)面元素結(jié)點(diǎn)的遍歷及樣式操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-09-09
  • Javascript中async與await的捕捉錯(cuò)誤詳解

    Javascript中async與await的捕捉錯(cuò)誤詳解

    這篇文章主要為大家詳細(xì)介紹了Javascript中async與await的捕捉錯(cuò)誤,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • 使用JavaScript庫(kù)還是自己寫代碼?

    使用JavaScript庫(kù)還是自己寫代碼?

    有時(shí)候在寫JavaScript添加到你的網(wǎng)頁(yè)中的時(shí)候,你將需要決定是使用已有的可用的JavaScript庫(kù)還是自己寫所有代碼。其中每個(gè)各有優(yōu)缺點(diǎn),因此沒(méi)有任何一種方式對(duì)每個(gè)人來(lái)說(shuō)都是絕對(duì)正確的選擇。
    2010-01-01

最新評(píng)論

库伦旗| 格尔木市| 东明县| 商河县| 罗定市| 岢岚县| 抚远县| 迁西县| 广饶县| 东阳市| 昔阳县| 新昌县| 门源| 甘谷县| 隆化县| 明星| 五原县| 定结县| 芷江| 开原市| 邳州市| 八宿县| 临沧市| 淳安县| 华蓥市| 阜新市| 西林县| 蒙阴县| 临潭县| 祁阳县| 彰化县| 巴彦县| 涿鹿县| 鹰潭市| 蒲江县| 新竹县| 鄂尔多斯市| 永州市| 岑巩县| 宜黄县| 仁寿县|