互动视频
  • iOS : Objective-C
  • Android
  • macOS
  • Windows
  • Linux
  • Web
  • 小程序
  • Electron
  • 概述
  • 限制说明
  • SDK 下载
  • 快速开始
  • 常用功能
  • 推拉流进阶
  • 视频进阶
  • 音频进阶
  • 其他功能
  • 废弃接口
  • API 文档
  • 常见错误码
  • 常见问题
  • AI教育
  • KTV 合唱
  • 视频直播
  • 视频通话
  • 游戏直播
  • 直播答题
  • 娃娃机
  • 文档中心
  • 互动视频
  • 视频进阶
  • 分层视频编码

分层视频编码

更新时间:2024-01-08 17:46

1 功能简介

1.1 分层视频编码的应用场景

当开发者(连麦/混流)业务中出现以下情况时,我们推荐使用 SDK 的分层视频编码功能:

  1. 需要不同终端显示不同质量的视频流。
  2. 需要在较差的网络环境中保持连麦的流畅。
  3. 需要根据网络状态自适应拉取视频流的质量。

1.2 什么是分层视频编码

分层视频编码产生的码流中包含多个子码流,子码流分为基本层和扩展层,各层具有不同的码率,帧率和分辨率,基本层拥有最基本的视频质量,后面每一个扩展层都是对上一层的补充,拉流端可以根据自己实际的网络环境来选择解码几路子码流。

1.3 分层视频编码的优缺点

优点

  • 分层视频编码可以根据需要产生不同的码流或者提取出不同的码流,使用分层视频编码实现一次编码比用普通编码方式编码多次更高效。
  • 分层视频编码应用更灵活。
  • 分层视频编码网络适应性更强。

缺点

  • 压缩效率稍低:在同样的条件下,分层视频编码比普通编码方式的压缩效率要低20%左右,也就是说要达到和普通编码方式相同的视频质量,分层视频编码的码率要比普通编码方式多20%,分层数越多,效率下降越多。(目前SDK只支持1路基本层和1路扩展层)
  • 编码效率低:分层视频编码的在同样的条件下,比普通编码方式的编码计算复杂度高,所以编码效率相比普通编码方式约低10%。
  • 不支持硬件编码:分层视频编码不支持硬件编码,对CPU的性能负担较大,支持硬件解码。

1.4 注意事项

分层视频编码使用的是Zego的私有协议,仅限于连麦/混流方使用,在此以连麦为例,连麦系统架构图见下方链接。

当A与B连麦时,A、B分别推一路流给ZegoServer,又分别从ZegoServer拉取对方的流,这里如果推流方推流时设置了开启分层视频编码,则拉流方就依据拉流分层设置拉取对应的分层(默认为Auto,即根据网络状态调整拉取的分层)。同时ZegoServer会将双方推的两条使用私有协议的流经过处理转换成CDN上支持的协议并推到CDN上,观众拉取到的实际上是ZegoServer推到CDN上的流,所以不支持分层解码(相关拉流设置无效)。

2 实现步骤

相关功能的 Demo 源码,请联系 ZEGO 技术支持获取。

接口使用流程如下

  • 推流方 开启分层视频编码 -> 开始推流
  • 拉流方 开始拉流 -> 设置拉取的分层

2.1 推流方

开启分层视频编码的接口位于ZegoLiveRoomApi-Publisher.h头文件中,推流前调用即可。如下所示:

ZegoLiveRoomApi-Publisher.h

/**
 设置选用分层编码

 @param codecId 是否选用分层编码
 @param channel 选择推流通道
 @return true 成功,false 失败
 @discussion 设置选用分层编码,在InitSDK后,推流前调用有效
 */
- (bool)setVideoCodecId:(ZegoVideoCodecAvc)codecId ofChannel:(ZegoAPIPublishChannelIndex)channel;

其中 ZegoVideoCodecAvc 指定了推流是否启用分层解码:

/** 分层编码 */
typedef enum {
    /** 不支持分层编码 */
    VIDEO_CODEC_DEFAULT = 0,
    /** 分层编码 要达到和VIDEO_CODEC_DEFAULT相同的编码质量,建议码率和VIDEO_CODEC_DEFAULT相比增加20%左右 */
    VIDEO_CODEC_MULTILAYER = 1
} ZegoVideoCodecAvc;

然后开始推流。

2.2 拉流方

先开始拉流。

设置拉取视频的分层的接口位于ZegoLiveRoomApi-Player.h头文件中,拉流后调用即可,拉流后可以多次调用activateVideoPlayStream动态切换拉取的视频分层。如下所示:

ZegoLiveRoomApi-Player.h

/**
 拉流是否接收视频数据

 @param streamID 播放流 ID
 @param active true 接收,false 不接收
 @param videoLayer 视频分层类型
 @return 0 成功,否则失败
 @discussion 仅拉 UDP 流有效,必须在拉流后调用才有效
 */
- (int)activateVideoPlayStream:(NSString *)streamID active:(bool)active videoLayer:(VideoStreamLayer)videoLayer;

其中VideoStreamLayer指定了拉取的视频分层类型:

/** 视频分层类型 */
typedef enum {
    /**< 根据网络状态选择图层  */
    VideoStreamLayer_Auto = -1,
    /**< 指定拉基本层(小分辨率) */
    VideoStreamLayer_BaseLayer = 0,
    /**< 指定拉扩展层(大分辨率)  */
    VideoStreamLayer_ExtendLayer = 1
} VideoStreamLayer;

2.3 弱网环境

为测试拉流方根据网络状态选择图层的 VideoStreamLayer_Auto 分层类型,可搭建弱网环境并设置弱网环境相关优化配置。

2.3.1 弱网环境相关优化配置

SDK中弱网优化相关的 API 有:

ZegoLiveRoomApi-Publisher.h

/**
 设置延迟模式

 @param mode 延迟模式,默认 ZEGOAPI_LATENCY_MODE_NORMAL
 @discussion 在推流前调用
 */
- (void)setLatencyMode:(ZegoAPILatencyMode)mode;

/**
 是否开启流量控制

 @param enable true 开启;false 关闭。默认开启流量控制,property 为 ZEGOAPI_TRAFFIC_CONTROL_ADAPTIVE_FPS
 @param properties 流量控制属性 (帧率,分辨率)可以多选, 参考ZegoAPITrafficControlProperty定义
 @discussion enable设置为false时,properties参数会被忽略
 @discussion 在推流前调用,在纯 UDP 方案才可以调用此接口
 */
- (void)enableTrafficControl:(bool)enable properties:(NSUInteger)properties;

在弱网环境可酌情选择开启以上两个推流配置优化推流。

2.3.2 弱网测试环境搭建

  • iOS

首先确保手机打开了开发者选项,然后进入设置->开发者->Network Link Conditioner中,选择一个网络环境并开始模拟。

  • macOS

进入Apple开发者工具网页,并搜索Network Link Conditioner,找到并下载对应Xcode版本的Addional Tools,安装Network Link Conditioner到Mac,进入系统偏好设置中打开Network Link Conditioner即可开始模拟。

3 API 参考列表

方法 描述
- setVideoCodecId:ofChannel: 设置选用分层编码
- activateVideoPlayStream:active:videoLayer: 拉流选择视频分层
- setLatencyMode: 设置延迟模式
- enableTrafficControl:properties: 是否开启流量控制

4 相关文档

5 FAQ

Q1: 流量控制与分层视频编码都是可以控制分辨率的,他们有什么不同?

  答:流量控制面向的是推流方,推流方网络环境差时为了保证正常推流主动降低推流的质量;分层视频编码则是面向拉流方,拉流方根据自身网络环境可以自主选择拉流的质量,推流方还是推一路多层流。

Q2: 主播开启分层视频编码并在 startPublishing 中将 flag 设置为单主播模式,会有什么影响吗?

  答:分层视频编码影响的是主播推到ZegoServer的流,ZegoServer再将视频流推到CDN给观众,这两者是不影响的。但是由于没有连麦者,所以此时开启分层视频编码是没有意义的。

Q3: 分层视频编码拉取基本层和扩展层码率、分辨率等参数有区别吗?

  答:分层视频编码基本层的分辨率宽高是扩展层的50%,即基本层的画面面积为扩展层的25%,所以拉取基本层的码率大约为拉取扩展层码率的25%,其他参数没有变化。例如:用户设置编码分辨率为 800*600,则扩展层分辨率为 800*600,基本层分辨率为 400*300

Q4: 观众从CDN上拉取的流码率、分辨率是多少?

  答:ZegoServer推到CDN的流是高质量的,所以观众拉取的流码率、分辨率等参数就是扩展层对应的码率、分辨率。

Q5: 开启分层视频编码会影响 MediaSideInfo 的发送吗?

  答:不会。

本篇目录