微信小程序音頻IOS沒法播放問題總結

【問題】

微信小程序,將文字轉換爲語音後,使用音頻進行播放。在安卓手機下能夠正常播放,在IOS下不行。javascript

【環境】

微信小程序庫版本2.3.0
百度語音合成服務java

【解決方法】

正確代碼:小程序

//建立一個音頻實例
const myaudio = wx.createInnerAudioContext();

//設置obeyMuteSwitch: false(不遵循系統靜音開關,即便用戶打開了靜音開關,也能繼續發出聲音)
//設置autoplay: true(自動開始播放)
if (wx.setInnerAudioOption) {
  wx.setInnerAudioOption({
    obeyMuteSwitch: false,
    autoplay: true
  })
}else {
  myaudio.obeyMuteSwitch = false;
  myaudio.autoplay = true;
}

//監聽各個階段
myaudio.onCanplay(() => {
  console.log('能夠播放');
});
myaudio.onPlay(() => {
  console.log('監聽到音頻開始播放');
});
myaudio.onEnded(() => {
  console.log('音頻天然播放結束事件');
});
myaudio.onStop(() => {
  console.log('音頻中止事件');
});
myaudio.onError((res) => {
  console.log(res.errMsg);
  console.log(res.errCode);
});
myaudio.onWaiting((res) => {
  console.log('音頻加載中事件,當音頻由於數據不足,須要停下來加載時會觸發')
});


//設置播放連接
myaudio.src = 'https://tsn.baidu.com/text2audio?lan=zh&ctp=1&cuid=abcdxxx&tok=24.b63*************************************.1543030920.282335-11522973&tex=' + encodeURIComponent(encodeURIComponent('哈哈哈哈哈哈哈哈哈')) + '&vol=5&per=0&spd=5&pit=5&aue=324.b6306a3dff68e153a0d5656b3a78bd5e.2592000.1543030920.282335-11522973';

//播放
myaudio.play();

這樣,在安卓和IOS下均可以正常播放了。微信小程序

【問題總結】

爲何老是播放不了?注意下面兩點:跨域

一、這個播放連接返回的必須是格式正確的音頻文件瀏覽器

因此若是換一個連接就能播放了,那可能就說明你原來的連接返回了錯誤的音頻格式。微信

本來個人播放連接是:ui

myaudio.src = 'https://tts.baidu.com/text2audio?lan=zh&ie=UTF-8&spd=5&text=' + encodeURIComponent('哈哈哈哈哈哈哈哈哈');

這個tts.baidu.com和tsn.baidu.com長得很是像,爲何一開始用的不是tsn?是由於在網上搜索到的好多案例都是用的tts,並且tsn須要token參數,這個參數要麼須要從百度AI開放平臺手動獲取,要麼須要調用獲取token的接口,而這個接口又不支持瀏覽器跨域,所以須要從服務端獲取token或者每隔30天手動輸入更新,我嫌麻煩,因此一開始先用了tts。編碼

tts在安卓下確實能夠正常播放,能夠看到Console中依次打印出了:3d

監聽到音頻開始播放
音頻加載中事件,當音頻由於數據不足,須要停下來加載時會觸發
能夠播放
音頻天然播放結束事件

可是在IOS下就沒法播放了,Console中依次打印出了:

音頻加載中事件,當音頻由於數據不足,須要停下來加載時會觸發
INNERERRCODE:-11850, ERRMSG:操做中止
10002

根據官方的說法,應該是由於返回的音頻格式IOS不支持。(https://developers.weixin.qq....)若是返回的音頻格式正確,是能夠正常播放的。

ps:後來查了一下發現tts這個接口應該只是他們內部demo地址,因此仍是使用正式的tsn吧。

二、須要對tsn接口的文本字符串參數進行編碼
好比: encodeURIComponent(encodeURIComponent('哈哈哈哈哈哈哈哈哈'));

沒有作編碼,直接上文本的,也會出現安卓行IOS不行的狀況。

相關文章
相關標籤/搜索