收藏
回答

live-player 使用rtmp拉回放流,状态码2103闪退问题?

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({
            playVideotrue,
            videoLoadingStatus0,
          })
          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({
            playVideotrue
          })
          this.autoHideControl()
          break
        case 2103//网络断连, 已启动自动重连
          this.handleStop()
          break
        case 3001:
        case 3002:
        case 3003:
        case 3005// 播放失败
          videoLoadingStatus = 100
          this.checkNetWork()
          this.handleStop()
          this.setData({
            showVideoControlsfalse,
            videoNetWorkErrortrue,
            videoLoadingStatus100,
          });
          break
        case -2301// 经多次重连抢救无效,更多重试请自行重启播放
          videoLoadingStatus = 100;
          this.setData({
            showVideoControlsfalse,
            videoNetWorkErrortrue,
            videoLoadingStatus100,
          })
          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({
            showVideoControlstrue,
            videoLoadingStatus1,
            videoNetWorkErrorfalse,
          })
          if (callback && typeof callback === "function") {
            callback();
          }
        },
        fail(error) => {
          this.checkNetWork();
          wx.showToast({
            title'网络异常',
            icon'none',
          })
          console.log("开始播放失败");
          this.setData({
            videoNetWorkErrortrue,
            showVideoControlsfalse,
            videoLoadingStatus100,
          })
        }
      })
},
handleStop(callback) {
      console.log("stop");
      livePlayerContext.stop({
        success() => {
          this.setData({
            playVideofalse,
            videoLoadingStatus0,
            panelStatus0,
          })
          if (callback && typeof callback === "function") {
            callback()
          }
        },
        fail(error) => {
          console.log("停止播放失败")
        }
      })
}   

最后一次编辑于  2022-01-10
回答关注问题邀请回答
收藏

1 个回答

  • Cjiang
    Cjiang
    2022-01-10

    你好,麻烦提供出现问题的具体机型、微信版本号、系统版本号,以及能复现问题的代码片段(https://developers.weixin.qq.com/miniprogram/dev/devtools/minicode.html

    2022-01-10
    有用
    回复 9
    • 清风扰梦
      清风扰梦
      2022-01-10
      流媒体地址是会过期的,是根据不同客户ID临时获取的。无法提供复现问题的代码片段,日志已于今天凌晨5点左右上传,机型是小米10 ultra 微信是最新版8.0.16、系统也是最新版MIUI12.5.6 Andriod11
      2022-01-10
      回复
    • Cjiang
      Cjiang
      2022-01-11回复清风扰梦
      是会出现闪退问题吗?
      2022-01-11
      回复
    • 清风扰梦
      清风扰梦
      2022-01-11
      是的,一直会复现这个问题,只要某个流播放结束2103闪退一次,那么以后再看这个流也必闪退
      2022-01-11
      回复
    • 清风扰梦
      清风扰梦
      2022-01-11回复Cjiang
      rtmp直播流没有问题,播回放文件会出现这种情况,而且还不是所有流都出现,偶尔有几个流出现播放完闪退小程序。但是这几个流是必现的。流是从海康萤石云平台推过来的。
      2022-01-11
      回复
    • 清风扰梦
      清风扰梦
      2022-01-12回复Cjiang
      只有安卓会闪退崩溃,ios并不会,ios测试过了
      2022-01-12
      回复
    查看更多(4)
登录 后发表内容