技术实战 2026年5月15日 · 阅读时长 8 分钟

uniapp直播插件集成教程:20分钟快速接入企业级直播能力

从插件安装、推流配置到拉流播放,全套代码可直接复制使用。H5端、App端、小程序端全覆盖。

在跨端开发的浪潮中,uniapp 已经成为很多企业的首选框架。但在集成直播功能时,很多开发者会遇到同一个问题:直播功能怎么在 uniapp 里实现?插件怎么安装?推流和拉流怎么配置?

这篇文章从零开始,完整演示 uniapp 直播插件的集成全流程。你可以直接复制代码到自己的项目中使用。

一、直播集成方案选择:插件 vs SDK

在 uniapp 中集成直播能力,主要有两种方式:

对比项插件市场方案原生SDK方案
集成难度⭐ 低(开箱即用)⭐⭐⭐⭐ 高(需原生开发经验)
开发周期1-2天5-10天
灵活性中等(受插件API限制)高(可完全自定义)
更新维护插件方负责自研团队维护
推荐场景快速上线、MVP验证深度定制、大型项目

对于大多数团队,插件方式性价比最高。如果后续需要扩展功能,再逐步叠加原生能力即可。

💡 VideoTV 建议:先用插件方案快速上线,同时规划后期的原生SDK升级路径。很多企业犯的错误是上来就搞原生集成,结果开发周期拖了两个月,项目还没启动就夭折了。

二、插件安装与项目配置

2.1 通过HBuilderX安装

打开 HBuilderX → 菜单栏「插件」→ 选择项目中需要使用 uniapp 插件的模块 → 搜索「直播插件」→ 点击「安装到项目」。

2.2 manifest.json配置

安装完成后,在 manifest.json 中配置直播相关权限:

{
  "app-plus": {
    "distribute": {
      "plugins": {
        "live-pusher": {
          "version": "1.0.0"
        },
        "live-player": {
          "version": "1.0.0"
        }
      }
    }
  }
}

2.3 权限声明

pages.json 中添加需要直播的页面:

{
  "pages": [
    {
      "path": "pages/live/push",
      "style": {
        "navigationBarTitleText": "直播推流",
        "app-plus": {
          "titleNView": false,
          "scrollIndicator": "none"
        }
      }
    }
  ]
}

三、App端推流核心代码

推流(推送本地音视频到服务器)是直播最核心的能力。以下是完整的推流代码:

3.1 推流页面模板

<template>
    <view class="live-container">
        <live-pusher
            id="livePusher"
            class="pusher"
            :url="pushUrl"
            mode="RTC"
            :autopush="true"
            :muted="false"
            :enable-camera="true"
            :zoom="false"
            :beauty="beauty"
            @statechange="onStateChange"
            @netstatus="onNetStatus"
            @error="onError"
        />
        <view class="control-bar">
            <button @click="toggleCamera">切换摄像头</button>
            <button @click="toggleMic">{{ micOn ? '静音' : '开麦' }}</button>
            <button @click="stopPush" class="btn-stop">结束直播</button>
        </view>
    </view>
</template>

<script>
export default {
    data() {
        return {
            pushUrl: '',
            pusherContext: null,
            beauty: {
                style: 'smooth',    // 美颜风格
                whiten: 0.3,        // 美白 0-1
                smooth: 0.5,        // 磨皮 0-1
            },
            micOn: true,
            cameraOn: true,
        }
    },
    onReady() {
        // 获取推流组件上下文
        this.pusherContext = uni.createLivePusherContext('livePusher', this);
        // 初始化推流地址
        this.initPushUrl();
    },
    methods: {
        initPushUrl() {
            // 从后端获取推流地址
            // 实际项目中通过接口获取,这里示意
            uni.request({
                url: 'https://api.videotvai.com/api/v1/live/push-url',
                method: 'POST',
                data: {
                    roomId: 'room_123456',
                    userId: 'user_' + Date.now()
                },
                success: (res) => {
                    this.pushUrl = res.data.pushUrl;
                }
            });
        },
        onStateChange(e) {
            console.log('推流状态:', e.detail.code, e.detail.message);
            // code=200 表示推流成功
        },
        onNetStatus(e) {
            // 网络状态监控
            const status = e.detail.info;
            if (status.videoQPS < 500) {
                console.warn('推流质量下降,建议检查网络');
            }
        },
        onError(e) {
            console.error('推流错误:', e.detail.errCode, e.detail.errMsg);
            uni.showToast({ title: '推流异常:' + e.detail.errMsg, icon: 'none' });
        },
        toggleCamera() {
            this.pusherContext.switchCamera();
        },
        toggleMic() {
            this.micOn = !this.micOn;
            this.pusherContext.setMicEnabled({ enable: this.micOn });
        },
        stopPush() {
            this.pusherContext.stop();
            uni.navigateBack();
        }
    }
}
</script>

3.2 推流地址生成(后端接口参考)

推流地址不应由前端直接拼接,必须由后端生成以保障安全:

// Node.js 后端示例
function generatePushUrl(roomId, userId) {
    const domain = 'push.videotvai.com';
    const streamKey = `${roomId}_${userId}_${Date.now()}`;
    // 签名验证
    const sign = crypto
        .createHmac('sha256', SECRET_KEY)
        .update(streamKey)
        .digest('hex')
        .substring(0, 16);

    return `rtmp://${domain}/live/${streamKey}?sign=${sign}`;
}

四、App端拉流播放

拉流(播放端接收直播流)和推流对应。以下是一个完整的播放器页面:

<template>
    <view class="player-container">
        <live-player
            id="livePlayer"
            class="player"
            :src="playUrl"
            mode="RTC"
            :autoplay="true"
            :muted="false"
            :enable-camera="false"
            object-fit="fillCrop"
            @statechange="onPlayState"
            @error="onPlayError"
        />
    </view>
</template>

<script>
export default {
    data() {
        return {
            playUrl: '',
            playerContext: null,
        }
    },
    onLoad(options) {
        // 从上一页传入房间ID
        this.playUrl = options.playUrl || '';
    },
    onReady() {
        this.playerContext = uni.createLivePlayerContext('livePlayer', this);
    },
    methods: {
        onPlayState(e) {
            if (e.detail.code === 200) {
                console.log('播放成功');
            }
        },
        onPlayError(e) {
            console.error('播放错误:', e.detail.errMsg);
        }
    }
}
</script>

五、H5端直播集成(WebRTC)

uniapp 的 H5 端通过 WebRTC 实现直播能力。H5端的特点是即时可用、无需安装,但要依赖浏览器的 WebRTC 支持。

5.1 H5推流

// H5端通过 WebRTC 推流
async function startH5Push() {
    try {
        const stream = await navigator.mediaDevices.getUserMedia({
            video: { width: 720, height: 1280 },
            audio: true
        });

        // 获取视频轨道并发送到信令服务器
        const videoTrack = stream.getVideoTracks()[0];
        const audioTrack = stream.getAudioTracks()[0];

        // 通过 WebSocket 连接信令服务器
        const ws = new WebSocket('wss://signal.videotvai.com/ws');

        ws.onopen = () => {
            // 发送 SDP Offer
            const pc = new RTCPeerConnection();
            pc.addTrack(videoTrack);
            pc.addTrack(audioTrack);

            pc.createOffer().then(offer => {
                pc.setLocalDescription(offer);
                ws.send(JSON.stringify({
                    type: 'offer',
                    sdp: offer.sdp,
                    roomId: 'room_123456'
                }));
            });
        };

        ws.onmessage = (event) => {
            const msg = JSON.parse(event.data);
            if (msg.type === 'answer') {
                pc.setRemoteDescription(new RTCSessionDescription({
                    type: 'answer',
                    sdp: msg.sdp
                }));
            }
        };
    } catch (err) {
        console.error('H5推流启动失败:', err);
    }
}

5.2 H5拉流

// H5端播放
async function startH5Play(playUrl) {
    // 使用 flv.js 播放
    const flvjs = require('flv.js');

    if (flvjs.isSupported()) {
        const videoElement = document.getElementById('player');
        const flvPlayer = flvjs.createPlayer({
            type: 'flv',
            url: playUrl,
        });
        flvPlayer.attachMediaElement(videoElement);
        flvPlayer.load();
        flvPlayer.play();
    }
}
⚠️ 注意:H5端的推流和拉流稳定性不如原生App端。WebRTC在有丢包的环境下画质会明显下降,且H5推流需要用户主动触发(不能自动启动摄像头)。对于正式的直播场景,推荐使用App端进行推流,H5端仅用于观看。

六、小程序端直播配置

uniapp 编译到微信小程序时,需要使用小程序的 live-pusherlive-player 组件。

6.1 小程序直播资质

在小程序后台 → 「功能」→ 「直播」→ 申请开通直播能力。需要满足:

6.2 小程序推流代码

<!-- pages/live/push.wxml -->
<live-pusher
    id="pusher"
    url="{{pushUrl}}"
    mode="RTC"
    autopush="{{true}}"
    bindstatechange="onStateChange"
    binderror="onError"
    style="width:100%;height:100vh;"
/>

6.3 uniapp条件编译

如果你的项目同时支持多端,可以使用条件编译区分平台代码:

<template>
    <view>
        <!-- #ifdef APP-PLUS -->
        <live-pusher ... />
        <!-- #endif -->

        <!-- #ifdef MP-WEIXIN -->
        <live-pusher ... />
        <!-- #endif -->

        <!-- #ifdef H5 -->
        <video id="web-player" />
        <!-- #endif -->
    </view>
</template>

七、常见问题与优化

问题1:推流黑屏/无画面

排查步骤:1) 检查摄像头权限是否已开启;2) 确保 live-pusher 组件的 enable-camera 为 true;3) 推流地址是否有效;4) Android端需要申请 CAMERA 和 RECORD_AUDIO 权限。

问题2:推流延迟过高(>3秒)

原因和解决方案:1) 网络上行带宽不足 → 降低推流分辨率到 540P;2) 使用了标准直播模式 → 切换为 RTC 模式(低延迟);3) CDN节点距离远 → 配置就近接入节点;4) 播放端使用了 HLS 协议 → 改用 FLV 或 WebRTC 拉流。

问题3:uniapp编译到iOS崩溃

iOS端使用直播功能需要在 Info.plist 中添加 NSCameraUsageDescriptionNSMicrophoneUsageDescription 权限说明。HBuilderX 打包时需要在「iOS 隐私信息访问许可描述」中填写。

问题4:推流成功后播放端看不到画面

检查:1) 推流端的推流地址和播放端的播放地址对应的流ID是否一致;2) 推流端的音频/视频是否成功发送到服务器;3) 检查推流日志是否有 error 事件;4) 可以通过推流工具的预览功能验证。

🔧 VideoTV 技术团队提示:uniapp直播集成最常见的问题是权限配置不全导致的推流失败。在打包前,务必确认 Android 的 AndroidManifest.xml 和 iOS 的 Info.plist 中所有必要的权限都已声明。VideoTV 提供集成前的免费代码审核服务,帮助团队提前发现配置问题。

VideoTV · uniapp直播集成服务

提供从方案选型、插件集成到上线运维的全流程技术支持。App端、H5端、小程序端全平台覆盖,支持远程实施。

获取集成方案 →

相关阅读

需要企业级直播解决方案?

直达播团队专注医疗直播领域,已服务50+医疗机构与药企。
搜一下 直达播,官网有详细方案案例。

获取方案 →
← 上一篇:企业级直播SDK集成完全指南 下一篇:私域电商直播完整解决方案 →