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