在不同的视频通话场景中,视频画面大小、对视频清晰度和流畅度的要求,网络带宽往往各不相同,你需要根据实际情况,配置合适的视频配置参数。
使用 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(); config.capturePreference = VideoCaptureConfig.CapturePreference.MANUAL; if (config.capturePreference == VideoCaptureConfig.CapturePreference.MANUAL) { // 采集偏好设置 为 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:参考镜像。