更新记录
1.1.3(2026-09-22)
- 修复 iOS 云打包在 Xcode 26.5 / Swift 6 下的 NSNumber 构造编译失败(致命):
new NSNumber(value: x)/new NSNumber(integer: x)/new NSNumber(int: x)三种写法均无法通过云打包——Xcode 26.5 已将NSNumber的全部定型 init(init(integer:)/init(int:)/init(long:)…)重命名为init(value:),而当前 UTS 转译器无法生成init(value:)(写成value:/value =都会被丢冒号、生成非法的NSNumber(value x))。改为用 UTS 桥接转型x as NSNumber:Int/Int32经_ObjectiveCBridgeable桥接为NSNumber是 Swift 合法写法,不调用任何被判名的 init,生成的x as NSNumber在 Xcode 26.5 直接通过,同时仍产出NSNumber满足number回调边界。涉及 14 处:播放/推流 observer 的onError/onStatus回调参数,以及isTxPushing()返回值 - 本问题为「UTS 转译器版本 vs 云打包 Xcode 26.5」的
NSNumberAPI 不兼容;若后续 UTS 转译器升级能正确生成init(value:),可把 14 处as NSNumber回退为更直观的new NSNumber(value: x) - 仅影响 iOS 云打包;Android 不受影响。详见插件内
iOS云打包NSNumber编译问题总结.md
1.1.2(2026-09-20)
- 修复推流连接状态不更新:真机验证推流实际成功(腾讯云流管理「直播中」、实时播放有画面),但
onPushStatusUpdate的ConnectSuccess(2)未透传到 JS(Connecting(1)正常),App 状态一直停在「正在连接」。新增isTxPushing()API(透出 SDKisPushing()),前端在 Connecting 后每 2 秒轮询兜底,推流真正建立即把状态修正为「推流中」;停止/出错时停止轮询 - Android
onPushStatusUpdate增加 console 日志(ordinal+枚举名+msg),便于后续用 logcat 定位回调透传问题 - 已 javap 反编译确认
V2TXLivePushStatus声明顺序:Disconnected(0)/Connecting(1)/ConnectSuccess(2)/Reconnecting(3),status.ordinal映射无误 - iOS 编译通过并真机跑通:修复 iOS 端编译错误——①
Int has no member rawValue/cannot convert V2TXLiveCode to NSNumber:observer 回调的code/status与startLivePlay/switchStream/startPush返回值须声明为原生枚举V2TXLiveCode/V2TXLivePushStatus(import自框架根模块),用.rawValue取 NSInteger;②nil requires contextual type:UTS 会优化掉「只写不读」的模块级变量声明,delegate 强引用变量改为判空读取保留声明;③ destroy 补setObserver(null)断开 observer 引用(对齐 Android,规避潜在内存泄漏) - 修复回调「已释放」:HBuilderX 4.25+ 回调默认一次性回收,
createTxLivePlayer/createTxLivePusher加@UTSJS.keepAlive(Android+iOS 两端),使onStatus/onError可多次触发 - 修复首次推流 License -5:MLVB License 为联网校验(异步),前端
live-push.vue在拿到licenceUrl/licenceKey后立即installLicense提前设置,规避「首次安装+首次推流 -5、之后再点即正常」的时序问题 package.json权限/数据声明补充相机、麦克风权限(推流采集所需),修正过时的「不涉及相机」描述
1.0.2(2026-09-20)
- 修正
app-android/src/index.uts的density()云打包 Kotlin 编译错误:DisplayMetrics.density为Float,返回值补.toDouble()以匹配声明的Double返回类型(修复index.kt:73 Return type mismatch: expected 'Double', actual 'Float')
平台兼容性
uni-app(3.8.4)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| - | √ | - | - | - | - | 8.0 | 26 | - |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| - | - | - | - | - | - | - | - | - | - | - | - |
uni-app x(3.91)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| - | - | 8.0 | - | - | - |
其他
| 多语言 | 暗黑模式 | 宽屏模式 | 蒸汽模式 |
|---|---|---|---|
| × | × | × | √ |
腾讯云直播播放器/推流器 UTS 原生版 (tx-live-player)
App 端 UTS 原生封装腾讯云移动直播 V2TXLivePlayer(拉流播放)与 V2TXLivePusher(讲师开播推流)(LiteAVSDK Live),播放 webrtc://(快直播 LEB) / http(s)-flv(FLV) / rtmp://(RTMP) 直播流实现亚秒级低延迟观看,并支持摄像头/麦克风采集 RTMP 推流开播。
解决什么痛点:uni-app App 端内置
<video>组件无法解码webrtc://(快直播 LEB);内置<live-pusher>在部分基座上不自动起流、且与「关闭内置直播模块」后的 SDK 独占方案冲突。本插件用 UTS 原生封装腾讯云 MLVB SDK,在 App 端同时补齐 webrtc 低延迟拉流与原生推流开播能力,兼容 uni-app vue3。与插件市场现有方案的差异:
jinyu-txlive(id=28370) 是 uni-app x 标准模式组件,本项目是 uni-app vue3,不兼容;- 「腾讯云直播推流拉流 UTS」(id=29557) 是 UTS 兼容模式、仅 nvue 页,本项目是 vue 页,不兼容;
- 「腾讯云移动直播」(id=2812) 是已淘汰付费原生插件(Android≤11/iOS≤14),版本旧、纯 API、¥499。
兼容性
| 项目类型 | 最低版本 | 调用方式 |
|---|---|---|
| uni-app (Vue2) | 不支持 | — |
| uni-app (Vue3) | HBuilderX 3.6+ | JS 调用 |
| uni-app x | HBuilderX 3.9+ | UTS 调用 |
| 小程序 / H5 | 不支持(自动降级为 no-op) | — |
| 平台 | Android | iOS | Web | 小程序 |
|---|---|---|---|---|
| 支持情况 | √(minVersion 26) | √(minVersion 26) | - | - |
Web / 小程序端引入本模块不会报错,所有 API 降级为空操作(no-op),由
study-live等上层组件在#ifdef APP-PLUS下才调用原生能力。
安装
- 将
tx-live-player目录复制到项目的uni_modules目录下(本项目统一放在src/uni_modules/,与 z-paging / uv-ui-tools 一致)。 - 本插件已内置腾讯云 MLVB SDK(aar 位于
utssdk/app-android/libs/,以implementation打包进 APK,作为唯一 SDK 来源;宿主项目manifest.json需关闭内置LivePusher/LivePlayer模块,避免重复类/重复 .so 冲突)。 - 原生 SDK 无法在默认「标准基座」运行,必须云打包 / 自定义基座真机调试。
// #ifdef APP-PLUS
import {
installLicense,
createTxLivePlayer,
switchTxLiveStream,
destroyTxLivePlayer,
} from '@/uni_modules/tx-live-player'
// #endif
功能模块
核心能力(已实现)
- License 安装 (installLicense) - 设置腾讯云 MLVB License(全局一次)
- 创建播放器 (createTxLivePlayer) - 以覆盖层方式插入当前页面并播放,协议按 URL 自动识别
- 无缝切流 (switchTxLiveStream) - webrtc/LEB 与 FLV 互切,用于签名刷新或失败回退
- 销毁播放器 (destroyTxLivePlayer) - 移除覆盖层原生视图,释放资源
- 讲师开播推流 (createTxLivePusher) - 摄像头/麦克风采集 + 覆盖层预览 + RTMP 推流开播
- 推流控制 - stopTxLivePush(停流) / switchTxCamera(前后置) / enableTxCamera(采集开关) / muteTxPushAudio(静音) / destroyTxLivePusher(销毁)
API 列表
installLicense(licenseUrl, licenseKey)
设置腾讯云 MLVB License(全局一次,建议 App 启动时调用;或每次创建前由 createTxLivePlayer 的 licenseUrl/licenseKey 传入)。
installLicense('https://license...', 'your-license-key')
createTxLivePlayer(options)
创建并启动原生播放器(覆盖层方式插入当前页面)。
| 参数 | 类型 | 说明 |
|---|---|---|
rect |
{ left, top, width, height } |
占位 view 的页面坐标,单位 px |
url |
string |
主播放地址,优先传 webrtc://(快直播 LEB,亚秒级低延迟) |
flvUrl |
string |
可选,rtc 失败时的 FLV 回退地址 |
licenseUrl |
string |
可选,创建前 setLicence |
licenseKey |
string |
可选,创建前 setLicence |
callbacks.onStatus |
(code, msg) => void |
状态回调,msg === 'playing' 表示已播放 |
callbacks.onError |
(code, msg) => void |
错误回调,webrtc 失败可 switchTxLiveStream(flvUrl) 回退 |
createTxLivePlayer({
rect: { left: 0, top: 100, width: 360, height: 200 },
url: 'webrtc://play.xxx.com/live/stream', // 快直播 LEB,亚秒级低延迟
flvUrl: 'http://play.xxx.com/live/stream.flv', // 失败回退
callbacks: {
onStatus: (code, msg) => { if (msg === 'playing') console.log('已播放') },
onError: (code, msg) => { /* webrtc 失败可 switchTxLiveStream(flvUrl) */ },
},
})
switchTxLiveStream(url)
无缝切换直播流(支持 webrtc/LEB 与 FLV 互切,用于签名刷新或失败回退)。
switchTxLiveStream('http://play.xxx.com/live/stream.flv')
destroyTxLivePlayer()
停止并销毁原生播放器、移除覆盖层视图。页面关闭时务必调用,否则覆盖层原生视图残留导致内存泄漏 / 黑块。
destroyTxLivePlayer()
createTxLivePusher(options)
创建推流器并开播(讲师开播):渲染覆盖层插入当前页面 → 开启摄像头/麦克风 → startPush。回调 onStatus 的 code 为连接状态(0 断开 / 1 连接中 / 2 连接成功 / 3 重连中)。
| 参数 | 类型 | 说明 |
|---|---|---|
rect |
{ left, top, width, height } |
占位 view 的页面坐标,单位 px(用 uni.createSelectorQuery().boundingClientRect 测量) |
pushUrl |
string |
RTMP 推流地址(含鉴权签名) |
frontCamera |
boolean |
可选,是否前置摄像头(默认 true) |
licenseUrl / licenseKey |
string |
可选,创建前 setLicence |
callbacks.onStatus |
(code, msg) => void |
连接状态回调(0/1/2/3) |
callbacks.onError |
(code, msg) => void |
错误回调(如鉴权失败、地址过期) |
createTxLivePusher({
rect: { left: 0, top: 100, width: 360, height: 260 },
pushUrl: 'rtmp://push.xxx.com/live/stream?txSecret=...',
frontCamera: true,
callbacks: {
onStatus: (code, msg) => { if (code === 2) console.log('已连接推流服务器') },
onError: (code, msg) => { /* 提示并销毁 */ },
},
})
stopTxLivePush() / switchTxCamera(front) / enableTxCamera(enable) / muteTxPushAudio(mute) / destroyTxLivePusher()
推流控制:停止推流与采集(保留实例可重开)/ 前后置切换(成对 stop/start 采集源)/ 摄像头采集开关 / 静音(pauseAudio 停采集但继续发静音包,比 stopMicrophone 更适合直播)/ 销毁推流器与覆盖层(页面关闭时务必调用)。
使用示例
基础播放(推荐写法)
// 1. 启动(rect 为占位 view 的页面坐标;url 优先传 webrtc://)
createTxLivePlayer({
rect: { left: 0, top: 100, width: 360, height: 200 },
url: 'webrtc://play.xxx.com/live/stream',
flvUrl: 'http://play.xxx.com/live/stream.flv',
callbacks: {
onStatus: (code, msg) => { if (msg === 'playing') console.log('已播放') },
onError: (code, msg) => { /* webrtc 失败可 switchTxLiveStream(flvUrl) */ },
},
})
// 2. 无缝切换(签名刷新 / rtc 失败回退 flv)
switchTxLiveStream('http://play.xxx.com/live/stream.flv')
// 3. 关闭页面时销毁(务必调用,移除覆盖层原生视图,否则内存泄漏/黑块)
destroyTxLivePlayer()
集成示例:StudyLive.vue 已集成 —— 直播浮层用占位 <view id="appLivePlayer"> 测量坐标后创建播放器;关闭浮层调用 destroyTxLivePlayer();后台刷新到新签名地址时 switchTxLiveStream 无缝换源。
原生 SDK 接入(必须)
本插件只封装调用逻辑,不包含 MLVB SDK 二进制。需自行下载并放入对应目录:
Android
插件已内置腾讯云 MLVB SDK aar(LiteAVSDK_Live_13.5.0.20670.aar,位于 utssdk/app-android/libs/,以 implementation 打包进 APK,作为唯一 SDK 来源)。宿主项目 manifest.json 必须关闭内置 LivePusher / LivePlayer 模块(否则与插件 SDK 重复类/重复 .so 冲突),相机/麦克风权限由宿主 manifest 配置(CAMERA、RECORD_AUDIO)。
- 升级 SDK 版本:把新版 aar 替换
utssdk/app-android/libs/下同名文件即可。 .so已打包进 aar(一般无需额外处理)。详见下方「SDK 冲突」章节。
iOS
- 下载「直播 SDK / MLVB」的 iOS framework(
TXLiteAVSDK_Live.framework)。 - 放到:
src/uni_modules/tx-live-player/utssdk/app-ios/Frameworks/(HBuilderX 构建时自动链接 framework。)
目录位置说明:本项目 uni_modules 统一放在
src/uni_modules/(与 z-paging/uv-ui-tools 一致)。 若你的 HBuilderX 版本对src/uni_modules下的 UTS 插件不做原生资源合并,请将整个tx-live-player移到项目根uni_modules/,并把StudyLive.vue中的 import 路径@/uni_modules/tx-live-player改为从根解析。
License(必须,否则播放报错)
MLVB 需先设置腾讯云 License(控制台「直播 SDK」→ 创建 License 拿 URL+Key)。建议 App 启动时调用一次:
import { installLicense } from '@/uni_modules/tx-live-player'
installLicense('https://license...', 'your-license-key')
或在前端取到后端下发的 License 后,于 createTxLivePlayer({ licenseUrl, licenseKey, ... }) 传入(每次创建前会 setLicence)。
打包(必须)
原生 SDK 无法在默认「标准基座」运行,必须:
- HBuilderX → 发行 → 原生 App 云打包(或「自定义基座」用于真机调试);
- 勾选本插件 / 确保
uni_modules/tx-live-player被打包; - Android / iOS 证书齐全。
注意事项
编译风险(真机联调前需核对)
本插件 UTS 代码已按 DCloud 官方 UTS 语法(import X from 'pkg.X'、类继承用 extends、重写方法加 override)编写,并参考同工程 xt-device-sdk 的真实可编译写法。但 MLVB SDK 具体类名/方法签名仍以你下载的版本为准,若编译报错优先核对头文件:
- Android
- 包名:
V2TXLivePlayer/V2TXLivePlayerObserver在com.tencent.live2(实现类com.tencent.live2.impl.V2TXLivePlayerImpl);TXCloudVideoView在com.tencent.rtmp.ui,TXLiveBase在com.tencent.rtmp。若你的 aar 包名不同,改 import。 V2TXLivePlayerObserver:MLVB 中是抽象类,本项目用class PlayerObserver extends V2TXLivePlayerObserver+override重写,符合 UTS 规范。- License:本项目调
TXLiveBase.getInstance().setLicence(ctx, url, key)(全局一次)。 - 播放:
startLivePlay(url)协议由 URL 自动识别(webrtc://→快直播 LEB,http(s)-flv→FLV,rtmp://→RTMP),无需 playType 参数。 - 覆盖层定位
activity.findViewById(R.id.content)在带原生导航栏/状态栏机型上可能需叠加偏移(见density()注释)。
- 包名:
- iOS
- 模块名:
TXLiteAVSDK_Live(import 用TXLiteAVSDK_Live.V2TXLivePlayer)。 V2TXLivePlayerObserver是 Objective-C 的@protocol(不是 class),UTS 里要用implements遵循协议:class PlayerDelegate implements V2TXLivePlayerObserver(不能用extends,否则会被编译成 Swift 的类继承、把协议当父类而报 NSObject/@objc 错误)。- observer 协议方法首参是
player,且参数名为message:(非msg:)、code类型为V2TXLiveCode(NSInteger),例如onError(_ player: V2TXLivePlayer, code: V2TXLiveCode, message: String?, extraInfo: NSDictionary?)。UTS 实现时需用@argumentLabel还原参数标签,并用原生类型Int(对应 code)、NSDictionary(对应 extraInfo)——见utssdk/app-ios/index.uts。 V2TXLivePlayer没有delegate属性,只有setObserver:(- (void)setObserver:(id<V2TXLivePlayerObserver>)observer),UTS 里用p.setObserver(delegate)注册;observer 为 weak,delegate 实例必须用模块级强引用持有(本项目playerDelegate变量),否则 ARC 会立即释放、回调永不触发。Android 端 observer 由 SDK 强持有,无需此处理——这是两平台的真实差异。- License:iOS 用
V2TXLivePremier.setLicence(url, key:)(全局一次,无 context 参数)。不是V2TXLivePlayer.setLicence。 - 渲染:SDK 不暴露
videoView属性,本项目自行创建UIView并player.setRenderView(view);播放用startLivePlay(url)(无 type 参数,URL 自动识别协议),没有startPlay(_:type:),也没有V2TXLivePlayType枚举。 - 覆盖层插入
topViewController().view;iOS 13+ 官方推荐用connectedScenes取 key window,本项目用UIApplication.shared.windows.first取 rootViewController(能用,Xcode 可能给 deprecation 警告,不影响构建)。 - 切换流:
switchTxLiveStream直接调player.switchStream(url)(SDK 按 URL 自动识别协议,LEB/FLV 互切无缝)。 - iOS 云打包若使用 Xcode 26.5 / Swift 6:
NSNumber的定型构造器init(integer:)/init(int:)已被重命名为init(value:),而当前 UTS 转译器无法生成init(value:);index.uts统一用as NSNumber桥接转型传number回调(如code.rawValue as NSNumber、(-1) as NSNumber、ret as NSNumber),避免任何被判名的 NSNumber 构造器。涉及 14 处回调/返回值。详见插件内iOS云打包NSNumber编译问题总结.md。
- 模块名:
如编译报错,优先核对对应平台 SDK 头文件,按上面提示微调即可。
SDK 冲突(重要):插件 SDK 与内置 live 模块并存方案
本插件自带腾讯云 MLVB SDK(LiteAVSDK_Live_13.5.0.20670.aar,含 com.tencent.rtmp / com.tencent.liteav / com.tencent.ugc 与 libliteavsdk.so)。uni-app App 内置的 LivePusher / LivePlayer 模块同样内嵌同一份腾讯 LiteAV SDK(weex_livepusher),若插件把 aar 直接打包进 APK,会触发 checkReleaseDuplicateClasses(重复类)与 mergeReleaseNativeLibs(重复 libliteavsdk.so)编译失败。
当前方案(SDK 独占,讲师开播推流的必要条件):插件 aar 位于 utssdk/app-android/libs/,以 implementation 打包进 APK,作为腾讯 LiteAV SDK 的唯一来源;宿主 manifest.json 必须关闭内置 LivePusher / LivePlayer 模块(本项目已关闭)。关闭后 App 端内置 <live-pusher> 不可用——讲师开播已改由本插件 createTxLivePusher 原生推流替代,播放与微信小程序端不受影响。
- 优点:插件推流/播放不依赖基座内置模块,行为确定(不再受部分基座 live-pusher 不自动起流等问题影响);采集与推流时序完全自控。
- 若宿主确需保留内置
LivePusher/LivePlayer模块(如仍有其他页面用内置组件),则须改用 1.0.4 的 compileOnly 方案(aar 移至compileOnlyLibs/+build.gradle以compileOnly引用,运行时复用基座 SDK),但该方案下插件推流与内置组件共享同一份底层 SDK 实例,须自行评估并存风险。
更新日志
v1.1.0 (2026-09-20)
- 新增讲师开播推流:三端封装 MLVB
V2TXLivePusher,API:createTxLivePusher/stopTxLivePush/switchTxCamera/enableTxCamera/muteTxPushAudio/destroyTxLivePusher - iOS:
V2TXLivePusherObserver用implements+@argumentLabel精确匹配 selector;V2TXLivePusher用指定构造器initWithLiveMode:(new/init被NS_UNAVAILABLE) - Android:
V2TXLivePusherImpl(context, V2TXLiveMode.RTMP)+ 抽象类 Observer(extends + override) - aar 回归
libs/独占打包,宿主 manifest 须关闭内置LivePusher/LivePlayer(本项目已关闭)
v1.0.0 (2026-09-20)
- 首次发布:基于腾讯云 MLVB 直播版(Live) SDK 13.5.0 的
V2TXLivePlayer(V2 接口)UTS 原生封装 - 支持
webrtc://(快直播 LEB) /http(s)-flv(FLV) /rtmp://(RTMP) 直播拉流,协议由 URL 自动识别 - 提供 API:
installLicense/createTxLivePlayer/switchTxLiveStream/pauseTxLivePlayer/resumeTxLivePlayer/destroyTxLivePlayer - Android / iOS 双端 UTS 实现,兼容 uni-app vue3
- 需使用者自行放入 MLVB SDK 二进制(aar / xcframework)并申请腾讯云直播 License

收藏人数:
购买源码授权版(
试用
赞赏(0)
下载 39
赞赏 0
下载 12748273
赞赏 1959
赞赏
京公网安备:11010802035340号