当开发者的连麦或混流业务场景中,出现以下要求时,推荐使用 SDK 提供的 视频分层编码
或 视频大小流编码
功能:
视频分层编码(H.264 SVC)
,是 H.264 AVC 的扩展,支持具有分层特性的码流。视频大小流编码(H.264 DualStream)
参考了 H.264 SVC 的理念,通过对视频码流分层,保障不同网络和设备性能的终端流畅的体验。
两种编码方式,都是将码流分为 “基本层” 和 “扩展层”,可以为不同网络状态、不同设备性能的用户提供更好的体验。基本层保证了最基本的视频质量,而扩展层则是对基本层的补充。对于网络较好的用户,可拉取扩展层获得更好的体验,对于网络状态较差的用户,只拉取基本层可以保证基本的视频质量。以下是两种功能的详细对比:
- | 视频分层编码(H.264 SVC) | 视频大小流编码(H.264 DualStream) |
---|---|---|
实现逻辑 |
启动 1 个编码器分别编出不同的参数的码流,作为码流的基本层和扩展层。 |
启动 2 个编码器分别编出不同的参数的码流,作为码流的基本层和扩展层。 |
使用协议 |
使用 ZEGO 的私有协议,拉流端只有从 ZEGO 服务器上,才能拉取到不同分层的视频流。 |
|
编码/解码 |
基本层和扩展层的编码过程不独立,可以独立解码。 |
基本层和扩展层的编码、解码过程都相互独立。 |
推流 |
选择编码格式为 “ZegoVideoCodecIDSvc”。 |
|
拉流 |
接口调用无差异,同一用户同一时间只能拉取视频流的一层。默认网络情况良好时,只拉扩展层;网络情况不好时,只拉取基础层。 |
|
拉取的基本层的分辨率为扩展层的 50%、码率为扩展层的 25%、帧率保持一致,无法自定义配置。 |
取决于推流端设置的基本层和扩展层的视频参数。 |
|
优点 |
|
|
缺点 |
|
使用软件编码时,性能消耗略大于分层视频编码。 |
请参考 下载示例源码 获取源码。
相关源码请查看 “/ZegoExpressExample/AdvancedVideoProcessing/src/main/java/im/zego/advancedvideoprocessing/encodinganddecoding” 目录下的文件。
在实现两种视频编码功能之前,请确保:
在调用 startPublishingStream 之前,调用 setVideoConfig 接口,设置 ZegoVideoConfig 类中的参数 codecID
为 ZegoVideoCodecIDSVC
,开启分层视频编码;并调用 startPublishingStream 接口开始推流。
ZegoVideoConfig videoConfig = new ZegoVideoConfig ();
videoConfig.codecID = ZegoVideoCodecID.ZegoVideoCodecIDSVC;
engine.setVideoConfig(videoConfig);
engine.startPublishingStream("0012");
“codecID” 设置为 “ZegoVideoCodecIDDefault”、“ZegoVideoCodecIDVP8” 或 “ZegoVideoCodecIDH265” 可关闭该功能。
在推流端开启了分层视频编码后,拉流端用户在拉流前后均可调用 setPlayStreamVideoType 接口,传入具体的拉流参数以拉取特定的视频分层。目前支持的视频分层如下:
枚举值 | 说明 |
---|---|
ZegoVideoStreamTypeDefault | (默认值)根据网络状态自动选择合适的视频分层,例如弱网只拉取基本层。 |
ZegoVideoStreamTypeSmall | 基本层,小分辨率类型。 |
ZegoVideoStreamTypeBig | 扩展层,大分辨率类型。 |
engine.setPlayStreamVideoType(ZegoVideoStreamTypeBig, streamID);
engine.startPlayingStream:self.streamID playCanvas;
大小流视频编码
与 分层视频编码
的实现步骤基本一致,不同的是 大小视频流编码
功能支持在推流前,分别设置大流和小流的分辨率、帧率和码率等信息。
在调用 startPublishingStream 之前,调用 setVideoConfig 接口,设置 ZegoVideoConfig 类中的参数 codecID
为 ZegoVideoCodecIDH264DualStream
,开启大小流视频编码;并调用 startPublishingStream 接口开始推流。
ZegoVideoConfig videoConfig = new ZegoVideoConfig ();
videoConfig.codecID = ZegoVideoCodecID.H264_DUAL_STREAM;
engine.setVideoConfig(videoConfig);
“codecID” 设置为 “ZegoVideoCodecIDDefault”、“ZegoVideoCodecIDVP8” 或 “ZegoVideoCodecIDH265” 可关闭该功能。
通过 setPublishDualStreamConfig 接口,分别设置大流和小流的分辨率、帧率和码率等信息,并调用 startPublishingStream 接口开始推流。
ArrayList<ZegoPublishDualStreamConfig> config_list = new ArrayList<ZegoPublishDualStreamConfig>();
ZegoPublishDualStreamConfig big = new ZegoPublishDualStreamConfig();
big.streamType = ZegoVideoStreamType.BIG;
big.encodeHeight = 960;
big.encodeWidth = 540;
big.fps = 15;
big.bitrate = 1200;
config_list.add(big);
ZegoPublishDualStreamConfig small = new ZegoPublishDualStreamConfig();
small.streamType = ZegoVideoStreamType.SMALL;
small.encodeHeight = 320;
small.encodeWidth = 180;
small.fps = 15;
small.bitrate = 300;
config_list.add(small);
engine.setPublishDualStreamConfig(config_list,ZegoPublishChannel.MAIN);
engine.startPublishingStream("dual_streamid");
在推流端开启了视频大小流编码后,拉流端用户在拉流前后均可调用 setPlayStreamVideoType 接口,传入具体的拉流参数以拉取特定的视频分层。目前支持的视频分层如下:
枚举值 | 说明 |
---|---|
ZegoVideoStreamTypeDefault | (默认值)根据网络状态自动选择合适的视频分层,例如弱网只拉取基本层。 |
ZegoVideoStreamTypeSmall | 基本层,小分辨率类型。 |
ZegoVideoStreamTypeBig | 扩展层,大分辨率类型。 |
engine.setPlayStreamVideoType(ZegoVideoStreamTypeBig,streamID);
engine.startPlayingStream(streamID,canvans);
转推或直推 CDN,观众从 CDN 上拉流,分层视频编码和大小流是否有效?从 CDN 拉取的流码率、分辨率是多少?
视频分层编码
和 视频大小流编码
使用的是 ZEGO 的私有协议,拉流端只有从 ZEGO 服务器上拉取 RTC 流或 L3 流时,才能拉取到不同分层的视频流。
直推 CDN 场景下,由于不经过 ZEGO 服务器,所以码流的分层无效,SDK 会回退至 H.264 编码。从 CDN 拉取的流的分辨率和码率与推流用户设置的分辨率和码率一致。
转推 CDN 场景下,由于 CDN 拉流未使用 ZEGO 的私有协议,ZEGO 服务器转推到 CDN 服务器后的流不支持分层视频编码、视频大小流编码,只能从转推基本层或者转推扩展层中选择一个,CDN 拉流时的分辨率、码率和帧率取决于转推的是基本层还是扩展层。
转推到 CDN 时,默认转推扩展层。如果业务需要将基本层转推至 CDN,请联系 ZEGO 技术支持配置。
联系我们
文档反馈