微信小程序音频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不行的状况。

相关文章
相关标签/搜索