本文将介绍TRTC视频拉流相关API以及注意事项并加上示例代码,补充一些SDK API文档上没有的内容,使读者对TRTC中视频拉流方面有所了解。
当作为拉流端,在远端推流后即可开始拉流,为了用户体验,建议按照规范要求,在收到SDK的事件回调后开始拉流,并在控件上显示远端画面
示例代码
// 设置TRTC事件回调接口。
mTRTCCloud.setListener(new TRTCCloudListener ());
注意事项
远端视频流可用状态的回调事件,可以根据 available 来开始或停止拉远端流,SDK会把视频画面并显示在控件上。
参数说明:
@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);
}
}
注意事项
辅路视频流可用状态的回调事件,一般用作屏幕分享,可以根据 available 来开始或停止拉远端流,SDK会把视频画面并显示在控件上。
参数说明
注意事项
SDK 开始渲染自己本地或远端用户的首帧画面事件回调。
参数说明
用法
注意事项
为了更佳的用户体验,可以获取远端每一路画面的播放状态(包括 Playing、Loading 和 Stopped 三种状态),从而进行相应的 UI 展示。
参数说明
在进房远端推流后,本地可以根据需要去订阅远端流或暂停拉流。TRTC SDK提供了以下API控制远端用户视频画面。
用法
注意事项
该接口可用于更新远端视频画面的渲染控件,常被用于切换显示区域的交互场景中
示例代码
mRemoteVideoView.addVideoView(new TextureView(context));
mTRTCCloud.updateRemoteView(remoteUserId, TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG, mRemoteVideoView);
注意事项
调用此接口会让 SDK 停止接收该用户的视频流,并释放该路视频流的解码和渲染资源。
用法
注意事项
调用此接口会让 SDK 停止接收所有来自远端的视频流,并释放全部的解码和渲染资源。
该接口仅暂停/恢复接收指定用户的视频流,但并不释放显示资源,视频画面会被冻屏在接口调用时的最后一帧,适合需要短暂不显示画面的场景。
参数说明
注意事项
该接口仅暂停/恢复接收所有用户的视频流,但并不释放显示资源
某个主播开启了双路编码之后,房间中其他用户通过 startRemoteView 订阅到的画面默认会是【高清大画面】。通过此接口选定希望订阅的画面是大画面还是小画面。
注意事项
通过本接口截取本地的视频画面,远端用户的主路画面以及远端用户的辅路(屏幕分享)画面
注意事项
在绝大多数场景下,用户进入房间后都会订阅房间中所有主播的音视频流,因此 TRTC 默认采用了自动订阅模式,以求得最佳的“秒开体验”。 如果您的应用场景中每个房间同时会有很多路音视频流在发布,而每个用户只想选择性地订阅其中的 1-2 路,则推荐使用“手动订阅”模式以节省流量费用
注意事项
示例代码
// 画面渲染参数
TRTCCloudDef.TRTCRenderParams renderParams = new TRTCCloudDef.TRTCRenderParams();
...
// 设置远端画面参数
mTRTCCloud.setRemoteRenderParams(remoteUserId , TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG , params);
SDK支持两种画面渲染模式: Fill和Fit,前者无论原分辨率如何都将画面铺满View组件,多出部分画面将被剪裁;后者将会显示完整的视频画面,多出的部分View区域将黑屏显示。
示例代码
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);
TRTCCloudDef.TRTCRenderParams params = new TRTCCloudDef.TRTCRenderParams();
// 旋转画面90度
params.rotation = TRTCCloudDef.TRTC_VIDEO_ROTATION_90;
...
// 设置远端画面参数
mTRTCCloud.setRemoteRenderParams(remoteUserId , TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG , params);
示例代码
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();
}
示例代码、
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 删除。