SOP TRTC SDK 仪表盘 Android TRTC 发送自定义采集的视频数据 Android TRTC 发送自定义采集音频解决方案 Android TRTC 实现横屏视频通话 iOS端 TRTC 发送自定义采集视频解决方案 iOS端 TRTC 发送自定义采集音频解决方案 APNS推送 脏字过滤 TXLiteAVSDK中使用 AVAudioSession 问题总结 AndroidStudio编译SDK报错 RoomService部署验证 Xcode编译SDK报错 iOS编译库冲突问题 iOS端移动直播自定义采集实现 iOS端TXLiteAVSDK与IMSDK 3.x集成冲突报错问题 Android端TXLiteAVSDK与IMSDK 3.x集成冲突报错问题 Android端LiteIM sdk升级IM4.x版本报错问题 移动直播iOS 12兼容问题 如何实现好的画质 如何计算PCM音量大小 使用播放器播放视频有黑边 直播拉流播放失败 直播拉流端卡顿现象 短视频上传失败 移动直播SDK对接第三方美颜库 移动直播连麦解决方案 Android移动直播推自定义采集的视频数据 Android移动直播推自定义采集的声音数据 Android直播播放如何获取YUV数据 Android直播播放如何自定义渲染 实时音视频画面黑屏 实时音视频订阅流显示 iOS 12默认新编译系统下文件名冲突问题 TXLiteAVSDK指标监控 进阶:小程序实时音视频参数透传 移动直播 Android 9.0 无法拉流问题 移动直播推流事件回调 移动直播拉流事件回调 短视频实现视频缩略图列表转GIF功能 roomService加入群组时报错invalid group id NTP时间戳转换 提示Role not exists 角色不存在 如何播放背景音乐 iOS端短视频添音频相关问题总结 Web同步终端离线推送TIMOfflinePushInfo说明文档 web端自定义消息发送 web端同步终端的已读回执 web端对群组内用户禁言操作 TRTC v2混流接口setMixTranscodingConfig使用指引

实时音视频订阅流显示

发布日期:2018年9月7日 更新日期:2018年9月7日 贡献者:yjjjiang

音视频通话画面订阅实现

常见场景

比如:多人音视频通话过程中,房间内 A、B、C、D 四人都打开了摄像头,但是 A 只想看见 B 和 C 的画面,B 只想看 A 的画面,C 和 D 想看到所有人的画面。

在这种场景中,就需要实现一种订阅画面显示的方式,来让通话的各方实现自由定制的数据接收与显示。

解决办法

Android

  1. 通话方在进入音视频房间前配置 roomOption 关闭自动渲染 autoRender(false),并监听音视频回调以及视频请求回调
ILiveRoomOption option = new ILiveRoomOption()
                .autoRender(false)
                .setRoomMemberStatusLisenter(this) // 监听房间内音视频事件
                .setRequestViewLisenter(this)   // 监听视频请求回调
                .autoCamera(true)
                .autoMic(true);
  1. 在收到用户的 TYPE_MEMBER_CHANGE_HAS_CAMERA_VIDEOTYPE_MEMBER_CHANGE_HAS_SCREEN_VIDEO 事件时(如果有播片,还有处理 has file 事件),调用接口 requestUserVideoData 去请求用户视频画面
public boolean onEndpointsUpdateInfo(int eventid, String[] updateList) {
        switch (eventid){
            case ILiveConstants.TYPE_MEMBER_CHANGE_HAS_CAMERA_VIDEO:
                for (String userId : updateList){
                    // 请求视频画面
                    ILiveSDK.getInstance().getContextEngine().requestUserVideoData(userId,
                        CommonConstants.Const_VideoType_Camera);
                }
                break;
         }

        // 这里需要返回false
        return false;
    }
  1. 在视频请求成功后,调用渲染控件的接口来进行渲染
public void onComplete(String[] userIdList, AVView[] viewList, int count, int result, String errMsg) {
    if (ILiveConstants.NO_ERR == result){
        for (int i=0; i<userIdList.length; i++){
            avRootView.renderVideoView(true, userIdList[i], viewList[i].videoSrcType, true);
        }
    }else {
        // Do something 失败处理
    }
}
  1. 调用 ILiveSDK.getInstance().getContextEngine().removeUserVideoData ,即可断流

iOS

  1. ILiveRoomOption 设置音视频监听 memberStatusListener
 TILLiveRoomOption *option = [TILLiveRoomOption defaultGuestLiveOption];
        option.controlRole = kSxbRole_GuestHD;
        option.avOption.autoHdAudio = YES;
        option.memberStatusListener = self;  // 监听房间内音视频事件
  1. onEndpointsUpdateInfo 中收到 QAV_EVENT_ID_ENDPOINT_HAS_CAMERA_VIDEO 事件时,需要显示画面则创建并添加渲染视图,传入 userID 和渲染画面类型
(BOOL)onEndpointsUpdateInfo:(QAVUpdateEvent)event updateList:(NSArray *)endpoints {
    switch (event) {
        case QAV_EVENT_ID_ENDPOINT_HAS_CAMERA_VIDEO:
            {
                /*
                 创建并添加渲染视图,传入userID和渲染画面类型,这里传入 QAVVIDEO_SRC_TYPE_CAMERA(摄像头画面)
                 */
                ILiveFrameDispatcher *frameDispatcher = [[ILiveRoomManager getInstance] getFrameDispatcher];
                ILiveRenderView *renderView = [frameDispatcher addRenderAt:self.view.bounds foruserId:[endpoints.firstObject userId] srcType:QAVVIDEO_SRC_TYPE_CAMERA];
                [self.view addSubview:renderView];
            }
            break;
    }
    return YES;
}

不需要显示画面时则不做处理

  1. 通过 ILiveRoomManager 下的 cancelViewList 取消指定用户的画面,可以断流

Windows(PC)

  1. ILiveRoomOption 里设置参数 autoRequestCamerafalse,关闭自动请求画面,并设置音视频监听 memberStatusListener

  2. OnMemStatusChange 里,收到对应 id 的 HAS_CAMERA 事件时,调用 requestStream手动请求画面

  3. 不请求画面,即断流数据。

[注意]断流:不接收数据


音视频通话声音订阅实现

常见场景

比如:多人音视频通话过程中,房间内 A、B、C、D 四人都打开了麦克风,但 A 只想听见 B 和 C 的声音,B 只要听 A 的声音,C 和 D 想听到所有人的声音。

在这种场景中,就需要实现一种订阅声音播放的方式,来让通话的各方实现自由定制的音频数据接收与播放。

解决办法

iOS 以及 Windows(PC)

可以直接设置 requestAudioList 来指定音视频房间内的音频白名单

/*
 @abstract      开启/关闭音频数据白名单逻辑。
 @param         identifierList为希望收到其音频数据的成员列表
 @return        QAV_OK 表示成功操作成功 
                QAV_ERR_FAIL表示操作失败,可能是因为房间不存在,个别成员不在房间内或者转换tinyid失败等(这种情况下名单内若有成员id转换成功,仍然会被加入白名单且白名单生效)。
 @see           QAVResult
 @warning       每次最多设置6个成员id,超过6个将添加vector最后6个到白名单,开启白名单时,若identifierList为空,则默认丢弃任所有音频数据;每次调用,白名单将被重置为新的成员
                列表,而不是累加。需要定制想接收的音频数据才需要调用,不调用则默认接收房间内所有音频数据
*/
- (QAVResult)requestAudioList:(NSArray*)identifierList;

Android

没有直接封装此功能,所以要用 avsdk 的原生接口。

设置白名单:

((AVRoomMulti)ILiveSDK.getInstance().getContextEngine().getRoomObj()).requestAudioList();

取消白名单:

((AVRoomMulti)ILiveSDK.getInstance().getContextEngine().getRoomObj()).cancelAudioList()。

WebRTC 下的音视频订阅实现

音视频订阅都可参考此 Demo 示例https://sxb.qcloud.com/webrtc-samples/peerconnection/

results matching ""

    No results matching ""