当开发者(连麦/混流)业务中出现以下情况时,我们推荐使用 SDK 的分层视频编码功能:
分层视频编码产生的码流中包含多个子码流,子码流分为基本层和扩展层,各层具有不同的码率,帧率和分辨率,基本层拥有最基本的视频质量,后面每一个扩展层都是对上一层的补充,拉流端可以根据自己实际的网络环境来选择解码几路子码流。
分层视频编码使用的是Zego的私有协议,仅限于连麦/混流方使用,在此以连麦为例,连麦系统架构图见下方链接。
当A与B连麦时,A、B分别推一路流给ZegoServer,又分别从ZegoServer拉取对方的流,这里如果推流方推流时设置了开启分层视频编码,则拉流方就依据拉流分层设置拉取对应的分层(默认为Auto,即根据网络状态调整拉取的分层)。同时ZegoServer会将双方推的两条使用私有协议的流经过处理转换成CDN上支持的协议并推到CDN上,观众拉取到的实际上是ZegoServer推到CDN上的流,所以不支持分层解码(相关拉流设置无效)。
相关功能的 Demo 源码,请联系 ZEGO 技术支持获取。
接口使用流程如下
推流方
开启分层视频编码 -> 开始推流拉流方
开始拉流 -> 设置拉取的分层开启分层视频编码的接口位于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;
然后开始推流。
先开始拉流。
设置拉取视频的分层的接口位于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;
为测试拉流方根据网络状态选择图层的 VideoStreamLayer_Auto
分层类型,可搭建弱网环境并设置弱网环境相关优化配置。
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;
在弱网环境可酌情选择开启以上两个推流配置优化推流。
首先确保手机打开了开发者选项,然后进入设置->开发者->Network Link Conditioner中,选择一个网络环境并开始模拟。
进入Apple开发者工具网页,并搜索Network Link Conditioner,找到并下载对应Xcode版本的Addional Tools,安装Network Link Conditioner到Mac,进入系统偏好设置中打开Network Link Conditioner即可开始模拟。
方法 | 描述 |
---|---|
- setVideoCodecId:ofChannel: | 设置选用分层编码 |
- activateVideoPlayStream:active:videoLayer: | 拉流选择视频分层 |
- setLatencyMode: | 设置延迟模式 |
- enableTrafficControl:properties: | 是否开启流量控制 |
Q1: 流量控制与分层视频编码都是可以控制分辨率的,他们有什么不同?
答:流量控制面向的是推流方,推流方网络环境差时为了保证正常推流主动降低推流的质量;分层视频编码则是面向拉流方,拉流方根据自身网络环境可以自主选择拉流的质量,推流方还是推一路多层流。
Q2: 主播开启分层视频编码并在
startPublishing
中将flag
设置为单主播模式,会有什么影响吗?
答:分层视频编码影响的是主播推到ZegoServer的流,ZegoServer再将视频流推到CDN给观众,这两者是不影响的。但是由于没有连麦者,所以此时开启分层视频编码是没有意义的。
Q3: 分层视频编码拉取基本层和扩展层码率、分辨率等参数有区别吗?
答:分层视频编码基本层的分辨率宽高是扩展层的50%,即基本层的画面面积为扩展层的25%,所以拉取基本层的码率大约为拉取扩展层码率的25%,其他参数没有变化。例如:用户设置编码分辨率为 800*600
,则扩展层分辨率为 800*600
,基本层分辨率为 400*300
。
Q4: 观众从CDN上拉取的流码率、分辨率是多少?
答:ZegoServer推到CDN的流是高质量的,所以观众拉取的流码率、分辨率等参数就是扩展层对应的码率、分辨率。
Q5: 开启分层视频编码会影响
MediaSideInfo
的发送吗?
答:不会。
联系我们
文档反馈