设置视频属性
更新时间: 2024/09/18 16:26:13
不同场景对于视频清晰度、流畅性等方面的要求各有不同,您需要根据场景调整合适的分辨率、码率、帧率等,以便给用户最优的通话体验。
功能描述
NERTC SDK 支持调用 setVideoConfig
方法的 config
和 type
参数,自定义设置主流和辅流的视频编码属性,包括分辨率、码率、帧率、带宽受限时的适应性偏好等。
-
degradation_preference
:设置带宽受限时视频编码的适应性偏好。 -
orientation_mode
:设置本地视频编码的旋转方向模式。 -
mirror_mode
:设置视频编码的镜像模式。
前提条件
请确保已在项目中实现了基本的音视频通信或直播功能。
注意事项
- 本文中各参数的设置可能会影响计费。
- NERTC SDK 会根据实时网络环境,对设置的参数作自适应调整,通常会下调参数。
- NERTC SDK 支持在加入房间通话中后,您根据实际场景变化动态调用
setVideoConfig
方法。 setVideoConfig
为全量参数配置接口,重复调用此接口时,SDK 会刷新此前的所有参数配置,以最新的传参为准。所以每次修改配置时都需要设置所有参数,未设置的参数将取默认值。
设置视频编码分辨率、码率和帧率
您可以通过 setVideoConfig
方法中的如下参数,自定义视频编码的分辨率、码率和帧率。
参数 | 说明 |
---|---|
width 和 height |
视频编码的分辨率。单位为 px 。用来衡量编码质量,通常情况下分辨率越高,视频越清晰。 默认为 640 x 360,取值范围为64 x 64 ~ 1920 x 1080,如果设置取值范围以外的数值,则保持默认设置,即 640 x 360。 |
frameRate |
视频编码帧率(fps)。指每秒钟编码多少帧画面。
|
bitrate |
视频码率(Bitrate),单位为 kbps。指每秒钟编码器输出多少 Kbit 的编码后的二进制数据。 推荐使用默认码率, SDK 会根据场景属性、分辨率和帧率自动设置合适的码率。若您对画面清晰度有更高的要求,推荐将码率提升至默认码率的 1.2 倍。 |
此处设置的数值均为理想情况下的最大值,实际场景中,如果视频引擎因网络环境或设备采集能力等原因无法达到设置的分辨率、帧率或码率的最大值时,会根据设备采集能力自动向下取值。
视频的分辨率、码率和帧率并不是越高越好,三者之间需要维持一个平衡的映射关系关系,您可以参考分辨率、帧率和码率参照表设置分辨率和码率。
典型场景的推荐配置
典型场景的视频参数推荐配置请参见音视频参数配置推荐。
设置带宽受限的适应性偏好
在弱网环境下,视频的清晰度和流畅度可能无法兼顾,为保证音视频通话或互动直播场景下的视频体验,您可以通过 degradation_preference
参数设置带宽受限时视频编码的适应性偏好。
参数 |
描述 |
---|---|
kNERtcDegradationBalanced | 在编码帧率和视频质量之间保持平衡。 |
kNERtcDegradationDefault | 根据场景模式调整适应性偏好。 通信场景中,选择 kNERtcDegradationBalanced 模式,在编码帧率和视频质量之间保持平衡。 直播场景中,选择 kNERtcDegradationMaintainQuality 模式,降低编码帧率以保证视频质量。 |
kNERtcDegradationMaintainFramerate | 流畅优先,降低视频质量以保证编码帧率。在弱网环境下,降低视频清晰度以保证视频流畅,此时画质降低,画面会变得模糊,但可以保持视频流畅。 |
kNERtcDegradationMaintainQuality | 清晰优先,降低编码帧率以保证视频质量。在弱网环境下,降低视频帧率以保证视频清晰,此时可能会出现一定卡顿。 |
设置旋转方向模式
旋转方向模式指移动端视频是横屏还是竖屏显示。采集端采集图像时,同时收集视频的旋转方向模式信息;播放端将接收到的视频图像进行渲染,并旋转方向模式信息对应地旋转视频,以达到和采集端表现一致。
NERTC SDK 支持根据 orientation_mode
参数设置本地视频编码的旋转方向模式,使接收端的视频展示为指定的方向效果。其中,orientation_mode
参数中提供了 kNERtcVideoOutputOrientationModeAdaptative(自适应)、kNERtcVideoOutputOrientationModeFixedLandscape(风景) 和 kNERtcVideoOutputOrientationModeFixedPortrait (肖像) 三种方向模式。
-
kNERtcVideoOutputOrientationModeAdaptative
自适应模式下,SDK 输出的视频方向与采集到的视频方向一致。接收端会根据收到的视频旋转信息对视频进行旋转。该模式适用于接收端可以自主调整视频方向的场景。
-
kNERtcVideoOutputOrientationModeFixedLandscape
该模式下 SDK 固定输出横屏模式的视频。如果采集到的视频是竖屏模式,则视频编码器会对其进行裁剪。该模式适用于当接收端无法调整视频方向时,例如旁路推流场景。
-
kNERtcVideoOutputOrientationModeFixedPortrait
该模式下 SDK 固定输出竖屏模式的视频,如果采集到的视频是横屏模式,则视频编码器会对其进行裁剪。该模式适用于当接收端无法调整视频方向时,例如旁路推流场景。
若您集成的是 V4.6.0 之前的版本,设置旋转方向后,只会影响远端用户看到的视频画面;若您集成的是 V4.6.0 及之后的版本,设置旋转方向后,会同时影响本端用户的预览画面和远端用户看到的视频画面。
设置镜像模式
您可以通过 mirror_mode
参数来设置视频编码的镜像模式,影响远端用户看到的视频画面。
设置视频属性时默认关闭镜像模式,即 NERtcVideoMirrorMode
类型的默认值为 kNERtcVideoMirrorModeDisabled
。
示例代码
//设置本地视频编码的镜像模式,即本地发送视频的镜像模式,只影响远端用户看到的视频画面。
nertc::NERtcVideoStreamType type = nertc::NERtcVideoStreamType::kNERTCVideoStreamMain;//以主流为例
nertc::NERtcVideoConfig config;
memset(&config, 0, sizeof(config));
nertc::NERtcVideoMirrorMode mirroeMode = kNERtcVideoMirrorModeEnabled;
config.mirror_mode = mirroeMode;
coreEngine->setVideoConfig(type, config);
NERTC SDK 还支持设置视频画布的镜像模式,即画面是否左右翻转。本地设置的视频镜像模式仅影响本地用户所见,不影响远端用户所见。
- 若您需要设置本地视频镜像模式,请调用
setLocalVideoMirrorMode
或setupLocalVideoCanvas
方法,将mirror_mode
参数设置为kNERtcVideoMirrorModeEnabled
。 - 若您需要设置远端视频镜像模式,请调用
setupRemoteVideoCanvas
方法,将mirror_mode
参数设置为kNERtcVideoMirrorModeEnabled
。
示例代码
//本地的视频镜像模式仅影响本地用户所见,不影响远端用户所见。 方法1
nertc::NERtcVideoCanvas canvas;
memset(&canvas, 0, sizeof(canvas));
canvas.window = window;
canvas.mirror_mode = kNERtcVideoMirrorModeEnabled;
coreEngine->setupLocalVideoCanvas(canvas);
//本地的视频镜像模式,仅影响本地用户所见,不影响远端用户所见。 方法2
nertc::NERtcVideoStreamType type = nertc::NERtcVideoStreamType::kNERTCVideoStreamMain;//以主流为例
nertc::NERtcVideoMirrorMode mirroeMode = kNERtcVideoMirrorModeEnabled;
coreEngine->setLocalVideoMirrorMode(mirrorMode);
//设置远端用户的视频镜像
nertc::NERtcVideoCanvas canvas;
memset(&canvas, 0, sizeof(canvas));
canvas.window = window;
canvas.mirror_mode = kNERtcVideoMirrorModeEnabled;
coreEngine->setupRemoteVideoCanvas(uid, canvas);
示例项目源码
网易云信提供ProfileConfig 示例项目源码,您可以参考该源码配置音视频属性。
示例代码
C++//以设置主流为例
NERtcVideoStreamType kNERTCVideoStreamMain;
NERtcVideoConfig videoConfig;
videoConfig.max_profile = kNERtcVideoProfileHD1080P; // width & height不为0,该字段设置无效。
videoConfig.width = 900;
videoConfig.height = 600;
videoConfig.crop_mode_ = kNERtcVideoCropModeDefault;
videoConfig.framerate = 24; // 设置24帧采集
videoConfig.min_framerate = 15; // 设置最低15帧采集
videoConfig.bitrate = 0;
videoConfig.min_bitrate = 0;
videoConfig.degradation_preference = kNERtcDegradationDefault;
nrtc_engine_->setVideoConfig(type,videoConfig); //设置本地视频参数
nrtc_engine_->enableDualStreamMode(true); //设置是否支持小流
相关参考
分辨率、帧率和码率参照表
在大多数场景下,您可以根据实际业务场景中的视频窗口的大小去配置分辨率、帧率、码率,以控制带宽压力及编解码的资源消耗。 在自定义视频编码参数的过程中,您也可以参考下表对这些参数进行自定义配置。
下表中的视频参数推荐仅适用于 Native 端,即 Android、iOS、macOS、macOS 平台。
分辨率 | 帧率(fps) | 通信场景码率(kbps) | 直播场景码率(kbps) |
---|---|---|---|
90 x 90 | 30 | 49 | 73 |
90 x 90 | 15 | 32 | 48 |
120 x 90 | 30 | 61 | 91 |
120 x 90 | 15 | 40 | 60 |
120 x 120 | 30 | 75 | 113 |
120 x 120 | 15 | 50 | 75 |
160 x 90 | 30 | 75 | 113 |
160 x 90 | 15 | 50 | 75 |
160 x 120 | 30 | 94 | 141 |
160 x 120 | 15 | 62 | 93 |
180 x 180 | 30 | 139 | 208 |
180 x 180 | 15 | 91 | 137 |
240 x 180 | 30 | 172 | 259 |
240 x 180 | 15 | 113 | 170 |
240 x 240 | 30 | 214 | 321 |
240 x 240 | 15 | 141 | 212 |
320 x 180 | 30 | 214 | 321 |
320 x 180 | 15 | 141 | 212 |
320 x 240 | 30 | 259 | 389 |
320 x 240 | 15 | 175 | 263 |
360 x 360 | 30 | 393 | 590 |
360 x 360 | 15 | 259 | 389 |
424 x 240 | 15 | 217 | 325 |
480 x 360 | 30 | 488 | 732 |
480 x 360 | 15 | 322 | 483 |
480 x 480 | 30 | 606 | 909 |
480 x 480 | 15 | 400 | 600 |
640 x 360 | 30 | 606 | 909 |
640 x 360 | 15 | 400 | 600 |
640 x 480 | 30 | 752 | 1128 |
640 x 480 | 15 | 496 | 744 |
720 x 720 | 30 | 1113 | 1670 |
720 x 720 | 15 | 734 | 1102 |
848 x 480 | 30 | 929 | 1394 |
848 x 480 | 15 | 613 | 919 |
960 x 720 | 30 | 1382 | 2073 |
960 x 720 | 15 | 911 | 1367 |
1080 x 1080 | 30 | 2046 | 3069 |
1080 x 1080 | 15 | 1350 | 2025 |
1280 x 720 | 30 | 1714 | 2572 |
1280 x 720 | 15 | 1131 | 1697 |
1440 x 1080 | 30 | 2538 | 3808 |
1440 x 1080 | 15 | 1675 | 2512 |
1920 x 1080 | 30 | 3150 | 4725 |
1920 x 1080 | 15 | 2078 | 3117 |
常见问题
分辨率是越高越好吗?
分辨率不是越高越好,较高的分辨率需要有较高的码率来支撑。高分辨率、高码率会提供高质量的视频,但同时会增加对宽带的压力,可能导致视频卡顿。建议您根据实际场景选择对应的分辨率,具体请参考音视频参数配置推荐,如果需要自定义分辨率,请参考分辨率、帧率和码率参照表设置合理的值。