You need to enable JavaScript to run this app.
导航
设置视频发布参数
最近更新时间:2024.05.17 10:13:42首次发布时间:2021.07.21 14:29:24

在不同的视频通话场景中,视频画面大小、对视频清晰度和流畅度的要求,网络带宽往往各不相同,你需要根据实际情况,配置合适的视频配置参数。

名词解释

使用 RTC SDK 采集视频到本地预览或远端渲染的过程中,可以设置的参数如下图。
alt

分辨率

视频的 宽(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 会取最接近最大值的那个值。

为应对网络或硬件性能波动,RTC 通常建议你使用 推送多路流性能回退 等功能保障网络或硬件性能不佳时的通信体验。

视频的编码分辨率和帧率受限于采集分辨率和帧率,而且也并非越高越好。首先,高于采集画面的分辨率和帧率并不会使画面更加清晰或者更加流畅。同时,高分辨率和帧率需要更高的带宽来支撑。通话中使用高分辨率的视频费用也会更高。在编码码率恒定的前提下,帧率过高会降低视频的分辨率。
设置视频参数时,主要考虑的因素有屏幕尺寸、视频清晰度、以及宽带压力。比如,在一对一教学场景中,要求实时性高,同时老师和学生的窗口都比较大,要求较高的分辨率和帧率;如果是一对四,由于老师和学生的窗口都比较小,每路流的分辨率可以适当降低,对应的码率相应降低,以减少编解码的资源消耗和缓解下行带宽压力。

你应当根据场景需要,选择合适的视频发布参数。以下是一些常见场景的移动端推荐参数。

将下表中的宽高推荐值互换后,可以应用到 PC 端。例如 720 x 1280,对 PC 端来说是,1280 x 720。

单人直播

分辨率高(px)宽(px)帧率(fps)默认码率(kbps)推荐最高码率(kbps)推荐最低码率(kbps)
蓝光(1080P)1080192020250038001000
超清(720P)72012801512001900800
高清(540P)5409601510001520500
标清(480P)480864158001260320

双人直播(双人 PK)

单个主播的视频参数:

高(px)宽(px)帧率(fps)码率(kbps)
540960151200
36064015800
27048015600
24843215400

1V2 PK 或 1V3 PK

窗口高(px)宽(px)帧率(fps)码率(kbps)
大窗36064015800
小窗32036015400

观众连麦

窗口高(px)宽(px)帧率(fps)码率(kbps)
主播窗口540960151200
观众窗口24024015360

视频聊天室

布局类型示意图窗口高(px)宽(px)帧率(fps)码率(kbps)
1V6主播窗口540960151200
嘉宾窗口25625615300
1V1单元窗口36036015800
1V2大窗口36064015800
小窗口32036015500
四宫格单元窗口32036015500
六宫格小窗口24032015400
九宫格小窗口24024015280

视频房 KTV

窗口高(px)宽(px)帧率(fps)码率(kbps)
大窗口540960151200
小窗口25625615300

语音房 KTV

高(px)宽(px)帧率(fps)码率(kbps)
540720151000

一起看抖音

高(px)宽(px)帧率(fps)码率(kbps)
36864015800

参数对照表

从观看感受来看,视频的分辨率、码率和帧率当然是越大越好。但实际业务中,你必须考虑到业务需要,设备性能,网络环境,流量费用等实际情况,选择合适的视频发布参数方案。总体来说,较高的分辨率需要较高的码率来支撑;码率一定的情况下,帧率过高又会降低视频的分辨率。我们建议你使用 SDK 默认的视频编码码率。

你可以参考下表,根据设定的视频分辨率,选择实际业务中使用的帧率和码率:

分辨率 (宽 × 高)帧率 (fps)流畅优先时建议码率 (kbps)画质优先时建议码率 (kbps)游戏场景下建议码率(kbps)
160 × 1201565130/
120 × 1201550100/
320 × 18015140280/
180 × 18015100200/
240 × 18015120240/
320 × 24015200400/
240 × 24015140280/
424 × 24015220440/
640 × 36015400800/
360 × 36015260520/
640 × 360306001200/
360 × 36030400800/
480 × 36015320640/
480 × 36030490980/
640 × 480155001000/
480 × 48015400800/
640 × 480307501500/
480 × 480306001200/
848 × 480156101220/
848 × 480309301860/
640 × 48010400800/
1280 × 7201511302260/
1280 × 7203017103420/
960 × 720159101820/
960 × 7203013802760/
1920 × 10801520804160/
1920 × 10803031506300/
1920 × 10806047806500/
2048 × 108060//8000
4096 × 216060//20000

设置视频渲染视图模式

调用 setLocalVideoCanvassetRemoteVideoCanvas 设置本端和远端的视频流渲染视图模式。
支持三种视频渲染填充模式。SDK 会根据采集画面的分辨率和画布的分辨率,按照选中的填充模式渲染视频画面,参见 VideoCanvas

默认值 RenderModeHidden

视窗等比缩放,填满优先。
当视频尺寸与显示窗口宽高比不一致时,视频尺寸等比缩放,直至视窗被填满,多出的视频部分将被裁剪掉。
示例:

  • 发送端宽高比为 9:16
  • 接收端渲染窗口宽高比为 16:9

alt

RenderModeFit

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

  • 发送端宽高比为 9:16
  • 接收端渲染窗口宽高比为 16:9

alt

RenderModeFill

视频帧自适应画布,视频尺寸非等比例缩放,把渲染窗口充满。在此过程中,视频帧的长宽比例可能会发生变化。

示例项目

API 参考

说明:表格中的 macOS API 接口为 Objective-C,而示例项目中的 macOS 项目使用的是 Windows SDK 中的 API 接口。

平台AndroidiOSmacOSWindowsLinuxElectronFlutterUnityWeb
设置视频采集参数setVideoCaptureConfigsetVideoCaptureConfig:setVideoCaptureConfig:setVideoCaptureConfigsetVideoCaptureConfigsetVideoCaptureConfigsetVideoCaptureConfigSetVideoCaptureConfig
设置单路视频编码参数setVideoEncoderConfig(maxSolution)setMaxVideoEncoderConfig:setMaxVideoEncoderConfig:setVideoEncoderConfig(max_solution)setVideoEncoderConfig(max_solution)setMaxVideoEncoderConfigsetMaxVideoEncoderConfigSetVideoEncoderConfig1setVideoEncoderConfig
分别设置每路视频流编码参数setVideoEncoderConfig(channelSolutions)setVideoEncoderConfig:setVideoEncoderConfig:setVideoEncoderConfig(channel_solutions, solution_num)setVideoEncoderConfig(channel_solutions, solution_num)setVideoEncoderConfigsetVideoEncoderConfig
设置本地视频渲染视图模式setLocalVideoCanvassetLocalVideoCanvas:withCanvas:setLocalVideoCanvas:withCanvas:setLocalVideoCanvassetLocalVideoCanvassetupLocalVideosetLocalVideoPlayer
设置远端视频渲染视图模式setRemoteVideoCanvassetRemoteVideoCanvas:withCanvas:setRemoteVideoCanvas:withCanvas:setRemoteVideoCanvassetRemoteVideoCanvassetupRemoteVideosetRemoteVideoPlayer

常见问题

Q1:如何设置水印参数?

A:参考添加视频水印

Q2:如何设置视频旋转参数?

A:参考视频采集旋转方向

Q3:如何设置视频镜像参数?

A:参考镜像