最近在寫一個小程序(原創詩詞平臺,名字叫做「詩人呀」)的功能,需求是須要把用戶的錄音記錄並上傳到服務器,而後調用接口來實現播放功能。html
翻閱很多資料都發現小程序對wx.startRecord()接口不在維護,小程序
注意:1.6.0 版本開始,本接口再也不維護。建議使用能力更強的 wx.getRecorderManager 接口api
須要使用新的接口來處理,官方文檔又不符合個人需求,因此就決定本身動手來實現一下錄音播放功能。服務器
所以咱們使用的使用 wx.getRecorderManager 接口:網絡
首先使用方法獲取對象app
const recorderManager = wx.getRecorderManager()
const innerAudioContext = wx.createInnerAudioContext()
而後寫一個button來調用開始錄音的方法。ide
//開始錄音的時候
start: function () {
const options = {
duration: 10000,//指定錄音的時長,單位 ms
sampleRate: 16000,//採樣率
numberOfChannels: 1,//錄音通道數
encodeBitRate: 96000,//編碼碼率
format: 'mp3',//音頻格式,有效值 aac/mp3
frameSize: 50,//指定幀大小,單位 KB
}
//開始錄音
recorderManager.start(options);
recorderManager.onStart(() => {
console.log('recorder start')
});
//錯誤回調
recorderManager.onError((res) => {
console.log(res);
})
},
再寫一個button來調用中止錄音的方法。this
//中止錄音
stop: function () {
recorderManager.stop();
recorderManager.onStop((res) => {
this.tempFilePath = res.tempFilePath;
console.log('中止錄音', res.tempFilePath)
const { tempFilePath } = res
})
},
最後寫一個播放聲音的方法編碼
//播放聲音
play: function () {
innerAudioContext.autoplay = true
innerAudioContext.src = this.tempFilePath,
innerAudioContext.onPlay(() => {
console.log('開始播放')
})
innerAudioContext.onError((res) => {
console.log(res.errMsg)
console.log(res.errCode)
})
},
這樣就完成新API的操做了,WXML代碼以下:url
<button bindtap="start" class='btn'>開始錄音</button> <button bindtap="stop" class='btn'>中止錄音</button> <button bindtap="play" class='btn'>播放錄音</button>
可是我發現點擊播放根本播放不出來。這是爲何呢,路徑也能夠打印出來,原來小程序返回的臨時路徑根本沒法播放,
須要經過wx.uploadFile()方法來從後臺獲取處理好的mp3文件來進行播放。
1. setTimeout(function () { 2. var urls = app.globalData.urls + "/Web/UpVoice"; 3. console.log(s.data.recodePath); 4. wx.uploadFile({ 5. url: urls, 6. filePath: s.data.recodePath, 7. name: 'file', 8. header: { 9. 'content-type': 'multipart/form-data' 10. }, 11. success: function (res) { 12. var str = res.data; 13. var data = JSON.parse(str); 14. if (data.states == 1) { 15. var cEditData = s.data.editData; 16. cEditData.recodeIdentity = data.identitys; 17. s.setData({ editData: cEditData }); 18. } 19. else { 20. wx.showModal({ 21. title: '提示', 22. content: data.message, 23. showCancel: false, 24. success: function (res) { 25. 26. } 27. }); 28. } 29. wx.hideToast(); 30. }, 31. fail: function (res) { 32. console.log(res); 33. wx.showModal({ 34. title: '提示', 35. content: "網絡請求失敗,請確保網絡是否正常", 36. showCancel: false, 37. success: function (res) { 38. } 39. }); 40. wx.hideToast(); 41. } 42. });
將onStop中獲取到的臨時路徑上傳到你的服務器當中,進行處理語音識別和語義,將返回的結果放到audio播放組件中就能夠播放音頻了。
實現完成後的小程序部分截圖以下:
若是你們對於其餘非技術細節也感興趣的話,歡迎點擊此處訪問。