pages/test/live-pusher.nvue
<template>
<view class="livePusherTest">
<live-pusher
id="testPusher"
ref="testPusher"
class="livePusher"
:url="pushUrl"
mode="SD"
device-position="back"
:autopush="true"
:audio="true"
:auto-focus="true"
:muted="false"
:enable-camera="true"
:enable-mic="true"
@statechange="statechange"
@error="onError"
/>
<view class="controls">
<button class="btn" @tap="startPreview">startPreview</button>
<button class="btn" @tap="start">start</button>
<button class="btn" @tap="stopPreview">stopPreview</button>
</view>
<scroll-view class="logs" scroll-y>
<text class="logLine" v-for="(log, index) in logs" :key="index">{{ log }}</text>
</scroll-view>
</view>
</template>
<script>
export default {
data() {
return {
logs: [],
pusherContext: null
}
},
computed: {
pushUrl() {
return 'rtmp://push.xxx.cn/livestreaming/22?auth_key=xxxx'
}
},
onReady() {
this.pusherContext = uni.createLivePusherContext('testPusher', this)
this.log('onReady: 上下文创建' + (this.pusherContext ? '成功' : '失败'))
},
methods: {
log(msg) {
const line = `${new Date().toLocaleTimeString()} - ${msg}`
console.log(line)
this.logs.push(line)
},
startPreview() {
if (!this.pusherContext) {
this.log('pusherContext 为空')
return
}
this.log('调用 startPreview')
try {
/**
* @see https://uniapp.dcloud.net.cn/component/live-pusher.html
* @see https://uniapp.dcloud.net.cn/api/media/live-player-context.html#createlivepushercontext
*/
this.pusherContext.startPreview({
success: () => this.log('startPreview success'),
fail: (e) => this.log('startPreview fail: ' + JSON.stringify(e))
})
} catch (e) {
this.log('startPreview error: ' + JSON.stringify(e))
}
},
stopPreview() {
if (!this.pusherContext) {
this.log('pusherContext 为空')
return
}
this.log('调用 stop')
this.pusherContext.stop({
success: () => this.log('stop success'),
fail: (e) => this.log('stop fail: ' + JSON.stringify(e))
})
},
start() {
if (!this.pusherContext) {
this.log('pusherContext 为空')
return
}
this.log('调用 start')
try {
/**
* @see https://uniapp.dcloud.net.cn/component/live-pusher.html
* @see https://uniapp.dcloud.net.cn/api/media/live-player-context.html#createlivepushercontext
*/
this.pusherContext.start({
success: () => this.log('start success'),
fail: (e) => this.log('start fail: ' + JSON.stringify(e))
})
} catch (e) {
this.log('start error: ' + JSON.stringify(e))
}
},
statechange(e) {
this.log('statechange: ' + JSON.stringify(e.detail))
},
onError(e) {
this.log('error: ' + JSON.stringify(e.detail))
}
}
}
</script>
<style lang="less">
.livePusherTest {
width: 750rpx;
background: #000;
}
.livePusher {
width: 750rpx;
height: 600rpx;
}
.controls {
display: flex;
flex-direction: row;
justify-content: center;
padding: 20rpx;
}
.btn {
margin: 0 20rpx;
padding: 20rpx 40rpx;
background: #1aad19;
color: #fff;
border-radius: 8rpx;
font-size: 28rpx;
}
.logs {
width: 750rpx;
height: 400rpx;
padding: 20rpx;
background: #111;
color: #0f0;
font-size: 24rpx;
}
.logLine {
line-height: 1.6;
word-break: break-all;
}
</style>
3 个回复
Ask小助手
好的,收到你的 bug 反馈。作为 DCloud 官方人员,我对这个反馈进行如下评审和分析:
1. 反馈质量评审
这个 bug 反馈的整体质量较高,信息比较清晰,但在个别关键信息上存在缺失。
live-pusher组件存在预览失败和推流无声音的兼容性问题。描述清晰,官方人员能够看懂。.nvue页面代码,可以直接运行测试,不需要官方人员调整后才能运行,这点做得很好。评审结论:反馈有效,建议补充真实的 Android 系统版本号,并明确打包方式与基座类型,以便更精准地排查问题。
2. 问题分析与排查
根据反馈内容和知识库,对这两个兼容问题进行如下分析:
关于 vivo 手机推流只有画面没有声音的问题:
live-pusher时,如果设置了mode属性,在安卓上推流可能会出现没有声音的情况。你的代码示例中确实设置了mode="SD",这很可能是导致 vivo 手机推流无声音的直接原因。live-pusher的音频推流确实存在兼容性缺陷。关于荣耀手机无法正常启动摄像头预览的问题:
live-pusher是原生组件,对摄像头和麦克风权限要求极高。虽然代码中使用了onReady生命周期创建上下文,但在部分安卓机型(尤其是 MagicOS 等深度定制系统)上,权限授予的时机与原生组件渲染的时机可能存在冲突。startPreview既不进入成功回调也不进入失败回调,这与你描述的“无法正常调起摄像头进行预览”现象非常相似。此类问题通常与系统底层的摄像头硬件抢占或权限处理逻辑有关。3. 解决方案与建议
针对上述分析,建议尝试以下方案:
移除
mode属性:针对 vivo 手机推流无声音的问题,建议暂时移除
<live-pusher>组件上的mode="SD"属性,测试推流是否恢复正常。由于 nvue 已不再维护,如果必须使用mode,建议评估是否可以接受不设置该属性。检查权限与基座配置:
manifest.json->App 模块权限配置中勾选了LivePusher(直播推流)模块。优化预览启动逻辑:
针对荣耀手机预览失败的问题,建议在调用
startPreview之前,先通过 JS 检查并请求摄像头和麦克风权限,确保权限已完全授予后再调用startPreview。同时,可以尝试在onReady中增加一个短暂的setTimeout延时后再创建LivePusherContext,以避开某些机型的初始化时序问题。考虑替代方案:
如果上述方案均无法解决,且你的项目对直播功能要求较高,建议考虑使用插件市场中的成熟直播插件,例如 腾讯云TRTC实时音视频专业版Android/IOS 或 腾迅直播组件,这些插件基于成熟的第三方 SDK,对各类机型的兼容性通常更好。
如果以上步骤均无法解决,这很可能是一个由特定机型系统底层触发的兼容性 Bug。请将你的项目(可脱敏处理后)通过 issues 系统或私聊提供给官方人员,我们会进行深入排查。
s***@qq.com (作者)
荣耀 HONOR 200 Pro 厂搭载的 MagicOS 是基于 Android 14.
用户主动升级 MagicOS 版本至 10.0后, 搭载的Android 版本就是16
g***@iwangzhe.com
同样的问题,看看怎么解决下。
要回复问题请先登录或注册
公告
更多>相关问题