功能描述
在视频通话或视频互动直播场景中,视频画面是否清晰流畅,很大程度上决定着用户体验。
视频属性包含视频分辨率、帧率、码率等影响视频质量的参数设置。本文介绍如何使用 AR SDK 的 API 设置视频相关的属性,从而提升用户的视频使用体验。
示例项目
AR 在 GitHub 上提供已实现设置视频属性功能的开源示例项目。你可以下载体验并参考源代码。
实现方法
开始前请确保已在项目中实现了基本的音视频通信或直播功能。
分辨率、帧率、码率
AR SDK 通过如下参数设置视频编码的分辨率、帧率和码率。
dimensions
: 视频编码的分辨率 (px),默认值为 640 × 360。通常情况下,分辨率越高,视频的清晰度会越好。该参数的值不代表最终视频输出的方向。详情如下旋转方向
模式了解如何设置视频输出的方向模式。frameRate
: 视频编码的帧率 (fps),即每秒钟要编码多少帧画面,默认值为 15。通常情况下,帧率越大,画面越流畅。如果对视频流畅度要求较高,可以设为 20 或 25,但建议不要超过 30。bitrate
: 视频编码码率 (Kbps),默认值为STANDARD_BITRATE
,即标准码率模式。AR 会依据当前频道场景、分辨率、帧率为你设置一个最合适的- 码率。
- 视频的分辨率、码率和帧率并非越大越好,且彼此需要维持一个平衡的关系。较高的分辨率需要较高的码率来支撑;码率一定的情况下,帧率过高又会降低视频的分辨率。
- 上述参数设置的均为理想情况下的最大值。当视频因网络环境等原因无法达到设置的分辨率、帧率或码率的最大值时,会取最接近最大值的那个值。
你可以直接选择 SDK 预设的分辨率、帧率和码率值,也参考下表进行自定义。
视频属性参考表
视频能否达到 720P 的分辨率取决于设备的性能,在性能配备较低的设备上有可能无法实现。如果采用 720P 分辨率而设备性能跟不上,则有可能出现帧率过低的情况。
分辨率 (宽 × 高) | 帧率 (fps) | 基准码率 (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 |
常用分辨率、帧率、码率
通常来讲,视频参数的选择要根据产品实际情况来确定,比如,如果一对一教学场景中 ,老师和学生的窗口比较大,要求的分辨率会高一点,随之帧率和码率也高;如果是一对四, 老师和学生的窗口都比较小,分辨率可以低一点,对应的码率帧率也会低一点,以减少编解码的资源消耗和缓解下行带宽压力。一般可按下列场景中的推荐值进行设置。
- 二人视频通话场景:
- 分辨率 320 × 240、帧率 15 fps、码率 200 Kbps
- 分辨率 640 × 360、帧率 15 fps、码率 400 Kbps
- 多人视频通话场景:
- 分辨率 160 × 120、帧率 15 fps、码率 65 Kbps
- 分辨率 320 × 180、帧率 15 fps、码率 140 Kbps
- 分辨率 320 × 240、帧率 15 fps、码率 200 Kbps
旋转方向模式
在视频旋转场景中,我们主要关注采集端和播放端的行为。其中:
- 采集端采集并输出视频图像,以及视频相对于 Status Bar 的位置,即旋转信息。
- 播放端渲染接收到的视频图像,并根据接收到的旋转信息,结合自身 Status Bar 的相对位置,旋转视频。
为防止视频因旋转出现大头、缩放或剪切的问题,AR SDK 在 setVideoEncoderConfiguration
中还提供了一个 orientationMode
参数。你可以通过这个参数,结合视频场景需要,获取想要的视频渲染效果。
降级偏好
为保证弱网下用户的视频体验,AR SDK 还提供了 degradationPrefer
参数,来设置带宽受限时视频编码的降级偏好。
- 降低视频帧率以保证清晰度:将参数设为
MAINTAIN_QUALITY
。 - 降低视频清晰度以保证流畅度:将参数设为
MAINTAIN_FRAMERATE
。
镜像模式
默认情况下,SDK 在编码时不对视频作镜像操作。你可以通过 mirrorMode
参数来设置视频编码的镜像模式,影响远端用户看到的视频画面。
最低编码帧率、码率
如果你的场景中对视频质量或传输帧率有特殊的需求,还可以通过如下两个参数进行设置。
minFrameRate
: 视频最低编码帧率 (fps)。可以与degradationPrefer
中的MAINTAIN_QUALITY
选项搭配使用,用于平衡帧率和视频清晰度。minFrameRate
较低时,一旦带宽不足,帧率下降幅度较大,画质清晰度受影响比较小;minFrameRate
较高时,一旦带宽不足,帧率下降幅度有限,视频清晰度受影响比较大。minBitrate
: 视频最低编码码率 (Kbps)。网络情况会影响视频编码器输出的视频。该参数可强制视频编码器输出高质量的视频帧;注意在网络状况不佳的情况下,码率过高可能会影响视频播放的流畅度。
minFrameRate
和 minBitrate
的默认值经实验且能满足大部分场景的需求,因此 AR 建议你不要修改。
示例代码
你可以参考如下示例代码对 setVideoEncoderConfiguration
中的各参数进行设置:
<void> setVideoEncoderConfiguration(VideoEncoderConfiguration config) {
return _invokeMethod(
'setVideoEncoderConfiguration', {'config': config.toJson()});
}
func setVideoEncoderConfiguration(_ params: NSDictionary, _ callback: Callback) {
callback.code(engine?.setVideoEncoderConfiguration(mapToVideoEncoderConfiguration(params["config"] as! Dictionary)))
}
Future
开发注意事项
setVideoEncoderConfiguration
中各参数设置的是理想值。AR SDK 会根据实时网络环境和设备,对设置的参数作自适应调整,通常会下调参数。- 本文中各参数的设置可能会影响计费。如果因自适应产生参数下调,计费按用户实际订阅的视频分辨率为准。