下面我将为你提供一个从入门到精通的完整指南,涵盖准备工作、核心功能、开发步骤、注意事项以及高级玩法。


直播前准备:申请与配置

在开始写任何代码之前,你必须完成微信官方的申请和配置工作,这是所有开发的基础。

开通直播权限

小程序本身没有直播权限,需要关联公众号视频号

  • 关联视频号(推荐)

    • 步骤:登录微信公众平台 -> 小程序管理 -> 设置 -> 关联服务 -> 关联视频号。
    • 要求:小程序主体和视频号主体必须一致。
    • 优势:这是目前最主流、功能最完善的方式,直播能力由视频号提供,小程序作为承载和互动的容器。
  • 关联公众号

    • 步骤:登录微信公众平台 -> 小程序管理 -> 设置 -> 关联服务 -> 关联公众号。
    • 要求:主体一致或部分类型(如政府、媒体)可以不一致。
    • 注意:公众号关联的直播能力(公众号直播)已逐渐被视频号直播取代,新项目不推荐。

申请直播权限

完成关联后,你需要为你的小程序申请直播权限。

  • 路径:登录微信公众平台 -> 视频号直播 -> 直播权限管理 -> 申请权限。
  • 权限类型
    • 普通直播:满足基础直播需求,审核较快。
    • 电商直播:用于商品带货,需要额外申请,并关联微信小店。
  • 审核:提交申请后,微信团队会进行审核,通常需要1-3个工作日。

获取关键信息

审核通过后,你需要在视频号直播管理后台获取以下关键信息,这些是小程序与直播服务交互的凭证:

  • AppID:你的小程序ID。
  • room_id:直播间ID。
  • stream_key:推流地址和推流密钥,这是用于使用OBS等专业直播软件进行推流的关键。

小程序直播核心功能组件

微信官方提供了一系列现成的组件,让你可以快速在页面上集成直播功能,无需关心复杂的音视频处理逻辑。

<live-player> 直播播放器组件

这是用于观看直播的核心组件,它非常强大,支持全屏、弹幕、礼物等多种功能。

基本用法示例:

<!-- WXML -->
<view class="container">
  <live-player 
    id="myLivePlayer"
    src="rtmp://your-stream-url" <!-- 直播流地址,由视频号后台提供 -->
    mode="live" <!-- 直播模式 -->
    autoplay <!-- 自动播放,但需要用户交互后才能生效 -->
    bindstatechange="statechange" <!-- 监听播放器状态变化 -->
    binderror="error" <!-- 监听播放器错误 -->
    object-fit="cover" <!-- 视频填充方式 -->
  >
    <!-- 自定义弹幕层 -->
    <view class="danmu-layer">
      <block wx:for="{{danmuList}}" wx:key="id">
        <text class="danmu-item" style="top: {{item.top}}%; left: {{item.left}}%;">{{item.text}}</text>
      </block>
    </view>
  </live-player>
</view>

JS 文件中的逻辑:

// JS
Page({
  data: {
    danmuList: [] // 弹幕列表
  },
  // 播放器状态变化
  statechange(e) {
    console.log('播放器状态变化:', e.detail.code);
    // 1001 已经连接,可以在这里开始发送弹幕
  },
  // 播放器错误
  error(e) {
    console.error('播放器错误:', e.detail.errMsg);
  },
  // 发送弹幕的方法
  sendDanmu(text) {
    const newDanmu = {
      id: Date.now(),
      text: text,
      top: Math.random() * 100,
      left: '100%'
    };
    this.setData({
      danmuList: [...this.data.danmuList, newDanmu]
    });
  }
});

<live-pusher> 直播推流组件

这是用于主播端进行推流的组件,它允许在小程序内直接使用摄像头进行直播,无需依赖OBS等外部软件。

基本用法示例:

<!-- WXML -->
<view class="container">
  <live-pusher 
    id="myLivePusher"
    url="rtmp://your-stream-url" <!-- 推流地址 -->
    mode="HD" <!-- 推流画质 -->
    autopush <!-- 自动开始推流 -->
    bindstatechange="statechange"
    binderror="error"
  ></live-pusher>
  <button bindtap="startPush">开始推流</button>
  <button bindtap="stopPush">停止推流</button>
</view>

JS 文件中的逻辑:

// JS
Page({
  // 开始推流
  startPush() {
    const pusherCtx = wx.createLivePusherContext();
    pusherCtx.start();
  },
  // 停止推流
  stopPush() {
    const pusherCtx = wx.createLivePusherContext();
    pusherCtx.stop();
  },
  statechange(e) {
    console.log('推流器状态变化:', e.detail.code);
  },
  error(e) {
    console.error('推流器错误:', e.detail.errMsg);
  }
});

开发步骤详解

假设我们要开发一个“观看直播”的小程序页面。

步骤1:获取直播间信息

直播间信息(如 room_id)会从你的服务器获取,服务器通过调用微信的开放接口来获取最新的直播间列表。

  • 关键接口https://api.weixin.qq.com/wxa/business/getliveinfo(需调用方有权限)
  • 流程:小程序请求你的服务器 -> 服务器调用微信接口获取直播间信息 -> 服务器将 room_id 等信息返回给小程序。

步骤2:创建直播页面

在你的小程序项目中创建一个新的页面,pages/live/live

步骤3:编写 WXML 布局

live.wxml 中,使用 <live-player> 组件,并将 src 设置为动态获取的直播流地址。

<!-- pages/live/live.wxml -->
<view class="live-container">
  <!-- 顶部返回和标题栏 -->
  <view class="live-header">
    <icon type="arrowleft" size="20" bindtap="onBack" />
    <text>{{liveInfo.anchorName}}的直播间</text>
  </view>
  <!-- 直播播放器 -->
  <live-player 
    id="livePlayer"
    src="{{liveInfo.playUrl}}"
    mode="live"
    autoplay
    object-fit="cover"
    bindstatechange="onPlayerStateChange"
  ></live-player>
  <!-- 右侧互动按钮(点赞、分享、关注等) -->
  <view class="live-tools">
    <button class="tool-btn" bindtap="onLike">
      <icon type="success" size="20" />
      <text>{{likeCount}}</text>
    </button>
    <button class="tool-btn" open-type="share">
      <icon type="share" size="20" />
    </button>
    <button class="tool-btn" bindtap="onFollow">
      <icon type="add" size="20" />
      <text>关注</text>
    </button>
  </view>
  <!-- 底部聊天/弹幕区 -->
  <view class="live-chat">
    <block wx:for="{{chatMessages}}" wx:key="id">
      <text>{{item.user}}: {{item.content}}</text>
    </block>
  </view>
</view>

步骤4:编写 JS 逻辑

live.js 中,处理页面加载、数据获取、用户交互等逻辑。

// pages/live/live.js
Page({
  data: {
    liveInfo: {}, // 直播间信息
    likeCount: 0,
    chatMessages: []
  },
  onLoad: function (options) {
    // options 中可能包含 room_id 等参数
    const roomId = options.room_id;
    this.fetchLiveInfo(roomId);
  },
  // 从服务器获取直播间信息
  fetchLiveInfo(roomId) {
    wx.request({
      url: 'https://your-api-domain.com/api/live/get-info',
      data: { room_id: roomId },
      success: (res) => {
        if (res.data.code === 0) {
          this.setData({
            liveInfo: res.data.data
          });
        }
      }
    });
  },
  // 播放器状态变化
  onPlayerStateChange(e) {
    if (e.detail.code === 1001) {
      // 连接成功,可以开始轮询获取聊天消息
      this.startPollingChat();
    }
  },
  // 点赞
  onLike() {
    this.setData({
      likeCount: this.data.likeCount + 1
    });
    // 这里可以调用接口,将点赞数同步到服务器
  },
  // 分享
  onShareAppMessage: function () {
    return {
      title: this.data.liveInfo.anchorName + '正在直播,快来看!',
      path: '/pages/live/live?room_id=' + this.data.liveInfo.room_id
    };
  },
  // 模拟轮询获取聊天消息
  startPollingChat() {
    // 实际项目中,应该使用 WebSocket 或长连接,而不是轮询
    setInterval(() => {
      // 模拟新消息
      const newMessage = {
        id: Date.now(),
        user: '用户' + Math.floor(Math.random() * 1000),
        content: '主播好棒!'
      };
      this.setData({
        chatMessages: [...this.data.chatMessages, newMessage]
      });
    }, 3000);
  }
});

步骤5:编写 WXSS 样式

live.wxss 中美化你的页面布局。

/* pages/live/live.wxss */
.live-container {
  position: relative;
  width: 100%;
  height: 100vh;
  background-color: #000;
}
.live-header {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 80rpx;
  display: flex;
  align-items: center;
  padding: 0 20rpx;
  color: #fff;
  z-index: 100;
}
.live-tools {
  position: absolute;
  right: 20rpx;
  top: 50%;
  transform: translateY(-50%);
  display: flex;
  flex-direction: column;
  z-index: 100;
}
.tool-btn {
  background-color: rgba(0, 0, 0, 0.5);
  color: #fff;
  border: none;
  margin-bottom: 20rpx;
  display: flex;
  flex-direction: column;
  align-items: center;
}
.live-chat {
  position: absolute;
  bottom: 0;
  left: 0;
  right: 0;
  height: 200rpx;
  padding: 20rpx;
  overflow-y: auto;
  color: #fff;
  font-size: 24rpx;
  background: linear-gradient(to top, rgba(0,0,0,0.7), transparent);
}

注意事项与最佳实践

  1. 用户授权:使用 <live-pusher> 进行推流,首次进入页面时,必须先调用 wx.getSettingwx.authorize 来获取 camera(摄像头)和 record(录音)权限,否则推流会失败。

    wx.authorize({
      scope: 'record'
    }).then(() => {
      // 录音授权成功
    }).catch(err => {
      console.error('录音授权失败', err);
    });
  2. 网络环境:直播对网络要求较高,在网络不佳的情况下,播放器会卡顿或推流会中断,你需要在界面上给用户良好的网络提示。

  3. 性能优化

    • 弹幕渲染:当弹幕数量非常多时,频繁地 setData 会导致页面卡顿,可以考虑使用 canvas 来绘制弹幕,性能会好很多。
    • 消息拉取:聊天消息不应使用轮询,应使用 WebSocket 或微信的云开发实时数据库来实现实时推送。
  4. 合规性

    • 内容审核:必须建立内容审核机制,对直播标题、简介、弹幕、评论等内容进行审核,防止违法违规信息出现。
    • 未成年人保护:如果涉及未成年人,需要遵守相关法律法规,例如设置青少年模式。

高级玩法与商业化

  1. 直播带货(小程序电商)

    • 流程:在直播页面下方或侧边栏,展示商品列表,点击商品可以跳转到商品详情页(小程序商品页面)。
    • 技术实现:商品数据同样从你的服务器获取,用户点击“立即购买”,可以跳转到微信小程序的“微信支付”完成下单。
    • 入口:在视频号直播间下方,可以添加“商品橱窗”,直接挂载小程序的商品。
  2. 直播互动

    • 红包:在直播中发放红包,增加用户停留时长和互动率。
    • 抽奖:设置定时抽奖,用户需要观看直播或进行特定操作(如分享)才能参与。
    • 连麦PK:主播之间可以连麦进行互动,增加直播的趣味性,这需要更复杂的音视频处理,通常需要集成第三方SDK。
  3. 数据分析

    利用微信提供的直播数据分析后台,监控直播的观看人数、峰值、用户画像、互动数据等,为后续直播优化提供依据。

开发微信小程序直播,核心在于利用官方组件快速搭建前端界面,并通过后端服务与微信的直播能力进行数据交互。

开发流程回顾

  1. 准备阶段:关联视频号,申请直播权限,获取推流信息。
  2. 前端开发:使用 <live-player><live-pusher> 组件构建直播页面。
  3. 后端对接:开发API,用于获取直播间信息、商品信息、处理用户互动等。
  4. 功能完善:实现弹幕、点赞、分享、商品展示等互动功能。
  5. 上线与运营:关注合规性,进行数据分析,优化直播体验。

希望这份详细的指南能帮助你顺利开启微信小程序直播的开发之旅!