本文介绍移动端 H5 页面观众连麦的实现方案,从而提高观众的直播观看体验。
注意
如需通过微信小程序观播 SDK 实现观众连麦,请先联系技术支持评估接入。
企业直播支持通过以下方式实现移动端观众连麦:
说明
默认仅在观众的操作系统和浏览器符合以下要求时,可在移动端观看页展示连麦入口。如果您需强制在不符合要求观众的移动端观看页展示连麦入口,可以在移动端观看页地址中添加 useUserConnect 参数并将取值设置为 true。例如观看页地址为 https://live.byteoc.com/5628/267****,则添加该参数后的地址为 https://live.byteoc.com/5628/267****?useUserConnect=true。
web-view 组件内嵌 H5 观看页的 Android/iOS App,可参考uni-app App 内嵌 H5 页面观众连麦实现连麦。您已开通专业版、旗舰版或尊享版套餐。详见计费说明。
有关主持人的操作,详见观众连麦。



在微信小程序中,可以使用 web-view 组件将 H5 页面内嵌在微信小程序中,从而在小程序中展示外部网页的内容。接入前,请确认您已开通微信直播组件 live-player 的权限,且已集成微信小程序 SDK(使用 live-player 组件观播的方式),且已在项目的 app.json 文件中引入 WeUI 组件库。详见集成方法。
app.json 文件中引入竖屏直播间整体组件或连麦组件,示例代码如下:"usingComponents": { "volc-live-portrait": "./volc-mini-sdk/components/volc-live-portrait/volc-live-portrait", // 引入竖屏直播间整体组件 "connect": "./volc-mini-sdk/components/connect/connect" // 引入连麦组件 }
page 作为观看页,并在 .wxml 和 .js 文件中完成以下操作:
.wxml 文件中,创建 web-view 组件。示例代码如下:<web-view src="{{finalUrl}}"></web-view>
.js 文件中,指定直播间的 H5 页面。示例代码如下:Page({ /** * 页面的初始数据 */ data: { finalUrl: '', }, onLoad(e) { const liveUrl = 'https://DomainName/xxx/xxx'; // 直播间的观看页地址 const connectPageUrl = '/pages/connect/connect'; // 小程序连麦页的地址 const finalUrl = `${liveUrl}?voiceChatRedirect=${connectPageUrl}`; // 直播间的 H5 页面地址 this.setData({ finalUrl, }) }, //... })
page 作为连麦页,并在 .wxml 和 .js 文件中完成以下操作:
.wxml 文件中,定义该页面包含的组件,即竖屏直播间整体组件或连麦组件。示例代码如下:<view> <!-- 竖屏直播间整体组件 --> <volc-live-portrait /> <!-- 连麦组件 --> <connect /> </view>
.js 文件的 onLoad 方法中,初始化微信小程序 SDK。示例代码如下:在主持人开始观众连麦后,直播间出现连麦按钮,如下图所示。观众点击连麦按钮后,即可从 H5 页面跳转至连麦页。import volc from './volc-mini-sdk/index'; Page({ data: {}, async onLoad(e) { // 获取跳转至连麦页时携带的参数,即直播间的活动 ID、用户 ID、用户昵称 // 如果观众未在直播间的 H5 页面登录,则在跳转至连麦页时不会携带 userId 和 userName 参数,因此无法获取 userId 和 userName let {activityId ,userId, userName } = e; if(!userId || !userName){ // 如果无法通过跳转至连麦页时携带的参数获取 userId 和 userName,你需要自行定义用户信息并将用户信息传入 getMode2token 方法 ({ userId ,userName} = this.getCustomUser()); // 您需要自行实现该方法 } // 获取自定义模式(mode=2)时的授权 Token const token = await this.getMode2token(activityId ,userId, userName); // 初始化 SDK await initSDK(activityId,token); }, async getMode2token(activityId ,userId, userName){ // 调用 GetSDKTokenAPI 接口获取授权 Token const token = await GetSDKTokenAPI(activityId ,userId, userName); return token; }, async initSDK(){ // 页面加载时,调用 init 方法初始化直播间 const res = await volc.init({ activityId: activityId, token: token, mode: 2, autoConnect: true, // 初始化完成后,自动弹出语音连麦或视频连麦选项弹窗 }); if (!res) { wx.showToast({ title: '直播间信息错误', icon: 'error' }); } }, onUnload() { // 页面卸载时,调用 destroy 方法销毁直播间 volc.destroy(); } })

如果您使用 uni-app 开发移动端 App,并通过原生 web-view 组件内嵌企业直播 H5 观看页,您可通过以下两种方案实现连麦。
| 方案 | 适用场景 | 接入方式 |
|---|---|---|
| 方案一:专属 SDK 接入(推荐) | 希望由 SDK 内置完成通信与权限申请,减少宿主适配成本。 | 使用企业直播提供的 uni web-view 专属 SDK 组件替换原生 web-view。详见集成 WebView SDK — uni web-view SDK。 |
| 方案二:通用接入 | 已使用 uni-app 原生 web-view 内嵌观看页。 | 保留原生 web-view,宿主监听 Web 观播 SDK 抛出的权限申请事件并调用系统权限接口授权。 |
使用企业直播提供的 uni web-view 专属 SDK 组件替换原生 web-view。详见集成 WebView SDK — uni web-view SDK。
方案二保留 uni-app 原生 web-view 组件,通过宿主 App 监听 H5 观看页抛出的权限申请事件、调用系统运行时权限接口,再将授权结果回传观看页,从而在不改动 Web 观播 SDK 调用方式的前提下完成连麦权限适配。
manifest.json 中声明连麦所需的 Android 权限。运行时申请不能代替 manifest.json 声明,两者必须同时配置。上述权限说明如下所示:{ "app-plus": { "distribute": { "android": { "permissions": [ "<uses-permission android:name=\"android.permission.CAMERA\"/>", "<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>", "<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>" ] } } } }
CAMERA:视频连麦所需的摄像头权限。RECORD_AUDIO:音频、视频连麦所需的麦克风权限。MODIFY_AUDIO_SETTINGS:连麦音频链路所需的音频设置权限。uni.postMessage 向宿主 App 抛出 action: 'requestPermissions' 事件。宿主 uni-app 页面在 <web-view @message> 回调中识别该事件,调用 plus.android.requestPermissions 申请系统权限,再通过 evalJS 向观看页派发 byte-live-webview-response 自定义事件将授权结果回传。说明
event.detail.data 是 uni-app 批量缓冲的消息数组,用 .at(-1) 取最新一条。只有 action === 'requestPermissions' 的消息才需要处理,其余消息忽略即可。
<template> <web-view :src="url" @message="onMessage" /> </template> <script> export default { data() { return { url: 'https://your-page.example.com', }; }, methods: { onMessage(event) { const request = event.detail.data.at(-1); if (request.action !== 'requestPermissions') return; const permissions = request.payload.permissions; plus.android.requestPermissions(permissions, result => { this.replyToPage({ namespace: 'byte-live', version: 1, type: 'response', id: request.id, action: request.action, ok: true, result: { permissions, granted: result.granted, deniedPresent: result.deniedPresent, deniedAlways: result.deniedAlways, ignored: false, platform: 'android', }, }); }); }, replyToPage(response) { const webView = this.$scope.$getAppWebview().children()[0]; webView.evalJS(` window.dispatchEvent( new CustomEvent('byte-live-webview-response', { detail: ${JSON.stringify(response)} }) ); `); }, }, }; </script>
可以。您可以通过以下方式实现该目的:
getMode2token 方法。详见本文初始化微信小程序 SDK 的示例代码。