前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TRTC零基础上手 -- 码上视频订阅篇

TRTC零基础上手 -- 码上视频订阅篇

原创
作者头像
天上云间
发布2022-01-19 17:06:11
1.1K0
发布2022-01-19 17:06:11
举报
文章被收录于专栏:云学堂云学堂

本文将介绍TRTC视频拉流相关API以及注意事项并加上示例代码,补充一些SDK API文档上没有的内容,使读者对TRTC中视频拉流方面有所了解。

TRTC上手系列文章

🚩 视频拉流事件回调

当作为拉流端,在远端推流后即可开始拉流,为了用户体验,建议按照规范要求,在收到SDK的事件回调后开始拉流,并在控件上显示远端画面

示例代码

代码语言:java
复制
// 设置TRTC事件回调接口。
 mTRTCCloud.setListener(new TRTCCloudListener ());

注意事项

  • 重复设置SDK事件回调接口,会覆盖之前的接口。如果需要保留之前的接口,可以使用代理模式分发相关事件。
  • 建议在初始化TRTC时候设置事件回调接口。

1. onUserVideoAvailable()远端视频推流事件回调

远端视频流可用状态的回调事件,可以根据 available 来开始或停止拉远端流,SDK会把视频画面并显示在控件上。

参数说明:

  • userId 远端用户的用户标识
  • available 该用户是否发布(或取消发布)了主路视频画面,true: 发布;false:取消发布。 示例代码
代码语言:java
复制
        @Override
        public void onUserVideoAvailable(String userId, boolean available) {
            Log.d(TAG, "onUserVideoAvailable  available " + available + " userId " + userId);
            if (available) { 
                TRTCCloudDef.TRTCRenderParams params = new TRTCCloudDef.TRTCRenderParams();
				// 设置渲染模式
                params.fillMode = TRTCCloudDef.TRTC_VIDEO_RENDER_MODE_FIT;
				//设置远端画面渲染参数
                mTRTCCloud.setRemoteRenderParams(userId,TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG,params);
				// 开始拉远端视频流,并显示在控件上
                mTRTCCloud.startRemoteView(userId, TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG, mTxcvvAnchorPreviewView);
            } else { 
				// 停止拉远端视频流
                mTRTCCloud.stopRemoteView(userId, TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG);
            }
        }

注意事项

  • 远端发布或停止视频推流,都会回调该事件
  • 远端暂停和恢复视频推流,也会回调该事件

2. onUserSubStreamAvailable()远端辅路视频推流事件回调

辅路视频流可用状态的回调事件,一般用作屏幕分享,可以根据 available 来开始或停止拉远端流,SDK会把视频画面并显示在控件上。

参数说明

  • userId 远端用户的用户标识
  • available 该用户是否发布(或取消发布)了主路视频画面,true: 发布;false:取消发布。

注意事项

  • 辅路是独立于主路的视频流,需要单独推流,一般用于屏幕分享
  • 房间内只能有一路辅路推流,同时推两路辅路会导致失败。

3. onFirstVideoFrame() 首帧画面回调事件

SDK 开始渲染自己本地或远端用户的首帧画面事件回调。

参数说明

  • userId 本地或远端的用户标识,如果 userId 为空值代表自己本地的首帧画面已到来,userId 不为空则代表远端用户的首帧画面已到来。
  • streamType 视频流类型:主路(Main)一般用于承载摄像头画面,辅路(Sub)一般用于承载屏幕分享画面。
  • width 画面的宽度。
  • height 画面的高度。

用法

  • 获取当前视频流的分辨率来计算画面大小,重排显示布局。

注意事项

  • 只有当您调用了 startLocalPreview 或 startScreenCapture 之后,才会触发自己本地的首帧画面事件回调。
  • 只有当您调用了 startRemoteView 或 startRemoteSubStreamView 之后,才会触发远端用户的首帧画面事件回调。

4. onRemoteVideoStatusUpdated()远端视频状态变化的事件回调

为了更佳的用户体验,可以获取远端每一路画面的播放状态(包括 Playing、Loading 和 Stopped 三种状态),从而进行相应的 UI 展示。

参数说明

  • userId 用户标识
  • streamType 视频流类型:主路(Main)一般用于承载摄像头画面,辅路(Sub)一般用于承载屏幕分享画面。
  • status 视频状态:包括 Playing、Loading 和 Stopped 三种状态。
  • reason 视频状态改变的原因
  • extrainfo 额外信息

🚩 视频拉流控制

在进房远端推流后,本地可以根据需要去订阅远端流或暂停拉流。TRTC SDK提供了以下API控制远端用户视频画面。

1. startRemoteView() 订阅远端用户的视频流,并绑定视频渲染控件

用法

  • 如果您已经知道房间中有视频流的用户的 userid,可以直接调用 startRemoteView 订阅该用户的画面。
  • 如果您不知道房间中有哪些用户在发布视频,您可以在 enterRoom 之后等待来自 onUserVideoAvailable 的通知。

注意事项

  • SDK 支持同时观看某 userid 的大画面和辅路画面,或者同时观看某 userid 的小画面和辅路画面,但不支持同时观看大画面和小画面。
  • 只有当指定的 userid 通过 enableEncSmallVideoStream 开启双路编码后,才能观看该用户的小画面。
  • 当指定的 userid 的小画面不存在时,SDK 默认切换到该用户的大画面。

2. updateRemoteView() 动态更新远端用户的视频渲染控件

该接口可用于更新远端视频画面的渲染控件,常被用于切换显示区域的交互场景中

示例代码

代码语言:java
复制
mRemoteVideoView.addVideoView(new TextureView(context));
mTRTCCloud.updateRemoteView(remoteUserId, TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG,  mRemoteVideoView);
	   

注意事项

  • 安卓端需要添加 TextureView 才有效,参考示例。

3. stopRemoteView() 停止订阅远端用户的视频流,并释放渲染控件

调用此接口会让 SDK 停止接收该用户的视频流,并释放该路视频流的解码和渲染资源。

用法

  • 如果本地不再需要显示远端用户的画面,可以调用该方法,如果只是暂时停止显示,建议调用muteRemoteVideoStream()接口
  • 当远端用户退出房间或者暂停视频推流时候,调用该方法停止拉视频流。

注意事项

  • 本地用户如果退出房间,SDK将自动停止订阅,不需要针对房间内每个用户调用stopRemoteView。

4. stopAllRemoteView () 停止订阅所有远端用户的视频流,并释放全部渲染资源

调用此接口会让 SDK 停止接收所有来自远端的视频流,并释放全部的解码和渲染资源。

5. muteRemoteVideoStream() 暂停/恢复订阅远端用户的视频流

该接口仅暂停/恢复接收指定用户的视频流,但并不释放显示资源,视频画面会被冻屏在接口调用时的最后一帧,适合需要短暂不显示画面的场景。

参数说明

  • userId 指定远端用户的 ID。
  • streamType 要暂停/恢复的视频流类型(仅支持 TRTCVideoStreamTypeBig 和 TRTCVideoStreamTypeSub)。
  • mute 是否暂停接收。

注意事项

  • 该接口支持您在进入房间(enterRoom)前调用,暂停状态会在退出房间(exitRoom)在之后会被重置

6. muteAllRemoteVideoStreams() 暂停/恢复订阅所有远端用户的视频流

该接口仅暂停/恢复接收所有用户的视频流,但并不释放显示资源

🚩 视频订阅设置

1. setRemoteVideoStreamType() 切换指定远端用户的大小画面

某个主播开启了双路编码之后,房间中其他用户通过 startRemoteView 订阅到的画面默认会是【高清大画面】。通过此接口选定希望订阅的画面是大画面还是小画面。

注意事项

  • 需要目标用户已经通过 enableEncSmallVideoStream 提前开启了双路编码模式。
  • 该接口在 startRemoteView 之前和之后调用均可生效

2. snapshotVideo() 视频画面截图

通过本接口截取本地的视频画面,远端用户的主路画面以及远端用户的辅路(屏幕分享)画面

注意事项

  • userId如指定空置表示截取本地的视频画面。
  • Windows 平台目前仅支持截取 TRTCSnapshotSourceTypeStream 来源的视频画面。
  • 截取视频流画面比视频渲染画面更清晰

3. setDefaultStreamRecvMode()设置订阅模式

在绝大多数场景下,用户进入房间后都会订阅房间中所有主播的音视频流,因此 TRTC 默认采用了自动订阅模式,以求得最佳的“秒开体验”。 如果您的应用场景中每个房间同时会有很多路音视频流在发布,而每个用户只想选择性地订阅其中的 1-2 路,则推荐使用“手动订阅”模式以节省流量费用

注意事项

  • TRTC默认是自动订阅模式,依然需要您通过 startRemoteView 接口绑定渲染控件。
  • 需要在进入房间(enterRoom)前调用该接口,设置才能生效。
  • 在自动订阅模式下,如果用户在进入房间后没有调用 {@startRemoteView} 订阅视频流,SDK 会自动停止订阅视频流,以便达到节省流量的目的。

🚩 远端视频画面设置

1. setRemoteRenderParams 远端画面参数设置

示例代码

代码语言:java
复制
// 画面渲染参数 
TRTCCloudDef.TRTCRenderParams renderParams = new TRTCCloudDef.TRTCRenderParams();
...
    // 设置远端画面参数
    mTRTCCloud.setRemoteRenderParams(remoteUserId , TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG , params);

2. fillMode 远端画面渲染模式

SDK支持两种画面渲染模式: Fill和Fit,前者无论原分辨率如何都将画面铺满View组件,多出部分画面将被剪裁;后者将会显示完整的视频画面,多出的部分View区域将黑屏显示。

示例代码

代码语言:java
复制
    TRTCCloudDef.TRTCRenderParams params = new TRTCCloudDef.TRTCRenderParams();
	// 填充模式
    params.fillMode = TRTCCloudDef.TRTC_VIDEO_RENDER_MODE_FILL;
	// 平铺模式
    params.fillMode = TRTCCloudDef.TRTC_VIDEO_RENDER_MODE_FIT;
    ...
    // 设置远端画面参数
    mTRTCCloud.setRemoteRenderParams(remoteUserId , TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG , params);
	

3. rotation 远端画面旋转角度

代码语言:java
复制
    TRTCCloudDef.TRTCRenderParams params = new TRTCCloudDef.TRTCRenderParams();
	// 旋转画面90度
    params.rotation = TRTCCloudDef.TRTC_VIDEO_ROTATION_90;
    ...
        // 设置远端画面参数
    mTRTCCloud.setRemoteRenderParams(remoteUserId , TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG , params);
	

4. mirrorType 远端画面的镜像策略

示例代码

代码语言:java
复制
public void onRenderVideoFrame(String userId, int streamType, final TRTCCloudDef.TRTCVideoFrame frame) {
    mEglCore.makeCurrent();
    GLES20.glViewport(0, 0, mSurfaceSize.width, mSurfaceSize.height);
    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);
    GLES20.glClearColor(0, 0, 0, 1.0f);
    GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
    mNormalFilter.onDraw(frame.texture.textureId, mGLCubeBuffer, mGLTextureBuffer);
    mEglCore.swapBuffer();
}

🚩 自定义画面渲染

1. setRemoteVideoRenderListener()

示例代码

代码语言:java
复制
public void onRenderVideoFrame(String userId, int streamType, final TRTCCloudDef.TRTCVideoFrame frame) {
    mEglCore.makeCurrent();
    GLES20.glViewport(0, 0, mSurfaceSize.width, mSurfaceSize.height);
    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);
    GLES20.glClearColor(0, 0, 0, 1.0f);
    GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
    mNormalFilter.onDraw(frame.texture.textureId, mGLCubeBuffer, mGLTextureBuffer);
    mEglCore.swapBuffer();
}

作者简介

彭立铭,做过Window应用程序,做过Java后端服务,做过Flash流媒体服务,做过前端岗位,后来专注与安卓开发、擅长图形API、音视频等领域。爱好音乐、爱好骑行,喜欢游山玩水,向往无忧无虑的蓝天白云。自我感觉,有耐心、善于解决问题 想象力丰富、习惯于发散思维 学习能力强,专业技能丰富

参考文档

代码示例

视频质量

屏幕共享

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • TRTC上手系列文章
  • 🚩 视频拉流事件回调
    • 1. onUserVideoAvailable()远端视频推流事件回调
      • 2. onUserSubStreamAvailable()远端辅路视频推流事件回调
        • 3. onFirstVideoFrame() 首帧画面回调事件
          • 4. onRemoteVideoStatusUpdated()远端视频状态变化的事件回调
          • 🚩 视频拉流控制
            • 1. startRemoteView() 订阅远端用户的视频流,并绑定视频渲染控件
              • 2. updateRemoteView() 动态更新远端用户的视频渲染控件
                • 3. stopRemoteView() 停止订阅远端用户的视频流,并释放渲染控件
                  • 4. stopAllRemoteView () 停止订阅所有远端用户的视频流,并释放全部渲染资源
                    • 5. muteRemoteVideoStream() 暂停/恢复订阅远端用户的视频流
                      • 6. muteAllRemoteVideoStreams() 暂停/恢复订阅所有远端用户的视频流
                      • 🚩 视频订阅设置
                        • 1. setRemoteVideoStreamType() 切换指定远端用户的大小画面
                          • 2. snapshotVideo() 视频画面截图
                            • 3. setDefaultStreamRecvMode()设置订阅模式
                            • 🚩 远端视频画面设置
                              • 1. setRemoteRenderParams 远端画面参数设置
                                • 2. fillMode 远端画面渲染模式
                                  • 3. rotation 远端画面旋转角度
                                    • 4. mirrorType 远端画面的镜像策略
                                    • 🚩 自定义画面渲染
                                      • 1. setRemoteVideoRenderListener()
                                      • 作者简介
                                      • 参考文档
                                      相关产品与服务
                                      实时音视频
                                      实时音视频(Tencent RTC)基于腾讯21年来在网络与音视频技术上的深度积累,以多人音视频通话和低延时互动直播两大场景化方案,通过腾讯云服务向开发者开放,致力于帮助开发者快速搭建低成本、低延时、高品质的音视频互动解决方案。
                                      领券
                                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档