文档中心
Old_Live_Room 互动视频
文档中心
体验 App
SDK 中心
API 中心
常见问题
代码市场
进入控制台
立即注册
登录
中文站 English
  • 文档中心
  • 互动视频
  • 视频进阶
  • 分层视频编码

分层视频编码

更新时间:2022-08-18 14:29

1 概述

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

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

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

1.2 什么是分层视频编码

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

1.3 分层视频编码的优缺点

1.3.1 优点

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

1.3.2 缺点

  • 压缩效率稍低:在同样的条件下,分层视频编码比普通编码方式的压缩效率要低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 接口使用流程如下

  1. 连麦推流方开启分层视频编码后开始推流
  2. 连麦拉流方拉流后设置拉取的分层

2.2 推流方开启分层视频编码后开始推流

开启分层视频编码的接口位于 com.zego.zegoliveroom.ZegoLiveRoom package中,推流前调用即可。如下所示:

//package com.zego.zegoliveroom.ZegoLiveRoom

/**
 设置选用分层编码

 @param codecId 分层编码模式
 @param channel 推流通道
 @return true 成功,false 失败
 @discussion 设置选用分层编码,在InitSDK后,推流前调用有效
 */
public boolean setVideoCodecId(int codecId, int channelIndex);

codecId值对应ZegoConstants.ZegoVideoCodecAvc,指定了推流是否启用分层解码:

/** 分层编码 */

/** 不支持分层编码 */
ZegoConstants.ZegoVideoCodecAvc.VIDEO_CODEC_DEFAULT = 0

/** 分层编码 要达到和VIDEO_CODEC_DEFAULT相同的编码质量,建议码率和VIDEO_CODEC_DEFAULT相比增加20%左右 */
ZegoConstants.ZegoVideoCodecAvc.VIDEO_CODEC_MULTILAYER = 1

参考文档:快速开始-推流

2.3 连麦拉流方拉流后设置拉取的分层

设置拉取视频的分层的接口位于com.zego.zegoliveroom.ZegoLiveRoom package中,拉流后调用即可,拉流后可以多次调用activateVideoPlayStream动态切换拉取的视频分层。如下所示:

//package com.zego.zegoliveroom.ZegoLiveRoom

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

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

其中videoLayer值对应于ZegoConstants.VideoStreamLayer,指定了拉取的视频分层类型:

/** 视频分层类型 */

/**< 根据网络状态选择图层  */
ZegoConstants.VideoStreamLayer.VideoStreamLayer_Auto = -1

/**< 指定拉基本层(小分辨率) */
ZegoConstants.VideoStreamLayer.VideoStreamLayer_BaseLayer = 0

/**< 指定拉扩展层(大分辨率)  */
ZegoConstants.VideoStreamLayer.VideoStreamLayer_ExtendLayer = 1

参考文档:快速开始-拉流

3 弱网环境

3.1 连麦弱网环境相关优化配置

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

//package com.zego.zegoliveroom.ZegoLiveRoom

/**
 设置延迟模式

 @param mode 延迟模式,默认 ZegoConstants.LatencyMode.Normal
 @discussion 在推流前调用
 */
public void setLatencyMode(int mode) {}

/**
 是否开启流量(帧率、分辨率)控制

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

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

3.2 弱网测试环境搭建

电脑设置弱网环境,手机与电脑实现网络共享。

4 FAQ

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

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

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

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

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

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

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

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

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

  答:不会。

本篇目录
  • 免费试用
  • 提交工单
    咨询集成、功能及报价等问题
    电话咨询
    400 1006 604
    咨询客服
    微信扫码,24h在线

    联系我们

  • 文档反馈