在不同的视频通话场景中,视频画面大小、对视频清晰度和流畅度的要求,网络带宽往往各不相同,你需要根据实际情况,配置合适的视频配置参数。
使用 RTC SDK 采集视频到本地预览或远端渲染的过程中,可以设置的参数如下图。
视频的 宽(px)×高(px) 。宽度对应视频显示界面的横边,高度对应视频显示界面的竖边。关于视频显示界面的方向模式,参考 视频采集旋转方向。高分辨率视频更清晰,但同时会增加对宽带的压力,可能导致卡顿。
由于移动端默认竖屏握持,PC 端默认是横屏,因此移动端和 PC 端的宽高概念是相反的。例如 720P, 对移动端来说是,
720 x 1280,对 PC 端来说是,1280 x 720。
采集分辨率:指摄像头等采集设备提供的画面分辨率。
编码分辨率:经过编码处理的画面的分辨率。编码分辨率小于等于采集分辨率。当编码分辨率小于采集分辨率时,为避免画面变形,编码和采集分辨率宽高比应保持一致。例如,采集分辨率为 1920 × 1080,编码分辨率可以按比例缩小为 640 × 360。
通常情况下,帧率越大,画面越流畅。一般可以使用 15 fps 。对于分辨率小于 200 × 200 的图像大小,可以使用 10 fps 。一般来说,帧率不超过 30 fps。
视频采集帧率(fps),即每秒钟要包含画面帧数量。
视频编码帧率(fps),即每秒钟要编码多少帧画面。编码帧率小于等于采集帧率。
数据传输速率(Kbps),即每秒传输的数据量。视频画面的分辨率和帧率越高,质量越高,同时要求的码率也越高。相同实时性要求下,码率越高,所要求的带宽越高。
本接口在引擎创建后即可调用,建议在调用 startVideoCapture 前,调用 setVideoCaptureConfig 设置视频采集参数。同一设备上的不同引擎使用相同的视频采集参数。
private void setVideoCaptureConfig() { String width = captureWidth.getText().toString(); String height = captureHeight.getText().toString(); String frameRate = captureFrameRate.getText().toString(); VideoCaptureConfig config = new VideoCaptureConfig(); // 采集偏好设置 为 manual 时,手动设置视频参数才会生效 config.capturePreference = VideoCaptureConfig.CapturePreference.MANUAL; config.width = width.isEmpty() ? 1920 : Integer.parseInt(width);// 采集宽度 config.height = height.isEmpty() ? 1080 : Integer.parseInt(height);// 采集高度 config.frameRate = frameRate.isEmpty() ? 30 : Integer.parseInt(frameRate);// 采集帧率 rtcVideo.setVideoCaptureConfig(config); }
三种采集参数模式说明如下:
Auto:(默认)自动设置采集参数。SDK 将根据下发配置,结合设备性能应用采集参数。此模式下调用本接口传入的分辨率和帧率不会生效。
Manual:手动设置采集参数,包括采集分辨率、帧率,如果设备不支持采集设置的分辨率,会优先选择接近的分辨率,采集后再缩放到目标分辨率。建议采集分辨率与编码分辨率相同,且为常见分辨率配置,避免视频帧的多次缩放。
AutoPerformance:采集参数与编码参数一致,即使用 setVideoEncoderConfig 中设置的参数进行采集。此模式下调用本接口传入的分辨率和帧率不会生效。
说明:设置视频采集参数,比如分辨率,或视频旋转角度(setVideoCaptureRotation)发生变化时会收到
onLocalVideoSizeChanged回调。
在进入 RTC 房间前后,你都可以调用 setVideoEncoderConfig 设置视频编码参数。建议在开启直播前设置视频发布参数,这样可以加快首帧出图。
private void setVideoEncoderConfig() { VideoEncoderConfig config = new VideoEncoderConfig(); config.width = 480; config.height = 640; config.frameRate = 10; config.maxBitrate = 1000; rtcVideo.setVideoEncoderConfig(config); }
设置视频编码的码率时,推荐设置为 -1 以使用 SDK 自动设定的码率。将上述参数设置为理想情况下的最大值。当视频因网络环境等原因无法达到设置的分辨率、帧率或码率的最大值时,SDK 会取最接近最大值的那个值。
视频的编码分辨率和帧率受限于采集分辨率和帧率,而且也并非越高越好。首先,高于采集画面的分辨率和帧率并不会使画面更加清晰或者更加流畅。同时,高分辨率和帧率需要更高的带宽来支撑。通话中使用高分辨率的视频费用也会更高。在编码码率恒定的前提下,帧率过高会降低视频的分辨率。
设置视频参数时,主要考虑的因素有屏幕尺寸、视频清晰度、以及宽带压力。比如,在一对一教学场景中,要求实时性高,同时老师和学生的窗口都比较大,要求较高的分辨率和帧率;如果是一对四,由于老师和学生的窗口都比较小,每路流的分辨率可以适当降低,对应的码率相应降低,以减少编解码的资源消耗和缓解下行带宽压力。
你应当根据场景需要,选择合适的视频发布参数。以下是一些常见场景的移动端推荐参数。
将下表中的宽高推荐值互换后,可以应用到 PC 端。例如 720 x 1280,对 PC 端来说是,1280 x 720。
| 分辨率 | 高(px) | 宽(px) | 帧率(fps) | 默认码率(kbps) | 推荐最高码率(kbps) | 推荐最低码率(kbps) |
|---|---|---|---|---|---|---|
| 蓝光(1080P) | 1080 | 1920 | 20 | 2500 | 3800 | 1000 |
| 超清(720P) | 720 | 1280 | 15 | 1200 | 1900 | 800 |
| 高清(540P) | 540 | 960 | 15 | 1000 | 1520 | 500 |
| 标清(480P) | 480 | 864 | 15 | 800 | 1260 | 320 |
单个主播的视频参数:
| 高(px) | 宽(px) | 帧率(fps) | 码率(kbps) |
|---|---|---|---|
| 540 | 960 | 15 | 1200 |
| 360 | 640 | 15 | 800 |
| 270 | 480 | 15 | 600 |
| 248 | 432 | 15 | 400 |
| 窗口 | 高(px) | 宽(px) | 帧率(fps) | 码率(kbps) |
|---|---|---|---|---|
| 大窗 | 360 | 640 | 15 | 800 |
| 小窗 | 320 | 360 | 15 | 400 |
| 窗口 | 高(px) | 宽(px) | 帧率(fps) | 码率(kbps) |
|---|---|---|---|---|
| 主播窗口 | 540 | 960 | 15 | 1200 |
| 观众窗口 | 240 | 240 | 15 | 360 |
| 布局类型 | 示意图 | 窗口 | 高(px) | 宽(px) | 帧率(fps) | 码率(kbps) |
|---|---|---|---|---|---|---|
| 1V6 | ![]() | 主播窗口 | 540 | 960 | 15 | 1200 |
| 嘉宾窗口 | 256 | 256 | 15 | 300 | ||
| 1V1 | ![]() | 单元窗口 | 360 | 360 | 15 | 800 |
| 1V2 | ![]() | 大窗口 | 360 | 640 | 15 | 800 |
| 小窗口 | 320 | 360 | 15 | 500 | ||
| 四宫格 | ![]() | 单元窗口 | 320 | 360 | 15 | 500 |
| 六宫格 | ![]() | 小窗口 | 240 | 320 | 15 | 400 |
| 九宫格 | ![]() | 小窗口 | 240 | 240 | 15 | 280 |
| 窗口 | 高(px) | 宽(px) | 帧率(fps) | 码率(kbps) |
|---|---|---|---|---|
| 大窗口 | 540 | 960 | 15 | 1200 |
| 小窗口 | 256 | 256 | 15 | 300 |
| 高(px) | 宽(px) | 帧率(fps) | 码率(kbps) |
|---|---|---|---|
| 540 | 720 | 15 | 1000 |
| 高(px) | 宽(px) | 帧率(fps) | 码率(kbps) |
|---|---|---|---|
| 368 | 640 | 15 | 800 |
从观看感受来看,视频的分辨率、码率和帧率当然是越大越好。但实际业务中,你必须考虑到业务需要,设备性能,网络环境,流量费用等实际情况,选择合适的视频发布参数方案。总体来说,较高的分辨率需要较高的码率来支撑;码率一定的情况下,帧率过高又会降低视频的分辨率。我们建议你使用 SDK 默认的视频编码码率。
你可以参考下表,根据设定的视频分辨率,选择实际业务中使用的帧率和码率:
| 分辨率 (宽 × 高) | 帧率 (fps) | 流畅优先时建议码率 (kbps) | 画质优先时建议码率 (kbps) | 游戏场景下建议码率(kbps) |
|---|---|---|---|---|
| 160 × 120 | 15 | 65 | 130 | / |
| 120 × 120 | 15 | 50 | 100 | / |
| 320 × 180 | 15 | 140 | 280 | / |
| 180 × 180 | 15 | 100 | 200 | / |
| 240 × 180 | 15 | 120 | 240 | / |
| 320 × 240 | 15 | 200 | 400 | / |
| 240 × 240 | 15 | 140 | 280 | / |
| 424 × 240 | 15 | 220 | 440 | / |
| 640 × 360 | 15 | 400 | 800 | / |
| 360 × 360 | 15 | 260 | 520 | / |
| 640 × 360 | 30 | 600 | 1200 | / |
| 360 × 360 | 30 | 400 | 800 | / |
| 480 × 360 | 15 | 320 | 640 | / |
| 480 × 360 | 30 | 490 | 980 | / |
| 640 × 480 | 15 | 500 | 1000 | / |
| 480 × 480 | 15 | 400 | 800 | / |
| 640 × 480 | 30 | 750 | 1500 | / |
| 480 × 480 | 30 | 600 | 1200 | / |
| 848 × 480 | 15 | 610 | 1220 | / |
| 848 × 480 | 30 | 930 | 1860 | / |
| 640 × 480 | 10 | 400 | 800 | / |
| 1280 × 720 | 15 | 1130 | 2260 | / |
| 1280 × 720 | 30 | 1710 | 3420 | / |
| 960 × 720 | 15 | 910 | 1820 | / |
| 960 × 720 | 30 | 1380 | 2760 | / |
| 1920 × 1080 | 15 | 2080 | 4160 | / |
| 1920 × 1080 | 30 | 3150 | 6300 | / |
| 1920 × 1080 | 60 | 4780 | 6500 | / |
| 2048 × 1080 | 60 | / | / | 8000 |
| 4096 × 2160 | 60 | / | / | 20000 |
调用 setLocalVideoCanvas 和 setRemoteVideoCanvas 设置本端和远端的视频流渲染视图模式。
支持三种视频渲染填充模式。SDK 会根据采集画面的分辨率和画布的分辨率,按照选中的填充模式渲染视频画面,参见 VideoCanvas。
视窗等比缩放,填满优先。
当视频尺寸与显示窗口宽高比不一致时,视频尺寸等比缩放,直至视窗被填满,多出的视频部分将被裁剪掉。
示例:

视窗等比缩放,视频帧内容全部显示优先。
当视频尺寸与显示窗口宽高比不一致时,视频尺寸等比缩放,优先保证视频内容全部显示。会把窗口未被填满的区域填充成背景颜色
示例:

视频帧自适应画布,视频尺寸非等比例缩放,把渲染窗口充满。在此过程中,视频帧的长宽比例可能会发生变化。
说明:表格中的 macOS API 接口为 Objective-C,而示例项目中的 macOS 项目使用的是 Windows SDK 中的 API 接口。
A:参考添加视频水印。
A:参考视频采集旋转方向。
A:参考镜像。