需先在微信公众平台申请live-player-plugin插件并配置manifest.json,再用requireplugin动态引入;微信端用cover-view包裹live-player组件,通过uni.createliveplayercontext控制,h5/app端需兜底;播放地址须后端签发且域名备案,状态码需按数字精准处理。

小程序直播插件怎么注册和引入
uni-app 本身不内置直播能力,得靠微信小程序原生插件——live-player-plugin。这个插件不能直接 npm install,必须去微信公众平台后台「小程序插件管理」里申请并添加,否则编译时 requirePlugin 会报错:"plugin not found"。
- 插件 AppID 是
wxa75efa648b60994b(微信官方直播插件,2024 年仍有效,但需确认是否已更新为新版live-pusher-plugin或合并形态) - 添加后,在
manifest.json的「微信小程序配置」里手动填入插件声明:"mp-weixin": { "plugins": { "livePlayer": { "version": "1.4.0", "provider": "wxa75efa648b60994b" } } } - uni-app 的
vue页面中不能用import引入插件组件,必须用requirePlugin动态加载,且仅在微信环境生效:const livePlugin = uni.getProvider ? uni.requirePlugin('livePlayer') : null; - 容易踩的坑:H5 和 App 端完全不支持该插件,调用前务必用
uni.getSystemInfoSync().platform === 'ios' || 'android'做平台判断,否则真机调试时白屏无提示。
live-player 组件怎么在 vue 页面里写
插件引入后,不能直接写 <live-player></live-player> 标签——uni-app 的模板编译器不认识这个自定义标签。必须用 cover-view + cover-image 做 UI 层遮罩,底层用 nativePlugins(App 端)或 web-view(H5)兜底,而微信小程序端才真正用上插件提供的 live-player 原生组件。
- 正确写法是通过
uni.createLivePlayerContext创建上下文(注意不是uni.createVideoContext),再配合cover-view手动布局控制按钮:<cover-view class="player-wrapper"><live-player id="livePlayer" autoplay muted object-fit="contain" bindstatechange="onStateChange"></live-player></cover-view>
-
live-player必须放在cover-view内,否则层级错乱、按钮点不中;也不能放scroll-view或swiper里,会触发渲染异常。 - 参数关键区别:
src不是传 URL,而是传推流地址(如rtmp://xxx或<a href="https://www.php.cn/link/6f049b067c1035a9c94df12ec788cb60">https://www.php.cn/link/6f049b067c1035a9c94df12ec788cb60</a>),且必须是微信校验过的合法域名(在「直播管理后台」配置,不是小程序 request 合法域名)。
推流地址从哪来?怎么鉴权防盗链
小程序端只负责播,不负责推。直播流地址由服务端生成,通常来自腾讯云 TRTC、云直播 LVB 或第三方 SaaS(如保利威、百家云)。uni-app 页面拿到的是一个带时效签名的播放地址,比如:
https://xxx.liveplay.myqcloud.com/live/123456.flv?txTime=65a1b2c3&txSecret=abcd1234...
- 这个地址不能硬编码,也不能前端拼接签名(密钥泄露风险极大),必须走自己后端接口透传,且每次进入直播间都要重新请求。
- 微信要求播放域名必须备案+ICP+在「直播域名管理」中添加,否则
live-player直接静音黑屏,控制台无错误,只在真机日志里看到 "domain not allowed"。 - 容易忽略的一点:如果使用 HTTPS 播放地址(如
.m3u8),需确认服务商是否开启 TLS 1.2+ 支持——部分老旧 CDN 会握手失败,现象是 loading 状态卡住,statechange只触发1001(初始化)不再往后走。
onStateChange 回调里常见状态码怎么处理
live-player 的状态变更全靠 bindstatechange,但返回的 detail.code 是数字,不是字符串,文档又没列全,容易误判:
2001:已连接服务器(可显示“正在接入…”)2002:已开始拉流(此时可隐藏 loading,显示 play 按钮)2003:视频画面第一帧渲染(适合触发自动播放逻辑)2006:网络断开重连中(别急着 toast “断网”,先等几秒)2007:重连失败(这时才该提示用户“直播已中断”,并考虑跳转回列表页)别在
2003后立刻调context.play()—— 小程序内核可能还没准备好,会报 "play failed: invalid state";稳妥做法是加setTimeout延迟 100ms。错误码
1005(解析失败)、1006(解码失败)往往意味着流格式不兼容(比如 H.265 编码),微信目前只支持 H.264 + AAC,服务端推流必须强制指定。
真机调试时,statechange 日志藏在「微信开发者工具 → 调试器 → Console → 选择「微信小程序」tab」里,不是普通 console.log,这点很多人找不到就以为没触发。










