更新记录

3.5.0(2021-05-14)

  1. 新增摄像头控制接口;
  2. 新增音频控制功能;

3.2.0(2021-04-20)

  1. 新增视频窗口大小调整(增值);
  2. 修复窗口覆盖函数bug(增值);
  3. 修复和其他插件共同使用时依赖库可能冲突;
查看更多

平台兼容性

Android iOS
适用版本区间:4.4 - 11.0 适用版本区间:9 - 14

原生插件通用使用流程:

  1. 购买插件,选择该插件绑定的项目。
  2. 在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
  3. 根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
  4. 打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
  5. 开发完毕后正式云打包

付费原生插件目前不支持离线打包。
Android 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/android
iOS 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/ios

注意事项:使用HBuilderX2.7.14以下版本,如果同一插件且同一appid下购买并绑定了多个包名,提交云打包界面提示包名绑定不一致时,需要在HBuilderX项目中manifest.json->“App原生插件配置”->”云端插件“列表中删除该插件重新选择


腾讯云视频互动直播

腾讯云实时语音, 提供互动直播的功能,包括直播、互动连麦、主播 PK、低延时观看、弹幕聊天等 在互动直播场景下的相关能力,可用于秀场直播、互动大班课、互动小班课和直播答题等场景。

技术支持

建议扫码添加我们技术支持,协助接入和测试。

技术支持



微信号: ruanyunkeji006



快速接入

步骤1: 插件的加载和配置

  • 加载插件

首先,uniapp平台的原生插件,需要自定义基座后才能使用,您可以按照自定义基座文档进行。

其次,新建nvue文件,注意该模块必须在nvue中使用。

插件名称为: RY-TencentTrtcLiveRoom,使用标签

<RY-TencentTrtcLiveRoom ref="liveRoom" v-bind:style = "{ width: playerWidth, height: playerHeight }"></RY-TencentTrtcLiveRoom>

备注:

可以通过改变width和height参数的大小,来改变视图容器的大小。

  • 腾讯云配置

注册或登录腾讯云账号,实名认证后,开通实时音视频

  1. 点击应用管理,进入应用列表;
  2. 点击 "创建应用",填入相关信息,创建新应用; 如果使用已有应用,则跳过这步;
  3. 点击"应用信息",进入应用详情;
  4. 在"应用信息"标签卡中,点击"SDKAppID"后面的复制按钮,复制SDKAppId,并保存,对应为后文中的"sdkAppId";
  5. 在"快速上手"标签卡中,"第二步"里,点击"复制秘钥",复制Key,并保存,对应为后文中的"key"值。
  • 生成签名
  1. 进入 sdkToken 平台,注册或者登录该平台;
  2. 点击 RY-TencentTrtcLiveRoom 创建新应用:
  • "应用名"为您应用的名称,一般填写app名字;
  • "sdkAppId"为上方腾讯云配置中保存的sdkAppId值;
  • "key"为上方中腾讯云配置中保存的key值;
  • "Package Name"为您自定义基座中,使用的Android包名;
  • "Bundle Id"为您自定义基座中,使用的iOS包名。
  1. 点击 签名工具 ,选择您前面创建的应用,填入userId,获取用户签名userSig,保存userId和userSig,供后面步骤使用。

备注:

测试过程中一般需要生成两个userId对应的userSig,以方便快速测试双方的功能。

步骤2: 插件初始化

必须调用 init 函数后,才可以使用插件个各个功能。

this.$refs.liveRoom.init({}, ret => {
    console.log(ret);
});

步骤3: 设置监听器

直播的相关信息通过 setLiveRoomListener 返回的事件回调来反馈,有关 事件回调 中含有事件的详细相关说明和参数。

this.$refs.liveRoom.setLiveRoomListener({}, ret => {
    console.log(ret);
});

步骤4: 登录

执行 login 登录后,您才可以执行各个直播相关的操作。

var self = this;
this.$refs.liveRoom.login({
    sdkAppId: self.sdkAppId,
    userId: self.userId,
    userSig: self.userSig
}, ret => {
    uni.showToast({
        title: JSON.stringify(ret),
        icon: "none"
    });
});

步骤5: 主播端开播

  1. 主播登录后,可以调用 setSelfProfile 设置自己的昵称和头像。
  2. 主播在开播前可先调用 startCameraPreview 开启摄像头预览,也可以配置美颜相关功能进行美颜设置。
  3. 主播调整美颜效果后,可以调用 createRoom 创建新的直播间。
  4. 主播调用 startPublish 开始推流。

主播端开播

// 1.主播设置昵称和头像
self.$refs.liveRoom.setSelfProfile({
    userName: 'A',
    avatarUrl: 'faceUrl'
}, ret => {
    console.log(ret);
});
// 2.主播开播前预览并设置美颜参数
this.$refs.liveRoom.startCameraPreview({
    isFront: self.isFront,
    rect: {
        x: 0, 
        y: 0, 
        w: self.playerWidth,
        h: self.playerHeight
    }
}, ret => {
    console.log(ret);
});
// 3.主播创建房间
self.$refs.liveRoom.createRoom({
    roomId: 123456789,
    roomName: '测试房间', 
    coverUrl: 'http://xxx.xxx.xxx/xxx.png'
}, ret => {
    uni.showToast({
        title: JSON.stringify(ret),
        icon: "none"
    });
});
// 4.主播开启推流并将流发布到 CDN
this.$refs.liveRoom.startPublish({
    streamId: 'A_stream'
}, ret => {
    console.log(ret);
});

步骤6: 观众端观看

  1. 观众端执行登录后,可以调用 setSelfProfile 设置自己的昵称和头像。
  2. 观众端向业务后台获取最新的直播房间列表。

说明:

Demo 中的直播间列表仅做演示使用,直播间列表的业务逻辑千差万别,腾讯云暂不提供直播间列表的管理服务,请自行管理您的直播间列表。

  1. 观众端调用 getRoomInfos 获取房间的详细信息,该信息是在主播端调用 createRoom 创建直播间时设置的简单描述信息。

注意:

如果您的直播间列表包含了足够全面的信息,可跳过调用getRoomInfos相关步骤。

  1. 观众选择一个直播间,调用 enterRoom 并传入房间号即可进入该房间。
  2. 调用 startPlay 并传入主播的 userId 开始播放。
    • 若直播间列表已包含主播端的 userId 信息,观众端可直接调用 startPlay 并传入主播的 userId 即可开始播放;
    • 若在进房前暂未获取主播的 userId,观众端在进房后会收到主播setLiveRoomListener#onAnchorEnter 的事件回调,该回调中携带主播的 userId 信息,调用 startPlay 即可播放。

观众端观看

// 1.假定您从业务后台获取房间列表为 roomIdList
// 2.通过调用 getRoomInfos 获取房间的详细信息
this.$refs.liveRoom.getRoomInfos({
    roomIdList: roomIdList
}, ret => {
    console.log(ret);
    // 获取到房间详细信息后,您可以在主播列表页面展示主播昵称、头像等相关信息
});
// 3.选择房间 roomId 进入
self.$refs.liveRoom.enterRoom({
    roomId: roomId,
}, ret => {
    console.log(ret);
});

this.$refs.liveRoom.setLiveRoomListener({}, ret => {
    if (ret.hasOwnProperty('eventType') {
        // 4.观众收到主播进房通知,开始播放
        if ('onAnchorEnter' == ret.eventType) {
            // 5.观众播放主播画面
            this.$refs.liveRoom.startPlay({
                userId: ret.userId,
                rect: {
                    x: 0, 
                    y: 0,
                    w: self.playerWidth / 2,
                    h: self.playerHeight / 2
                }
            }, ret => {
                console.log(ret);
            });
        }
    });
});

步骤7: 观众与主播连麦

  1. 观众端调用 requestJoinAnchor 向主播端发起连麦请求。
  2. 主播端会收到setLiveRoomListener#onRequestJoinAnchor(即有观众请求与您连麦)的事件通知。
  3. 主播端可以通过调用 responseJoinAnchor 决定是否接受来自观众端的连麦请求。
  4. 主播端会收到返回结果,该结果通知会携带来自主播端的处理结果。
  5. 如果主播同意连麦请求,观众端可调用 startCameraPreview 开启本地摄像头,随后调用 startPublish 启动观众端的推流。
  6. 主播端会在观众端启动通知后收到 setLiveRoomListener#[onAnchorEnter])(https://helpyougo.com/web/userpage/documents?id=65&menuid=onAnchorEnter) (即另一路音视频流已到来)通知,该通知会携带观众端的 userId。
  7. 主播端调用 startPlay 即可看到连麦观众的画面。

观众与主播连麦

// 观众端:
// 1.观众端发起连麦请求
this.$refs.liveRoom.requestJoinAnchor({
    reason: self.reason
}, ret => {
    // 4.主播接受了观众的请求
    if (ret.agree) {
        // 5.观众启动预览,开启推流
        this.$refs.liveRoom.startCameraPreview({
            isFront: true,
            rect: {
                x: 0, 
                y: 0, 
                w: self.playerWidth,
                h: self.playerHeight
            }
        }, ret => {
            console.log(ret);
        });
        this.$refs.liveRoom.startPublish({
            streamId: 'stream002'
        }, ret => {
            console.log(ret);
        });
    }
});

// 主播端:
// 2.主播端收到连麦请求
this.$refs.liveRoom.setLiveRoomListener({}, ret => {
    if (ret.hasOwnProperty('eventType')) {
        if ('onRequestJoinAnchor' == ret.eventType) {
            // 3.同意对方的连麦请求
            this.$refs.liveRoom.responseJoinAnchor({
                userId: ret.userInfo.userId,
                isAgree: true, 
                reason: 'This is a reason'
            }, ret => {
                console.log(ret);
            });
        }
        // 6.主播收到连麦观众的上麦通知
        if ('onAnchorEnter' == ret.eventType) {
            // 7.主播播放观众画面
            this.$refs.liveRoom.startPlay({
                userId: ret.userId,
                rect: {
                    x: 0, 
                    y: 0,
                    w: self.playerWidth,
                    h: self.playerHeight
                }
            }, ret => {
                console.log(ret);
            });
        }
    }
});

步骤8:主播与主播 PK

  1. 主播 A 调用 requestRoomPK 向主播 B 发起 PK 请求。
  2. 主播 B 会收到 setLiveRoomListener#onRequestRoomPK 回调通知。
  3. 主播 B 调用 responseRoomPK 决定是否接受主播 A 的 PK 请求。
  4. 主播 B 接受主播 A 的请求,等待setLiveRoomListener#onAnchorEnter 通知,调用 startPlay 显示主播 A。
  5. 主播 A 收到responseCallback回调通知,PK 请求是否被同意。
  6. 主播 A 请求被同意,等待 setLiveRoomListener#onAnchorEnter 通知,调用 startPlay 显示主播 B。

主播与主播PK

// 主播 A:
// 主播 A 创建12345的房间
this.$refs.liveRoom.createRoom({
    roomId: 12345,
    roomName: 'roomA', 
    coverUrl: 'http://xxx.xxx.xxx/coverA.png'
}, ret => {
    console.log(ret);
})
// 1.主播 A 向主播 B 发起 PK 请求
this.$refs.liveRoom.requestRoomPK({
    roomId: 54321,
    userId: 'B'
}, ret => {
    console.log(ret);
    // 5.收到是否同意的回调
    if (ret.agree) {
    }
});

this.$refs.liveRoom.setLiveRoomListener({}, ret => {
    if (ret.hasOwnProperty('eventType')) {
        // 4.主播 B 收到主播 A 进房的通知,播放主播 A 的画面
        if ('onAnchorEnter' == ret.eventType) {
            this.$refs.liveRoom.startPlay({
                userId: ret.userId,
                rect: {
                    x: 0, 
                    y: 0,
                    w: self.playerWidth,
                    h: self.playerHeight
                }
            }, ret => {
                console.log(ret);
            });
        }
    }
});

// 主播 B:
// 主播 B 创建54321的房间
this.$refs.liveRoom.createRoom({
    roomId: 54321,
    roomName: 'roomB', 
    coverUrl: 'http://xxx.xxx.xxx/coverA.png'
}, ret => {
    console.log(ret);
});

this.$refs.liveRoom.setLiveRoomListener({}, ret => {
    if (ret.hasOwnProperty('eventType')) {
        // 2.主播 B 收到主播 A 的消息
        if ('onRequestRoomPK' == ret.eventType) {
            // 3.主播 B 回复主播 A 接受请求
            this.$refs.liveRoom.responseRoomPK({
                    userId: ret.userInfo.userId,
                    isAgree: true, 
                    reason: 'This is a reason'
                }, ret => {
                    console.log(ret);
                });
        }
        // 4.主播 B 收到主播 A 进房的通知,播放主播 A 的画面
        if ('onAnchorEnter' == ret.eventType) {
            this.$refs.liveRoom.startPlay({
                userId: ret.userId,
                rect: {
                    x: 0, 
                    y: 0,
                    w: self.playerWidth,
                    h: self.playerHeight
                }
            }, ret => {
                console.log(ret);
            });
        }
    }
});

responseRoomPK 主播响应跨房PK请求

var self = this;
this.$refs.liveRoom.responseRoomPK({
    userId: self.remoteUserId,
    isAgree: self.isAgree, 
    reason: self.reason
}, ret => {
    uni.showToast({
        title: JSON.stringify(ret),
        icon: "none"
    });
});

步骤9:实现文字聊天和弹幕消息

  • 通过 sendRoomTextMsg 可以发送普通的文本消息,所有在该房间内的主播和观众均可以收到setLiveRoomListener#onRecvRoomTextMsg 回调。

即时通信 IM 后台有默认的敏感词过滤规则,被判定为敏感词的文本消息不会被云端转发。

// 发送端:发送文本消息
this.$refs.liveRoom.sendRoomTextMsg({
    msg: 'Hello World!'
}, ret => {
    console.log(ret);
});

// 接收端:监听文本消息
this.$refs.liveRoom.setLiveRoomListener({}, ret => {
    if (ret.hasOwnProperty('eventType')) {
        if ('onRecvRoomTextMsg' == ret.eventType) {
            console.log('收到来自ret.fromUser.userName的文本消息:ret.message')
        }
    }
});

自定义消息常用于传输自定义信令,例如用于点赞消息的发送和广播。、

// 发送端:您可以通过自定义Cmd来区分弹幕和点赞消息
// eg:"CMD_DANMU"表示弹幕消息,"CMD_LIKE"表示点赞消息
this.$refs.liveRoom.sendRoomCustomMsg({
    cmd: 'CMD_DANMU', 
    msg: 'Hello world'
}, ret => {
    console.log(ret);
});
this.$refs.liveRoom.sendRoomCustomMsg({
    cmd: 'CMD_LIKE', 
    msg: ''
}, ret => {
    console.log(ret);
});

this.$refs.liveRoom.setLiveRoomListener({}, ret => {
    if (ret.hasOwnProperty('eventType')) {
        // 接收端:监听自定义消息
        if ('onRecvRoomCustomMsg' == ret.eventType) {
            if ('CMD_DANMU' == ret.command) {
                console.log('收到来自ret.fromUser.userName的文本消息:ret.message')
            }
            if ('CMD_LIKE' == ret.command) {
                console.log('ret.fromUser.userName给您点了个赞!')
            }
        }
    }
});

更多功能

  • 基础美颜
  • 人生设置(音效、混响效果)
  • 背景音乐

扫码添加, 获取技术支持:

技术支持



微信号: ruanyunkeji006

隐私、权限声明

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

Android: "android.permission.INTERNET", "android.permission.ACCESS_NETWORK_STATE", "android.permission.ACCESS_WIFI_STATE", "aandroid.permission.WRITE_EXTERNAL_STORAGE", "android.permission.READ_EXTERNAL_STORAGE", "android.permission.RECORD_AUDIO", "android.permission.MODIFY_AUDIO_SETTINGS", "android.permission.BLUETOOTH", "android.permission.CAMERA", "android.permission.READ_PHONE_STATE", "android.hardware.camera", "android.hardware.camera.autofocus" iOS: 无

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

插件使用的实时音视频SDK会采集数据,详情可参考: https://cloud.tencent.com/document/product/647/43181

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

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