更新记录

1.0.1(2025-05-09)

  1. 优化

1.0.0(2025-05-08)

  1. 音视频通话
  2. 共享手机屏幕
  3. 推流、拉流

平台兼容性

Vue2 Vue3
App 快应用 微信小程序 支付宝小程序 百度小程序 字节小程序 QQ小程序
HBuilderX 3.7.0,Android:4.4,iOS:12,HarmonyNext:不支持 × × × × × ×
钉钉小程序 快手小程序 飞书小程序 京东小程序 鸿蒙元服务
× × × × ×
H5-Safari Android Browser 微信浏览器(Android) QQ浏览器(Android) Chrome IE Edge Firefox PC-Safari
× × × × × × × × ×

zego即构音视频通话,共享手机屏幕

开发文档

集成插件步骤请参考 https://www.cnblogs.com/wenrisheng/p/18323027

跑通demo

demo用的是vue3,HBuilderX导入的时候要选择vue3

  1. zego即构官网创建应用https://www.zego.im/
  2. 修改demo里common/key_center.js的appID和appSign
  3. 修改nativeplugins/wrs-zego的文件(ios屏幕共享功能),集成到项目时wrs-zego拷贝到项目对应文件夹:

ios的屏幕共享以ios extension方式集成,可参考uniapp官方集成文档https://nativesupport.dcloud.net.cn/NativePlugin/course/package.html#ios-extension

  • manifest.json app原生插件配置勾选WRSShengwang插件
  • 修改nativeplugins/wrs-zego/ios-extension.json文件:
identifier:extension的包名,一般是app包名+自定义后缀(${包名}.${自定义后缀}),如:

app包名为com.wrs.shengwang,则
identifier为com.wrs.shengwang.screenshare
UTSKeyboardGroup:iOS extension的group名,申请extension证书签名时需要增加group能力,并添加一个group名(同时app也同样需要增加同样group名的签名文件)
CFBundleDisplayName:共享屏幕的名称
com.apple.security.application-groups:数组里面添加上面申请的group名
  • 集成项目时,拷贝AndroidManifest.xml、info.plist到项目根目录
    1. 把nativeResources/ios/UniApp.entitlements的array数组里改为上面的group名,集成到项目时这个文件需要拷贝到项目对应位置

视频画面组件,使用该组件的页面要用nvue


<wrs-uts-zego :viewMode="viewMode" :style="'width:'+width+'px;height:'+height+'px;'" @onLoadView="onLoadView" ref='localPreviewView'>

</wrs-uts-zego>

组件属性

  • viewMode: 视图模式 预览本地视频,字符串,"0": AspectFit "1": AspectFill "3": ScaleToFill
  • streamId: 流ID,用来渲染远程视频流

组件事件

  • onLoadView:组件加载完成,加载完成后可以调用组件的接口

组件接口

  • 开始预览本地视频

// 开始预览本地视频
this.$refs.localPreviewView.startPreview()

接口


import {
    UTSZego
} from "@/uni_modules/wrs-uts-zego"
  1. 设置回调

// 可以调用一次或多次
UTSZego.onCallback((resp) => {
    console.log(JSON.stringify(resp))
    let opt = resp.opt
    switch (opt) {
        // 开发调试错误
        case "onDebugError":
            break;
            // 房间状态更新
        case "onRoomStateUpdate": {
            let state = resp.state
            switch (state) {
                case 0: {
                    // Disconnected
                    this.showMsg("房间断开连接")
                }
                break;
                case 1: {
                    // Connecting
                    this.showMsg("房间连接中。。。")
                }
                break;
                case 2: {
                    // Connected
                    this.showMsg("房间已经连接")
                }
                break;
                default:
                    break;
            }
        }
        break;
        // 推流状态更新
        case "onPublisherStateUpdate": {
            let state = resp.state
            switch (state) {
                case 0: {
                    this.showMsg("没有推流")
                }
                break;
                case 1: {
                    this.showMsg("推流请求中。。。")
                }
                break;
                case 2: {
                    this.showMsg("正在推流中。。。")
                }
                break;
                default:
                    break;
            }
        }
        break;
        // 相同房间内其他用户推的流增加或减少的通知。
        case "onRoomStreamUpdate": {
            let updateType = resp.updateType
            switch (updateType) {
                case 0: {
                    // 添加
                    let streamList = resp.streamList
                    for (let i = 0; i < streamList.length; i++) {
                        let streamId = streamList[i].streamId

                        this.remoteArray.push(streamId)
                    }
                    this.showMsg("有新用户视频流进来")
                }
                break;
                case 1: {
                    // 删除
                    this.showMsg("有新用户关闭了视频流")
                }
                break;
                default:
                    break;
            }
        }
        break;
        // 接收实验性 API 回调,请在 ZEGO 技术支持的帮助下使用此功能。
        case "onRecvExperimentalAPI": {

        }
        break;
        // 房间内其他用户增加或减少的回调通知。
        case "onRoomUserUpdate": {
            // 用户首次登录房间时,如果房间内有其他用户,SDK 会触发 "updateType" 为 [ZegoUpdateTypeAdd] 的回调通知,此时 "userList" 为房间内的其他用户。
            // 用户已在房间内,如果有其他用户通过 [loginRoom]、[switchRoom] 函数登录到本房间,SDK 会触发 "updateType" 为 [ZegoUpdateTypeAdd] 的回调通知。
            // 用户已在房间内,有其他用户通过 [logoutRoom]、[switchRoom] 函数登出本房间,SDK 会触发 "updateType" 为 [ZegoUpdateTypeDelete] 的回调通知。
            // 用户已在房间内,如果有其他用户从服务端被踢出本房间,SDK 会触发 "updateType" 为 [ZegoUpdateTypeDelete] 的回调通知。
            let updateType = resp.updateType
            let userList = resp.userList
            switch (updateType) {
                case 0: {
                    // 添加
                    this.showMsg("有新用户进来")
                }
                break;
                case 1: {
                    // 删除
                    this.showMsg("有新用户退出房间")
                }
                break;
                default:
                    break;
            }
        }
        break;
        default:
            break;
    }
})
  1. 创建引擎

UTSZego.createEngine({
    appID: KeyCenter.appID,
    appSign: KeyCenter.appSign,
    scenario: 8 // ZegoScenarioBroadcast 
})
  • scenario 3: default 4: StandardVideoCall 5: HighQualityVideoCall 6: StandardChatroom 7: HighQualityChatroom 8: Broadcast 9: Karaoke 10: StandardVoiceCall
  1. 登陆房间

let params = {}
params.roomId = this.roomId
params.userId = this.userId
params.isUserStatusNotify = true
// params.token = "xx"
UTSZego.loginRoom(params, (resp) => {
    let flag = resp.flag
    if (flag) {
        this.showMsg("登陆房间成功:" + JSON.stringify(resp))
    } else {
        this.showMsg("登陆房间失败:" + JSON.stringify(resp))
    }
})
  1. 退出房间

let params = {}
// params.roomId = this.roomId // roomId可选参数
UTSZego.logoutRoom(params)
  1. 设置视频配置

// 设置视频配置
let videoConfig = {}
videoConfig.encodeWidth = 720
videoConfig.encodeHeight = 1280
videoConfig.fps = 25
videoConfig.bitrate = 600
UTSZego.setVideoConfig(videoConfig)
  1. 开始推流

let params = {}
params.streamId = this.streamId // 流ID,不同用户
// params.channel = 1 // AUX
UTSZego.startPublishingStream(params)
  • streamId: 流 ID,长度不超过 256 的字符串。需要在整个 AppID 内全局唯一,若出现在同一个 AppID 内,不同的用户各推了一条流且流名相同,将会导致后推流的用户推流失败
  • channel:推流通道,可选参数,0: ZegoPublishChannelMain 1: ZegoPublishChannelAux 2: ZegoPublishChannelThird 3: ZegoPublishChannelFourth
  1. 停止推流

let params = {}
// params.channel = 1 // 可选参数
UTSZego.stopPublishingStream(params)
  1. 停止预览

let params = {}
// params.channel = 1 // 可选参数
UTSZego.stopPreview(params)
  1. 销毁引擎

UTSZego.destroyEngine(() => {})
  1. 切换前后摄像头

UTSZego.useFrontCamera(true)
  1. 开/关摄像头

UTSZego.enableCamera(true)
  1. 设置是否静音(关闭麦克风)

UTSZego.muteMicrophone(true)
  1. 设置是否静音(关闭音频输出)

UTSZego.muteSpeaker(true)
  1. 设置视频采集源
UTSZego.setVideoSource({
    videoSource: 6, // ZegoVideoSourceTypeScreenCapture
    channel: 1 // 可选参数,ZegoPublishChannelAux
})
  • videoSource: 1: None 2: Camera 3: Custom 4: MainPublishChannel 5: TypePlayer 6: TypeScreenCapture 7: Default
  • channel: 可选参数,见上面的channel
  1. 设置音频采集源
UTSZego.setAudioSource({
    audioSource: 6, // ZegoVideoSourceTypeScreenCapture
    channel: 1 // 可选参数,ZegoPublishChannelAux
})
  • audioSource: 1: default 1: custom 2: 可选参数,见上面的channel 3: None 4: Microphone 5: MainPublishChannel 6: TypeScreenCapture
  • channel: 可选参数,见上面的channel
  1. 开始屏幕采集,仅限 app 应用内录屏,仅支持iOS

let captureParams = {}
captureParams.captureVideo = true
captureParams.captureAudio = true
UTSZego.startScreenCaptureInApp(captureParams)
  1. 开始屏幕采集,仅支持Android

let captureParams = {}
captureParams.captureVideo = true
captureParams.captureAudio = true
UTSZego.startScreenCapture(captureParams)
  1. 开始屏幕采集,仅限 app 应用外录屏,仅支持iOS

let captureOutAppParams = {}
// captureOutAppParams.preferredExtension = "com.robustel.shengwang.screenshare" // 制定iOS extension的identify
UTSZego.startScreenCaptureOutApp(captureOutAppParams)
  1. 更新录屏配置

let params = {}
params.captureVideo = true
params.captureAudio = true
UTSZego.updateScreenCaptureConfig(params)
  1. 开始播放流

let params = {}
params.streamId = "xxx"
UTSZego.startPlayingStream(params)
  1. 设置app groupID,仅支持iOS

UTSZego.setAppGroupID("xxx)
  1. 是否开启硬解码

UTSZego.enableHardwareDecoder(true)
  1. 是否开启硬编码

UTSZego.enableHardwareEncoder(true)

隐私、权限声明

1. 本插件需要申请的系统权限列表:

摄像头、麦克风

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件使用的 Zego SDK会采集数据,详情可参考:https://www.zego.im/

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

使用中有什么不明白的地方,就向插件作者提问吧~ 我要提问