在视频通话或视频互动直播场景中,视频画面是否清晰流畅,很大程度上决定着用户体验。
视频属性包含视频分辨率、帧率、码率等影响视频质量的参数设置。本文介绍如何使用声网 SDK 的 API 设置视频相关的属性,从而提升用户的视频使用体验。
声网在 GitHub 上提供已实现设置视频属性功能的开源示例项目。你可以下载体验并参考源代码。
开始前请确保已在项目中实现了基本的音视频通信或直播功能。
声网 SDK 提供 setVideoEncoderConfiguration
方法,支持对视频编码属性进行设置。setVideoEncoderConfiguration
可以在初始化 RtcEngine
后的任何阶段调用。如果在加入频道后不需要重新设置视频编码属性,声网建议在 enableVideo
前调用,以加快首帧出图的时间。
声网 SDK 通过如下参数设置视频编码的分辨率、帧率和码率。
dimensions
: 视频编码的分辨率 (px),默认值为 640 × 360。通常情况下,分辨率越高,视频的清晰度会越好。该参数的值不代表最终视频输出的方向。点击旋转方向模式了解如何设置视频输出的方向模式。frameRate
: 视频编码的帧率 (fps),即每秒钟要编码多少帧画面,默认值为 15。通常情况下,帧率越大,画面越流畅。如果对视频流畅度要求较高,可以设为 20 或 25,但建议不要超过 30。bitrate
: 视频编码码率 (Kbps),默认值为 STANDARD_BITRATE
,即标准码率模式。声网会依据当前频道场景、分辨率、帧率为你设置一个最合适的码率。你可以直接选择 SDK 预设的分辨率、帧率和码率值,也参考下表进行自定义。
视频属性参考表
分辨率 (宽 × 高) | 帧率 (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 |
常用分辨率、帧率、码率
通常来讲,视频参数的选择要根据产品实际情况来确定,比如,如果一对一教学场景中 ,老师和学生的窗口比较大,要求的分辨率会高一点,随之帧率和码率也高;如果是一对四, 老师和学生的窗口都比较小,分辨率可以低一点,对应的码率帧率也会低一点,以减少编解码的资源消耗和缓解下行带宽压力。一般可按下列场景中的推荐值进行设置。
在视频旋转场景中,我们主要关注采集端和播放端的行为。其中:
为防止视频因旋转出现大头、缩放或剪切的问题,声网 SDK 在 setVideoEncoderConfiguration
中还提供了一个 orientationMode
参数。你可以通过这个参数,结合视频场景需要,获取想要的视频渲染效果。
声网在 orientationMode
参数中,提供了 ORIENTATION_MODE_ADAPTIVE
、ORIENTATION_MODE_FIXED_LANDSCAPE
和 ORIENTATION_MODE_FIXED_PORTRAIT
三种方向模式。
ORIENTATION_MODE_ADAPTIVE
该模式下 SDK 输出的视频方向与采集到的视频方向一致。接收端会根据收到的视频旋转信息对视频进行旋转。该模式适用于接收端可以调整视频方向的场景:
下图演示了后置摄像头采集下,ORIENTATION_MODE_ADAPTIVE 模式分别在 UI 锁定和 UI 不锁定情况下的行为:
UI 锁定时(或 UI 不锁定但客户端关闭了屏幕自动旋转功能时),Status Bar 与屏幕的相对方向保持不变,和手机的重力感应无关(比如微信)。此时,视频和屏幕的相对方向在采集端和播放端始终一致:
采集端横屏时
采集端竖屏时
UI 不锁定且客户端开启屏幕自动旋转时,Status Bar 总是处于垂直地面方向的正上方,和屏幕的朝向无关(比如 Facetime)。此时,视频和重力的相对方向在采集端和播放端始终一致:
采集端横屏时
采集端竖屏时
ORIENTATION_MODE_FIXED_LANDSCAPE
该模式下,SDK 保证输出的视频相对 Status Bar 总是处于横屏模式;如果采集到的视频是竖屏模式,则相对于播放端 Status bar 平行方向的画面会被裁剪。
下图演示了后置摄像头采集下,FixedLandscape 模式在采集端处于不同角度时的行为:
采集到的视频是横屏模式,此时采集端未对视频进行裁剪
采集到的视频是竖屏模式,此时采集端对视频进行裁剪,使其成为横屏画面。图中红色虚线部分演示 SDK 对采集到的图像裁剪后留下的部分。
ORIENTATION_MODE_FIXED_PORTRAIT
该模式下,SDK 保证输出的视频相对 Status Bar 总是处于竖屏模式;如果采集到的视频是横屏模式,则相对于播放端 Status bar 垂直方向的画面会被裁剪。
下图演示了后置摄像头采集下,FIXED_PORTRAIT 模式在采集端处于不同角度时的行为:
采集到的视频是竖屏模式,此时采集端未对视频进行裁剪。
采集到的视频是横屏模式,此时采集端对视频进行裁剪,使其成为竖屏画面。图中红色虚线部分演示 SDK 对采集到的图像裁剪后留下的部分。
为保证弱网下用户的视频体验,声网 SDK 还提供了 degradationPrefer
参数,来设置带宽受限时视频编码的降级偏好。
默认情况下,SDK 在编码时不对视频作镜像操作。你可以通过 mirrorMode
参数来设置视频编码的镜像模式,影响远端用户看到的视频画面。
如果你的场景中对视频质量或传输帧率有特殊的需求,还可以通过如下两个参数进行设置。
minFrameRate
: 视频最低编码帧率 (fps)。可以与 degradationPrefer
中的 MAINTAIN_QUALITY
选项搭配使用,用于平衡帧率和视频清晰度。minFrameRate
较低时,一旦带宽不足,帧率下降幅度较大,画质清晰度受影响比较小;minFrameRate
较高时,一旦带宽不足,帧率下降幅度有限,视频清晰度受影响比较大。minBitrate
: 视频最低编码码率 (Kbps)。网络情况会影响视频编码器输出的视频。该参数可强制视频编码器输出高质量的视频帧;注意在网络状况不佳的情况下,码率过高可能会影响视频播放的流畅度。minFrameRate
和 minBitrate
的默认值经实验且能满足大部分场景的需求,因此声网建议你不要修改。你可以参考如下示例代码对 setVideoEncoderConfiguration
中的各参数进行设置:
// 根据用户在界面的选择设置视频编码的分辨率、帧率、码率与横竖屏方向模式
VideoEncoderConfiguration.VideoDimensions value = VD_640x360;
try {
Field tmp = VideoEncoderConfiguration.class.getDeclaredField(dimension.getSelectedItem(toString());
tmp.setAccessible(true);
value = (VideoEncoderConfiguration.VideoDimensions) tmp.get(null);
} catch (NoSuchFieldException e) {
Log.e("Field", "Can not find field " + dimension.getSelectedItem().toString());
} catch (IllegalAccessException e) {
Log.e("Field", "Could not access field " + dimension.getSelectedItem().toString());
engine.setVideoEncoderConfiguration(new VideoEncoderConfiguration(
value,
VideoEncoderConfiguration.FRAME_RATE.valueOf(framerate.getSelectedItem().toString()),
Integer.valueOf(et_bitrate.getText().toString()),
VideoEncoderConfiguration.ORIENTATION_MODE.valueOf(orientation.getSelectedItem().toStri())
));
setVideoEncoderConfiguration
中各参数设置的是理想值。声网 SDK 会根据实时网络环境和设备,对设置的参数作自适应调整,通常会下调参数。