在开发者推拉视频流时,可对编解码进行详细设置,包括启用分层视频编码(大小流)、使用硬件编解码和设置编码方式。
分层视频编码将码流分为基本层和扩展层,这种编码方式可以为不同网络状态的用户提供更好的体验,也称大小流。基本层保证了最基本的视频质量,而扩展层则是对基本层的补充。对于网络较好的用户,可只拉取扩展层获得更好的体验,对于网络状态较差的用户,只拉取基本层可以保证基本的视频质量。
当开发者在连麦或混流业务中出现以下情况时,推荐使用分层视频编码功能:
分层视频编码使用的是 ZEGO 的私有协议,拉流端只有从 ZEGO 服务器上才能拉取到不同分层的视频流。
开发者可选择开启硬件编码和硬件解码。开启硬件编解码后会使用 GPU 进行编解码,降低 CPU 使用率。若某些机型在推或拉大分辨率音视频流时设备发热严重,可开启硬件编解码。
开发者可进行视频编码配置,使不同端之间进行编码对齐,进而实现多端互通。
使用场景:
请参考 下载示例源码 获取源码。
相关源码请查看 “/pages/example/advance-video/video-codec.nvue” 目录下的文件。
在实现视频编解码功能之前,请确保:
使用分层视频编码需要以下两个步骤:
在推流(startPublishingStream)前调用 setVideoConfig 设置 ZegoVideoConfig 类中的参数 “codecID”,即可开启/关闭分层视频编码功能。
目前 Web 只支持设置 ZegoVideoCodecID.Default
及 ZegoVideoCodecID.VP8
。
let videoConfig = {};
videoConfig.codecID = ZegoVideoCodecID.SVC;
ZegoExpressEngine.instance().setVideoConfig(videoConfig);
let streamID = "MultiLayer-1";
ZegoExpressEngine.instance().startPublishingStream(streamID);
在推流端开启了分层视频编码后,拉流端在拉流前后均可调用 setPlayStreamVideoType 接口,拉流端默认会根据网络情况拉取合适的视频分层,例如弱网只拉取基本层。开发者也可以传入具体的拉流参数以拉取特定的视频分层,目前支持的视频分层如下:
枚举值 | 说明 |
---|---|
ZegoVideoStreamType.Default | 根据网络状态选择图层 |
ZegoVideoStreamType.Small | 小分辨率类型 |
ZegoVideoStreamType.Big | 大分辨率类型 |
以拉取扩展层为例:
ZegoExpressEngine.instance().setPlayStreamVideoType(playStreamID,ZegoVideoStreamType.Big);
ZegoExpressEngine.instance().startPlayingStream(playStreamID);
由于少部分机型设备对硬件编码/解码的支持不佳,SDK 默认使用软件编码与软件解码的方式,若开发者有使用硬件编码的需求,可参照本节自行设置。
该功能需在推流前设置才能生效,如果在推流后设置,停止推流后重新推流才可以生效。
若开发者需要开启硬件编码,可调用 enableHardwareEncoder 接口。
// 开启硬件编码
ZegoExpressEngine.instance().enableHardwareEncoder(true);
该功能需在拉流前设置才能生效,如果在拉流后设置,停止拉流后重新拉流才可以生效。
若开发者需要开启硬件解码,可调用 enableHardwareDecoder 接口。
// 开启硬件解码
ZegoExpressEngine.instance().enableHardwareDecoder(true);
在推流(startPublishingStream)前调用 setVideoConfig 接口设置 “ZegoVideoConfig” 类下的参数 “codecID”,即可设置视频编码方式。目前支持的视频编码方式如下:
目前 Web 仅支持 H.264、VP8,其他编码方式暂不支持。
枚举值 | 编码方式 | 使用场景 |
---|---|---|
ZegoVideoCodecID.Default | 默认编码(H.264) | H.264 是被广泛使用的高精度视频的录制、压缩和发布格式,拥有很好的兼容性。 |
ZegoVideoCodecID.SVC | 分层编码 (H.264 SVC) | 需要使用分层编码的场景。 |
ZegoVideoCodecID.VP8 | VP8 | 常用于 Web 视频,但不能用在 CDN 录制场景中,否则会造成录制文件异常。 |
ZegoVideoCodecID.H265 | H.265 | 拥有更好的压缩率,但需考虑兼容性。 |
以设置编码方式为 H.265 为例:
let videoConfig = {};
videoConfig.codecID = ZegoVideoCodecID.H265;
ZegoExpressEngine.instance().setVideoConfig(videoConfig);
let streamID = "MultiLayer-1";
ZegoExpressEngine.instance().startPublishingStream(streamID);
方法 | 描述 |
---|---|
setVideoConfig | 设置视频参数 |
enableHardwareEncoder | 开/关硬件编码 |
enableHardwareDecoder | 开/关硬件解码 |
什么是大小流?
大小流即分层视频编码,用户在接收端拉流前,根据自己的网络状况,可以调用 setPlayStreamVideoType 设置为 ZegoVideoStreamTypeSMALL(小流)或者 ZegoVideoStreamTypeBIG(大流),也可以设置为 ZegoVideoStreamTypeDEFAULT,让 ZEGO 帮您自动选择。
分层视频编码拉取基本层和扩展层码率、分辨率等参数有区别吗?
分层视频编码基本层的分辨率宽高分别是扩展层的 50%,拉取基本层的码率大约为拉取扩展层码率的 25%,其他参数一致。
分层视频编码只会拉取一层,网络情况良好时,只拉扩展层,网络情况不好时,只拉取基础层。
例如,用户设置编码分辨率为 “800 × 600”,则扩展层分辨率为 “800 × 600”,基本层分辨率为 “400 × 300”。
转推或直推 CDN,观众从 CDN 上拉流,分层视频编码是否有效?从 CDN 拉取的流码率、分辨率是多少?
分层视频编码使用的是 ZEGO 的私有协议,拉流端只有从 ZEGO 服务器上才能拉取到不同分层的视频流。
转推 CDN 场景下,推流端推送到 ZEGO 服务器的流可以使用分层视频编码,从 ZEGO 服务器也可以拉取到分层视频编码的流。但是 ZEGO 服务器转推到 CDN 服务器的流无法使用分层视频编码,而会是高质量的流。从 CDN 拉取的流与分层视频编码中扩展层的码率、分辨率一致。
直推 CDN 场景下,由于不经过 ZEGO 服务器,所以分层视频编码无效。从 CDN 拉取的流的分辨率和码率与推流用户设置的分辨率和码率一致。
分层视频编码的优缺点?
优点 | 缺点 |
---|---|
|
|
联系我们
文档反馈