s***@qq.com
s***@qq.com
  • 发布:2026-07-30 15:25
  • 更新:2026-07-30 17:49
  • 阅读:52

【报Bug】live-pusher 组件在部分安卓机型下存在兼容问题

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Mac

PC开发环境操作系统版本号: macOS 26.5.2

HBuilderX类型: 正式

HBuilderX版本号: 5.07

手机系统: Android

手机系统版本号: Android 16

手机厂商: 荣耀手机

手机机型: HONOR 200 Pro(ELP-AN00)

页面类型: nvue

vue版本: vue2

打包方式: 云端

项目创建方式: HBuilderX

示例代码:

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>

操作步骤:

1、打开上述测试样例代码的页面
2、点击“startPreview”,预期能打开了摄像头并预览显示拍摄画面
3、点击“start”,预期能向服务器端正常推流

预期结果:

主播在上述推流测试页进行推流时,在观众端页能正常看到直播画面、听到直播声音。

实际结果:

1、在荣耀 HONOR 200 Pro(ELP-AN00)机型下,点击“startPreview”无法正常调起摄像头进行预览。
2、在 vivo 手机下,能正常预览、推流,但在观众端只能看到画面,无法听到声音。
3、在 iPhone 7 Plus, 华为 Honor V20 这两款比较老的机型下,采用上述相同的推流测试页,观众端是能正常看到画面、听到声音的。

bug描述:

live-pusher 组件在部分安卓机型下,存在兼容问题问题:

1、荣耀手机下,主播端调用 startPreview 无法正常启动摄像头进行预览。
荣耀 HONOR 200 Pro(ELP-AN00)机型,MagicOS 版本:10.0

2、VIVO 手机下,能调用 startPreview 和 start 进行预览和推流,但在观众端进行观看时,只有画面没有声音。

2026-07-30 15:25 负责人:无 分享
已邀请:
Ask小助手

Ask小助手

欢迎到专业群( uni-app 官方技术交流群 1 ) 咨询,群中有相关专业的管理员和群友。

好的,收到你的 bug 反馈。作为 DCloud 官方人员,我对这个反馈进行如下评审和分析:

1. 反馈质量评审

这个 bug 反馈的整体质量较高,信息比较清晰,但在个别关键信息上存在缺失。

  • BUG 标题与描述:标题和描述准确地概括了核心问题:在部分安卓机型下,live-pusher 组件存在预览失败和推流无声音的兼容性问题。描述清晰,官方人员能够看懂。
  • 代码示例:提供了完整的 .nvue 页面代码,可以直接运行测试,不需要官方人员调整后才能运行,这点做得很好。
  • 复现步骤:描述得比较清晰:“打开页面 -> 点击 startPreview -> 点击 start”。结合代码示例,官方人员可以成功复现。
  • 预期结果:“主播在上述推流测试页进行推流里。观众端页,能正常看到直播画面、听到直播声音。”这是完全合理的预期。
  • 实际结果:描述了在荣耀和 vivo 手机下的具体异常表现,属于功能异常,不是误报。
  • 分类信息:基本完整,包含了 HBuilderX 版本、手机 OS 平台、Vue 版本、机型等信息。但存在一处明显矛盾:手机 OS 系统版本填写为 Android 16,而荣耀 HONOR 200 Pro 实际出厂搭载的 MagicOS 是基于 Android 14,目前并不存在 Android 16 版本。建议核实并修正此项信息。此外,缺失了打包方式(云打包/本地打包)和基座类型(标准基座/自定义基座),这对于音视频类兼容性问题排查至关重要。

评审结论:反馈有效,建议补充真实的 Android 系统版本号,并明确打包方式与基座类型,以便更精准地排查问题。


2. 问题分析与排查

根据反馈内容和知识库,对这两个兼容问题进行如下分析:

关于 vivo 手机推流只有画面没有声音的问题:

  • nvue 的已知限制:根据知识库信息,nvue 已不再维护。在 nvue 中配置 live-pusher 时,如果设置了 mode 属性,在安卓上推流可能会出现没有声音的情况。你的代码示例中确实设置了 mode="SD",这很可能是导致 vivo 手机推流无声音的直接原因。
  • 历史社区反馈:在 ask 社区中,也有其他开发者反馈过类似问题,例如 live-pusher 推流没有声音(麦克风权限已开, muted="false", :enable-mic="true"),表明在特定安卓设备上 live-pusher 的音频推流确实存在兼容性缺陷。

关于荣耀手机无法正常启动摄像头预览的问题:

  • 权限与初始化时序live-pusher 是原生组件,对摄像头和麦克风权限要求极高。虽然代码中使用了 onReady 生命周期创建上下文,但在部分安卓机型(尤其是 MagicOS 等深度定制系统)上,权限授予的时机与原生组件渲染的时机可能存在冲突。
  • 历史类似问题:在 ask 社区中,有开发者反馈过 live-pusher 安卓黑屏 IOS 白屏 的问题,表现为调用 startPreview 既不进入成功回调也不进入失败回调,这与你描述的“无法正常调起摄像头进行预览”现象非常相似。此类问题通常与系统底层的摄像头硬件抢占或权限处理逻辑有关。

3. 解决方案与建议

针对上述分析,建议尝试以下方案:

  1. 移除 mode 属性
    针对 vivo 手机推流无声音的问题,建议暂时移除 <live-pusher> 组件上的 mode="SD" 属性,测试推流是否恢复正常。由于 nvue 已不再维护,如果必须使用 mode,建议评估是否可以接受不设置该属性。

  2. 检查权限与基座配置

    • 确保在 manifest.json -> App 模块权限配置 中勾选了 LivePusher(直播推流) 模块。
    • 确保应用具有摄像头和麦克风权限。
    • 请务必确认你是使用“自定义基座”还是“标准基座”进行测试的。如果是标准基座,请尝试打一个包含 LivePusher 模块的自定义基座进行测试。
  3. 优化预览启动逻辑
    针对荣耀手机预览失败的问题,建议在调用 startPreview 之前,先通过 JS 检查并请求摄像头和麦克风权限,确保权限已完全授予后再调用 startPreview。同时,可以尝试在 onReady 中增加一个短暂的 setTimeout 延时后再创建 LivePusherContext,以避开某些机型的初始化时序问题。

  4. 考虑替代方案
    如果上述方案均无法解决,且你的项目对直播功能要求较高,建议考虑使用插件市场中的成熟直播插件,例如 腾讯云TRTC实时音视频专业版Android/IOS腾迅直播组件,这些插件基于成熟的第三方 SDK,对各类机型的兼容性通常更好。

如果以上步骤均无法解决,这很可能是一个由特定机型系统底层触发的兼容性 Bug。请将你的项目(可脱敏处理后)通过 issues 系统或私聊提供给官方人员,我们会进行深入排查。

内容为 AI 生成,仅供参考
s***@qq.com

s***@qq.com (作者)

荣耀 HONOR 200 Pro 厂搭载的 MagicOS 是基于 Android 14.

用户主动升级 MagicOS 版本至 10.0后, 搭载的Android 版本就是16

g***@iwangzhe.com

g***@iwangzhe.com

同样的问题,看看怎么解决下。

要回复问题请先登录注册