小程序按住录音和录音预览播放

wxml代码:

1. <!-- 录音 -->
2.     <view>
3.       <!-- 预览 -->
4.       <view wx:if="{{voice}}">
5.         <view class='yy_box'>
6.           <view class='yy_box_bg' bindtap='play'>
7.             <view class="yy_box_icon {{onPlay?'audio-animation':''}}"></view>
8.           </view>
9.           <text>{{playDuration}}"</text>
10.         </view>
11.       </view>
12.       <!-- 录音按钮 -->
13.       <view class='recorder'>
14.         <button bindtouchstart='recorderS' bindtouchend='recorderE'>按住说话</button>
15.       </view>
16.     </view>
17.   </view>

 

wxss代码:

1. .yy_box {
2.   display: flex;
3.   align-items: center;
4. }
5.
6. .yy_box_bg {
7.   width: 130px;
8.   height: 30px;
9.   background-color: #9eea6a;
10.   margin: 0 10px;
11.   border-radius: 5px;
12. }
13.
14. .yy_box_bg::before {
15.   content: '';
16.   display: block;
17.   width: 0;
18.   height: 0;
19.   border-top: 5px solid transparent;
20.   border-right: 10px solid #9eea6a;
21.   border-bottom: 5px solid transparent;
22.   position: relative;
23.   left: -10px;
24.   top: 10px;
25. }
26.
27. .yy_box_icon {
28.   width: 11.5px;
29.   height: 14.5px;
30.   background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAABXCAYAAADvct7MAAAEWElEQVRYhe2Zz0sjZxjH37/iGWLe6QRHl7A4RBoliFGEtLCXRZQqrIoQ8VAICKIe0kPIQqJx/TGCxDgzeecNe1loD0tvhW6PLWwPpXR7KT0slBbEslQpsixZNj00b5h9fScz68xpNw/Mxdf388w87/M879dHhHrWsw/EAEBiT6hgRVEilNJzwzBalNJzjHE0NCe2bT83DKPlfNLpdCIUBwcHB1/ycMMwWmNjY1pgOABIuq4/5uG2bZ+F8vYAIFFKz3gHiUTiVmA4QgjlcrkcD19fX18PBT49Pf0JD9/a2voiMBgApJ2dHcLDl5eXPwsMTyQSt0QZoyhKJBBYluU+QkiTB+/t7T0KnC2Li4szgjR8HloaGobxEwMfHx9/F2qPAQAplUrdDq3se9aznvXMxQBASqfTCU3T+kNvZKenp09Zp9R1/evQHCwsLEzzPZ4Q0gxFjWGMo6LbyTCMlqZp/e8EAwCVPexnAwMDmGlI/gt8360Y40FK6WVbiF7GYrE4c9IWqS94B77PgBByTWmNj49PMAfxeDwmCk88Ho95wvf3978RbZ6amppqh0wqFosP+PVSqVT1hAOAenR09ESgAK6c4eHXKaXnnnDmwLbtCx4wPDw8yt6ej71pmi3fabm2tpbn4RsbG2W2blnWM37dN3x2dvaaOMrn87oD/uuN4ACgViqVr/jNKysrnzvC8lbY6vX6Gz/wjzRNS4oyBmM8iND/FSs40D893xpjPFiv19/wmw8PD5+0q1aqVCqUXy8Wiw884UtLS1lBiZ+xNEylUrdFXyXLcp8nHABU0zR/Y5uq1eqPDIwxjlJKX/Lg3d3dh74zBQDUZDKZmpycnGRgVVVlSumVINYXgdtuuVyuCcBXgf/aQAihoaEhlUu930O7jQBAUhQlUiqVqqurq8s93f6eGQBI7aI6o5S+ymQyo6FmT6BKfVc4KyxZlvsCOQEAaW5u7o5pmtcc+FYDTphIiGqa1i/qOYSQpt9O2VWIYoyjjUbjX96BrxbhR4hqmtZvWda1SyaXy+W6wv0K0ZmZmU8Fb//23SqaiLoJUdu2X7O2CwDSycnJ9/zvFAqFCkKo+0TUjxDlWzNLTwCQPCeiXkIUACSRYBoZGRlynYhOTEx8zDZ7CdFsNntPqA7cJqKU0n+c4RGsd4SoqHpN0/ylsyiaiCaTybhj3VWIAoBECHnNOX/RyRjRRHRzc3OLrXsJ0UajccnBX3bgooloPp+/74B3FaJ8S+jA3Sai2Wz2niMsrkK0HZYmB79ACHlPRL2EqOhALct65joR1XX9MataLyE6Pz9/l1/f3t42PSeiXkK03UF/ENZJt4moHyEqChkhpNk5bNFE1I8QdSvAcrlcQ93MjxDNZDKj3ULmal5CtB2yVzy4UChUPG+jbkIUACTbtv8QfFmw/9AoihKxbfsvQaNqYYyjNwYjhJBhGD/fKM5+rNFo/C065FCUl6IokVqt9rRdE992g/4H+ecsUNqAjLcAAAAASUVORK5CYII=) no-repeat;
31.   background-size: 11.5px 43.5px;
32.   background-position: 0 -29px; /* 默认第三张 */
33.   position: relative;
34.   left: 15px;
35.   top: -2px;
36. }
37. .audio-animation {
38.   animation: voiceplay 2s infinite step-start;
39. }
40. @keyframes voiceplay{
41.   0%, 100%{
42.     background-position: 0 -29px;
43.   }
44.   33.333%{
45.     background-position: 0 0;
46.   }
47.   66.666%{
48.     background-position: 0 -14.5px;
49.   }
50. }
51. .yy_box text {
52.   color: #999;
53. }

 

js代码:

1. data: {
2.     recorderTempFilePath:'', // 录音地址
3.     playDuration: '', // 播放时间
4.     onPlay:false, // 播放状态样式判断
5.     voice: false, // 预览语音显示
6.   },
7. // 按住录音
8.   recorderS:function(){
9.     const options = {
10.       duration: 600000,
11.       sampleRate: 44100,
12.       numberOfChannels: 1,
13.       encodeBitRate: 192000,
14.       format: 'mp3',
15.       frameSize: 50
16.     }
17.     // 开始录音
18.     recorderManager.start(options);
19.     recorderManager.onStart(() => {
20.       // console.log('recorder start')
21.       wx.showLoading({
22.         title: '录音中...',
23.       })
24.
25.     })
26.     //错误回调
27.     recorderManager.onError((res) => {
28.       console.log(res);
29.       wx.hideLoading();
30.       wx.showToast({
31.         title: res,
32.         icon: 'success',
33.         duration: 1000
34.       })
35.     })
36.   },
37.   // 录音结束
38.   recorderE:function(){
39.     let that = this;
40.     // 结束录音
41.     recorderManager.stop();
42.     recorderManager.onStop((res) => {
43.       wx.hideLoading();
44.       wx.showToast({
45.         title: '录音结束',
46.         icon: 'success',
47.         duration: 1000
48.       })
49.       // console.log('recorder stop', res)
50.       const { tempFilePath, duration } = res
51.       let recorderTempFilePath = tempFilePath;
52.       let playDuration = Math.ceil(duration / 1000);
53.       that.setData({
54.         recorderTempFilePath: recorderTempFilePath,
55.         playDuration: playDuration,
56.         voice: true
57.       })
58.     })
59.   },
60.   // 播放录音
61.   play:function(){
62.     let that = this;
63.     let recorderTempFilePath = that.data.recorderTempFilePath;
64.     innerAudioContext.autoplay = true
65.     innerAudioContext.src = recorderTempFilePath
66.     innerAudioContext.onPlay(() => {
67.       // console.log('开始播放')
68.
69.       that.setData({
70.         onPlay:true
71.       })
72.     })
73.     innerAudioContext.onError((res) => {
74.       // console.log(res.errMsg)
75.       // console.log(res.errCode)
76.       wx.showToast({
77.         title: res.errMsg,
78.         icon: 'success',
79.         duration: 2000
80.       })
81.     })
82.     // 播放结束
83.     innerAudioContext.onEnded((res)=>{
84.       that.setData({
85.         onPlay: false
86.       })
87.     })
88.   },