npzzwq99 0afab930a6 视频付费功能上线前的稳定版本 hace 2 semanas
..
README.md 0afab930a6 视频付费功能上线前的稳定版本 hace 2 semanas
RESCUE.md 0afab930a6 视频付费功能上线前的稳定版本 hace 2 semanas
external-player-detect.js 0afab930a6 视频付费功能上线前的稳定版本 hace 2 semanas

README.md

features/livestream

APP-PLUS 直播播放的"桥接层"——把第三方 IjkPlayer 类插件接入到业务层。 与 features/live/(数据/状态/工具)并存,不替代后者。

为什么需要这一层

HBuilderX 5.08+ 把 uni-app <video> 的底层从 ijkplayer 换成了 ExoPlayer (Android) / AVPlayer (iOS), 两者原生都不支持 RTMP,导致"播一阵停一阵"。

解决方案:使用插件市场上带 IjkPlayer 内核的第三方 UTS 原生组件来播 RTMP/FLV。

当前接入的插件:wrs-uts-videoplayer(DCloud 插件市场 id=16312)—— 真 UTS 原生组件, 支持 playerCore: "IjkPlayer",nvue 中可直接用 <wrs-uts-videoplayer> 标签。

目录结构

features/
├── live/                          # 直播业务工具(gateway / stream-picker / trial-meter …)
└── livestream/                    # 第三方播放器接入层(仅 APP-PLUS)
    ├── README.md                  ← 你正在读
    ├── RESCUE.md                  # 集成步骤 + 真机验证清单
    └── external-player-detect.js  # 探测 wrs-uts-videoplayer 是否装好

主调度逻辑

                ┌──────────────────────────────────────┐
                │ 当前流是 rtmp:// / *.flv 吗?         │
                └────────────────┬─────────────────────┘
                                 │
                  ┌──────────────┴──────────────┐
                  ▼                             ▼
              是(直播流)                  否(m3u8 / mp4 录播)
                  │                             │
                  ▼                             ▼
       wrs-uts-videoplayer 已装?        用原生 <video>
                  │                       (ExoPlayer/AVPlayer 也能播 HLS/MP4)
        ┌─────────┴─────────┐
        ▼                   ▼
       是                   否
        │                   │
        ▼                   ▼
  external (IjkPlayer)    video(RTMP 会卡,但至少不崩)

代码体现:components/live-watch/stream-player.nvuestrategy 计算属性。

业务调用

无需调用——stream-player.nvue 自动调度。业务层只需正常传 :source 即可。

如果业务层有自定义需求(比如做悬浮窗、截屏、双流并发),可以直接:

import { hasWrsVideoPlayer, getExternalPlayerApi } from '@/features/livestream/external-player-detect'

if (hasWrsVideoPlayer) {
  const UTSVideoPlayer = getExternalPlayerApi()
  // UTSVideoPlayer.canDrawOverlays()
  // UTSVideoPlayer.isPlaying()
  // UTSVideoPlayer.closePicInPic()
  // ……详见 uni_modules/wrs-uts-videoplayer/readme.md
}

上线前 checklist

详见 RESCUE.md