国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務器之家 - 編程語言 - JavaScript - js教程 - 小程序錄音功能實現

小程序錄音功能實現

2022-02-13 17:21愛喝華農學士的程序媛 js教程

這篇文章主要介紹了小程序錄音功能實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

在開發小程序過程中,有一個實現錄音功能并播放錄音,將錄音上傳至服務器的需求。開發過程中使用了Taro框架,錄音功能通過Taro.getRecorderManager()接口實現,上傳錄音至服務器通過Taro.uploadFile接口實現,播放錄音使用Taro.createInnerAudioContext()接口實現。下面就詳細介紹整個流程是如何實現的。

小程序錄音

首先獲取錄音管理器模塊:

?
1
const recorderManager = Taro.getRecorderManager();

在組件掛載完畢時注冊錄音監聽事件:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
useEffect(() => {
 // 監聽錄音開始
  recorderManager.onStart(() => {
   console.log('開始錄音');
  });
 // 監聽錄音暫停
  recorderManager.onPause(() => {
   console.log('暫停錄音');
  });
 // 監聽錄音繼續
  recorderManager.onResume(() => {
   console.log('繼續錄音');
  });
 // 監聽錄音停止
  recorderManager.onStop((res) => {
   if (res.duration < 1000) {
    Taro.showToast({
     title: '錄音時間太短',
     duration: 1000,
     icon: 'none',
    });
   } else {
    console.log('停止錄音');
    fileUpload(res.tempFilePath);
   }
  });
 
  recorderManager.onError(() => {
   Taro.showToast({
    title: '錄音失敗!',
    duration: 1000,
    icon: 'none',
   });
  });
 }, []);

在錄音onStop的回調函數中,我們可以獲取到錄音的臨時地址res.tempFilePath,但這個地址是有有效期限的,所以我們需要將這個錄音上傳至服務器后臺,進行保存,后續才能正常使用。

onStop回調函數中我們調用了fileUpload函數實現文件上傳,fileUpload函數的實現如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
const fileUpload = (tempFilePath) => {
  Taro.uploadFile({
   url: 'http://127.0.0.1:7001/record', // 服務器地址
   filePath: tempFilePath,
   name: 'file', // 這個隨便填
   header: {
    'content-type': 'multipart/form-data', // 格式必須是這個
    Authorization: Taro.getStorageSync('token'),
   },
   // formData用于傳輸除文件以外的一些信息
   formData: {
    record_name: '朗誦作品',
    poem_id: poemInfo.id,
    category: poemInfo.category,
   },
   success: (res) => {
    console.log(res);
    const url = res.data;
    playAudio(url); // 播放錄音
   },
   fail: (error) => {
    console.log('failed!');
    console.error(error);
   },
  });
 };

需要注意的點是:header中的content-type必須是multipart/form-data。

錄音事件的處理

第一次點擊handleClick就會觸發開始錄音,之后會通過當前狀態判斷是暫停錄音還是繼續錄音。handleComplete用于停止錄音。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
const handleClick = () => {
  const curPause = pause;
  setPause(!curPause);
 
  if (firstRecord) {
   setfirstRecord(false);
 
   recorderManager.start({
    duration: 60000,
    sampleRate: 44100,
    numberOfChannels: 1,
    encodeBitRate: 192000,
    format: 'mp3',
    frameSize: 50,
   });
 
   Taro.showToast({
    title: '開始錄音',
    duration: 1000,
    icon: 'none',
   });
 
  } else {
   if (curPause) {
    recorderManager.pause(); // 暫停錄音
   } else {
    recorderManager.resume(); // 繼續錄音
   }
  }
 };
 
 const handleComplete = () => {
  recorderManager.stop(); // 停止錄音
 };

后臺實現錄音存儲并返回錄音地址

網上大多數博客都沒有涉及這塊內容,下面就介紹一下如何實現,后臺框架我用的是阿里的egg.js。

文件上傳需要配置的東西可見官方文檔:egg.js文件上傳。我們這里使用它的第一種File模式來實現。

因為egg.js框架內置了Multipart插件,可以解析上傳的multipart/form-data類型的數據。

首先,現在配置文件config.default.js中寫入multipart配置:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
module.exports = (app) => {
 const config = (exports = {});
 
 ...
 
 config.multipart = {
  mode: 'file',
  fileSize: '50mb',
 }
 ...
 
 return {
  ...config,
  ...userConfig,
 };
};

然后,在router.js中定義路由:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 提交錄音
router.post('/record', auth, controller.record.postRecord);
 
在controller目錄下定義record.js文件寫入如下內容:
const Controller = require('egg').Controller;
 
class RecordController extends Controller {
 async postRecord() {
  const { ctx } = this;
  const file = ctx.request.files[0];
  const { record_name, poem_id, category } = ctx.request.body;
  
  const res = await ctx.service.record.postRecord(file, record_name, poem_id, category);
 
  ctx.body = res;
 }
}
 
module.exports = RecordController;

在service目錄下定義record.js寫入具體實現:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
const Service = require('egg').Service;
let OSS = require('ali-oss');
 
let aliInfo = {
 // https://help.aliyun.com/document_detail/31837.html
 region: 'oss-cn-guangzhou',
 bucket: 'poem-mini-program',
 accessKeyId: 'xxx', // 填入阿里云的accessKeyId
 accessKeySecret: 'xxx', // 填入阿里云的accessKeySecret
};
 
let client = new OSS(aliInfo);
 
class RecordService extends Service {
 async postRecord(file, record_name, poem_id, category) {
  const url = await this.uploadOSS(file);
  await this.updateRecord(url, record_name, poem_id, category);
 
  return url;
 }
 
 async uploadOSS(file) {
  const { ctx } = this;
 
  let result;
  try {
   // 處理文件,比如上傳到云端
   result = await client.put(file.filename, file.filepath);
  } finally {
   // 需要刪除臨時文件
   await ctx.cleanupRequestFiles();
  }
  return result.url;
 }
 
 async updateRecord(url, record_name, poem_id, category) {
  const { ctx } = this;
 
  console.log('從ctx.locals中取openid');
  console.log(ctx.locals.openid);
  const openid = ctx.locals.openid;
 
  // 將用戶信息記錄到數據庫中
  const res = await ctx.model.Record.create({
   record_name: record_name,
   record_url: url,
   poem_id: poem_id,
   category: category,
   openid: openid,
  });
 }
}
module.exports = RecordService;

這里需要注意的是:

  • 需要注冊阿里云賬號,并在對象存儲那里新建一個存儲桶用于存放音頻,也就是云存儲的實現。
  • 需要安裝ali-ossnpm包,用于連接阿里云對象存儲。在后臺接收到前端上傳的臨時文件后,就會將音頻上傳至阿里云對象存儲中(client.put)。

播放錄音

細心的小伙伴可以注意到在使用Taro.uploadFile接口上傳錄音后,在success回調中調用了playAudio函數用于播放音頻,接下來講一下播放音頻是如何實現的。

首先,使用Taro.createInnerAudioContext獲取audio的上下文對象:

?
1
const innerAudioText = Taro.createInnerAudioContext();

和錄音一樣,在組件掛載完成時,注冊監聽事件:

?
1
2
3
4
5
6
7
8
9
10
useEffect(() => {
  innerAudioText.onPlay(() => {
   console.log('開始播放');
  });
 
  innerAudioText.onError((e) => {
   console.log('播放異常');
   console.log(e);
  });
 }, []);

在錄音文件上傳成功后,調用playAudio方法用于播放錄音:

?
1
2
3
4
const playAudio = (url) => {
 innerAudioText.autoplay = true;
 innerAudioText.src = url;
};

在src被賦予值的時候,錄音就會開始播放。

總結

到此這篇關于小程序錄音功能實現的文章就介紹到這了,更多相關小程序 錄音內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://juejin.cn/post/6936718733767344136

延伸 · 閱讀

精彩推薦
  • js教程JS實現簡單抖動效果

    JS實現簡單抖動效果

    這篇文章給大家結束了通過js實現抖動效果,非常不錯,具有參考借鑒價值,感興趣的朋友參考下吧...

    catEatBird9222022-01-12
  • js教程js簡單粗暴的發布訂閱示例代碼

    js簡單粗暴的發布訂閱示例代碼

    這篇文章主要給大家介紹了js簡單粗暴的發布訂閱的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要...

    威威威威vvvv6452022-01-06
  • js教程js實現有趣的倒計時效果

    js實現有趣的倒計時效果

    這篇文章主要為大家詳細介紹了js實現有趣的倒計時效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    搬磚大法4512022-01-04
  • js教程JavaScript中跨域問題的深入理解

    JavaScript中跨域問題的深入理解

    這篇文章主要給大家介紹了關于JavaScript中跨域問題的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要...

    三七安6652022-02-10
  • js教程原生JS實現pc端輪播圖效果

    原生JS實現pc端輪播圖效果

    這篇文章主要為大家詳細介紹了原生JS實現pc端輪播圖效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    qq_1519846510192021-12-15
  • js教程JavaScript 中 find() 和 filter() 方法的區別

    JavaScript 中 find() 和 filter() 方法的區別

    JavaScript 在 ES6 上有很多數組方法,每種方法都有獨特的用途和好處。...

    鋒享前端4752021-12-28
  • js教程JavaScript 中的六種循環方法

    JavaScript 中的六種循環方法

    這篇文章主要介紹了JavaScript 中的六種循環方法,幫助大家更好的理解和使用JavaScript,感興趣的朋友可以了解下...

    Saku8732021-12-27
  • js教程微信小程序tab切換可滑動切換導航欄跟隨滾動實現代碼

    微信小程序tab切換可滑動切換導航欄跟隨滾動實現代碼

    這篇文章主要介紹了微信小程序tab切換可滑動切換導航欄跟隨滾動實現代碼,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下...

    竹林中9252022-01-19
主站蜘蛛池模板: 色在线视频观看 | 精品久久久久久久久久久下田 | 欧美自拍网 | 日本精品在线 | av网站免费在线观看 | 久久久久久国产 | av一区二区在线观看 | 日韩在线中文字幕 | 亚洲电影在线观看 | 亚洲国产一区二区a毛片 | 国产免费爽爽视频在线观看 | 天堂资源最新在线 | 欧美一级片在线播放 | 欧美激情综合五月色丁香小说 | 九色porny丨国产精品 | 成人高清网站 | 欧美综合一区二区三区 | 欧美日本在线 | 黄在线观看 | 狠狠中文字幕 | 日本网站在线免费观看 | 精品国产综合 | 日韩在线一区二区三区 | 久久精品免费 | 亚洲国产精品一二三区 | 亚洲天堂一区二区 | www.午夜 | 久久av网| 99久久夜色精品国产亚洲1000部 | 精品1区 | 在线视频一区二区 | 三级视频网站 | 免费av在线网站 | 精品在线播放 | 欧美一级黄色片免费看 | 天天色av | 性片网站 | www.天天操 | 在线亚洲欧美 | 亚洲成av人片一区二区梦乃 | 中文字幕av在线 |