live-player拉取rtmp回放片段流播放结束后,会报2103状态码,这种状态时我会主动调用LivePlayerContext.stop()停止播放。但是部分回放流会出现小程序闪退问题。
必现(不是所有rtmp回放流必现。比如设备有10个回放文件,所有文件都有rtmp回放推流地址,并且每次去服务器请求都会更新推流地址,所有rtmp流播放完成都会出现状态码2103。但是大概有2,3个的rtmp地址会出现播放完成后小程序闪退,出现的这2,3个文件重新获取新的rtmp推流地址,一样会闪退。必然闪退,试过真机调试、预览、体验版,这几个回放文件获取到的rtmp流播放完后均出现必然闪退)
因为不是所有流均出现该问题,并且出现问题的流是必现的,所有怀疑不是调用代码问题,可能是第三方提供的流地址与微信小程序端不兼容问题。日志已上传,微信号lx_goodness,最后报错时间点:2022年1月10日4点50-5点之间。
以下代码片段为判断状态live-player的bindstatechange
statechange(e) {
console.log('live-player code:', e.detail.code, e.detail);
const {
code
} = e.detail;
let {
videoLoadingStatus
} = this.data
switch (code) {
case 2007: //启动loading
videoLoadingStatus = 0;
this.setData({
playVideo: true,
videoLoadingStatus: 0,
})
break
case 2001: //连接服务器
videoLoadingStatus = 20 + Math.floor(Math.random() * 10 + 1)
break
case 2002: //已经连接 RTMP 服务器,开始拉流
videoLoadingStatus = 40 + Math.floor(Math.random() * 10 + 1)
break
case 2008: // 解码器启动
break;
case 2009: //视频分辨率改动
break;
case 2004: // 视频播放开始
videoLoadingStatus = 80 + Math.floor(Math.random() * 10 + 1)
break
case 2105:
break
case 2003: //网络接收到首个视频数据包(IDR)
videoLoadingStatus = 100
this.setData({
playVideo: true
})
this.autoHideControl()
break
case 2103: //网络断连, 已启动自动重连
this.handleStop()
break
case 3001:
case 3002:
case 3003:
case 3005: // 播放失败
videoLoadingStatus = 100
this.checkNetWork()
this.handleStop()
this.setData({
showVideoControls: false,
videoNetWorkError: true,
videoLoadingStatus: 100,
});
break
case -2301: // 经多次重连抢救无效,更多重试请自行重启播放
videoLoadingStatus = 100;
this.setData({
showVideoControls: false,
videoNetWorkError: true,
videoLoadingStatus: 100,
})
break
}
this.setData({
videoLoadingStatus: videoLoadingStatus,
playCode: code
})
}
以下代码片段为获取播放地址、播放、停止相关方法
getPlayUrl(param) {
var _this = this;
wx.showLoading({
title: '加载中',
})
app.authRequest({
url: 'camera/playback?deviceId=' + _this.properties.did + '&startTime=' + param.startTime + '&endTime=' + param.endTime,
success: (res) => {
wx.hideLoading()
console.log('获取到的播放地址:', res);
if (res.data.code == "200" && res.data.data && res.data.data.url) {
const playUrl = res.data.data.url
this.setData({
videoSrc: playUrl
})
// 先停止
this.handleStop()
// 开始播放
setTimeout(() => {
_this.handlePlay()
}, 100)
} else {
this.setData({
videoSrc: ''
})
wx.showToast({
title: '播放失败,请稍后重试',
icon: 'none'
})
}
},
fail: () => {
wx.hideLoading()
wx.showToast({
title: '网络异常!',
icon: 'none'
})
}
})
},
handlePlay(callback) {
console.log("handelPlay", this.data.playVideo, this.data.isHD);
livePlayerContext.play({
success: () => {
console.log("开始播放视频")
this.setData({
showVideoControls: true,
videoLoadingStatus: 1,
videoNetWorkError: false,
})
if (callback && typeof callback === "function") {
callback();
}
},
fail: (error) => {
this.checkNetWork();
wx.showToast({
title: '网络异常',
icon: 'none',
})
console.log("开始播放失败");
this.setData({
videoNetWorkError: true,
showVideoControls: false,
videoLoadingStatus: 100,
})
}
})
},
handleStop(callback) {
console.log("stop");
livePlayerContext.stop({
success: () => {
this.setData({
playVideo: false,
videoLoadingStatus: 0,
panelStatus: 0,
})
if (callback && typeof callback === "function") {
callback()
}
},
fail: (error) => {
console.log("停止播放失败")
}
})
}
你好,麻烦提供出现问题的具体机型、微信版本号、系统版本号,以及能复现问题的代码片段(https://developers.weixin.qq.com/miniprogram/dev/devtools/minicode.html)