在开发者推拉视频流时,可对编解码进行详细设置,包括开启分层视频编码、开启视频大小流编码、使用硬件编解码和设置编码方式。
分层视频编码,将码流分为基本层和扩展层,此编码方式可以为不同网络状态的用户提供更好的体验。基本层保证了最基本的视频质量,而扩展层则是对基本层的补充。对于网络较好的用户,可只拉取扩展层获得更好的体验,对于网络状态较差的用户,只拉取基本层可以保证基本的视频质量。
当开发者在连麦或混流业务中出现以下情况时,推荐使用分层视频编码功能:
分层视频编码使用的是 ZEGO 的私有协议,拉流端只有从 ZEGO 服务器上才能拉取到不同分层的视频流。
视频大小流编码与分层视频编码的共同作用是将码流分为大分辨率类型和小分辨率类型。
最显著的差异是分层视频编码使用一个编码器编出基本层和扩展层的码流,视频大小流编码使用两个编码器编出基本层和扩展层的码流。
二者的具体差异、优缺点请查看本文第6部分的“常见问题”,开发者可以结合二者差异和业务具体诉求,选择分层视频编码还是视频大小流编码。
视频大小流编码使用的是 ZEGO 的私有协议,拉流端只有从 ZEGO 服务器上才能拉取到不同分层的视频流。
开发者可选择开启硬件编码和硬件解码。开启硬件编解码后会使用 GPU 进行编解码,降低 CPU 使用率。若某些机型在推或拉大分辨率音视频流时设备发热严重,可开启硬件编解码。
开发者可进行视频编码配置,使不同端之间进行编码对齐,进而实现多端互通。
使用场景:
请参考 下载示例源码 获取源码。
相关源码请查看 “/ZegoExpressExample/Examples/AdvancedVideoProcessing/Encoding&Decoding” 目录下的文件。
在实现视频编解码功能之前,请确保:
使用分层视频编码需要以下两个步骤:
在调用 startPublishingStream 之前调用 setVideoConfig 接口设置 ZegoVideoConfig 类中的参数 “codecID”,即可开启/关闭分层视频编码功能。
ZegoVideoConfig *videoConfig = [[ZegoVideoConfig alloc] init];
videoConfig.codecID = ZegoVideoCodecIDSVC;
[[ZegoExpressEngine sharedEngine] setVideoConfig:videoConfig];
self.streamID = @"0012";
[[ZegoExpressEngine sharedEngine] startPublishingStream:self.streamID];
在推流端开启了分层视频编码后,拉流端在拉流前后均可调用 setPlayStreamVideoType 接口,此时拉流端默认会根据网络情况拉取合适的视频分层,例如弱网只拉取基本层。开发者也可以传入具体的拉流参数以拉取特定的视频分层,目前支持的视频分层如下:
枚举值 | 说明 |
---|---|
ZegoVideoStreamTypeDefault | 根据网络状态自动选择流类型 |
ZegoVideoStreamTypeSmall | 小分辨率类型 |
ZegoVideoStreamTypeBig | 大分辨率类型 |
以拉取扩展层为例:
[[ZegoExpressEngine sharedEngine] setPlayStreamVideoType:ZegoVideoStreamTypeBig streamID:self.streamID];
[[ZegoExpressEngine sharedEngine] startPlayingStream:self.streamID canvas:playCanvas];
视频大小流编码(H.264 DualStream)的实现方式与分层视频编码(H.264 SVC)类似,需要以下两个步骤:
在推流(startPublishingStream)前,调用 setVideoConfig 接口设置 ZegoVideoConfig 类中的参数 codecID
为 ZegoVideoCodecID.H264DualStream
,即可开启视频大小流编码功能。
ZegoVideoConfig *videoConfig = [[ZegoVideoConfig alloc] init];
videoConfig.codecID = ZegoVideoCodecIDH264DualStream;
[[ZegoExpressEngine sharedEngine] setVideoConfig:videoConfig];
self.streamID = @"0012";
[[ZegoExpressEngine sharedEngine] startPublishingStream:self.streamID];
在推流端开启了视频大小流编码后,拉流端在拉流前后均可调用 setPlayStreamVideoType 接口,此时拉流端默认会根据网络情况拉取合适的视频流分层,例如,弱网只拉取基本层。开发者也可以传入具体的拉流参数以拉取特定的视频分层,目前支持的视频分层如下:
枚举值 | 说明 |
---|---|
ZegoVideoStreamTypeDefault | 根据网络状态自动选择流类型 |
ZegoVideoStreamTypeSmall | 基本层,小分辨率类型 |
ZegoVideoStreamTypeBig | 扩展层,大分辨率类型 |
以拉取扩展层为例:
[[ZegoExpressEngine sharedEngine] setPlayStreamVideoType:ZegoVideoStreamTypeBig streamID:self.streamID];
[[ZegoExpressEngine sharedEngine] startPlayingStream:self.streamID canvas:playCanvas];
由于少部分机型设备对硬件编码/解码的支持不佳,SDK 默认使用软件编码与软件解码的方式,若开发者有使用硬件编码的需求,可参照本节自行设置。
该功能需在推流前设置才能生效,如果在推流后设置,停止推流后重新推流才可以生效。
若开发者需要开启硬件编码,可调用 enableHardwareEncoder 接口。
// 开启硬件编码
[[ZegoExpressEngine sharedEngine] enableHardwareEncoder:YES];
该功能需在拉流前设置才能生效,如果在拉流后设置,停止拉流后重新拉流才可以生效。
若开发者需要开启硬件解码,可调用 enableHardwareDecoder 接口。
// 开启硬件解码
[[ZegoExpressEngine sharedEngine] enableHardwareDecoder:YES];
在推流(startPublishingStream)前调用 setVideoConfig 接口设置 “ZegoVideoConfig” 类下的参数 “codecID”,即可设置视频编码方式。目前支持的视频编码方式如下:
枚举值 | 编码方式 | 使用场景 |
---|---|---|
ZegoVideoCodecIDDefault | 默认编码(H.264) | H.264 是被广泛使用的高精度视频的录制、压缩和发布格式,拥有很好的兼容性。 |
ZegoVideoCodecIDSVC | 分层视频编码(H.264 SVC) | 需要使用分层编码的场景。 |
ZegoVideoCodecIDH264DualStream | 视频大小流编码(H.264 DualStream) | 希望将码流分为基本层和扩展层,但是 SVC 不满足业务需要的场景(例如:希望同时使用硬件编码)。 |
ZegoVideoCodecIDVP8 | VP8 | 常用于 Web 视频。 |
ZegoVideoCodecIDH265 | H.265 | 拥有更好的压缩率,但需考虑兼容性。 |
以设置编码方式为 H.265 为例:
ZegoVideoConfig *videoConfig = [[ZegoVideoConfig alloc] init];
videoConfig.codecID = ZegoVideoCodecIDH265;
[[ZegoExpressEngine sharedEngine] setVideoConfig:videoConfig];
方法 | 描述 |
---|---|
setVideoConfig | 设置视频参数 |
enableHardwareEncoder | 开/关硬件编码 |
enableHardwareDecoder | 开/关硬件解码 |
分层视频编码(H.264 SVC,H.264 Scalable Video Coding) H.264 SVC 是 H.264 AVC 的扩展,支持具有分层特性的码流,在 2007 年成为 ITU 的正式编码标准。由于 H.264 SVC 的标准较为复杂,不同的编码器的实现方式和实现程度不一样,互通性较差,绝大多数硬件编码器都不支持 H.264 SVC。
视频大小流编码 视频大小流编码参考了 H.264 SVC 的理念,通过对视频码流分层,保障不同网络和设备性能的终端流畅的体验。
与 H.264 SVC 不同,视频大小流编码通过启动两个编码器分别编出不同的参数的码流,作为码流的基本层和扩展层。基本层和扩展层的编码过程相互独立,与 H.264 AVC 一致,绝大多数软件和硬件编码器都可以使用,且规避了 H.264 SVC 无法使用硬件编码以及软件编码器支持不够丰富的问题。
分层视频编码和视频大小流编码的目的都是为了将视频码流分为基本层和扩展层,对于开发者来说,拉流端的调用流程没有差异,推流端在选择编码方式时设置的枚举值有一定差异。
用户在接收端拉流前,根据自己的网络状况,可以调用 setPlayStreamVideoType
设置为 ZegoVideoStreamTypeSMALL
(基本层)或者 ZegoVideoStreamTypeBIG
(扩展层),也可以设置为 ZegoVideoStreamTypeDEFAULT
,让 ZEGO 帮您自动选择。
分层视频编码和视频大小流编码,基本层的分辨率宽高分别都是扩展层的 50% ,基本层的码率大约为拉取扩展层码率的 25% ,帧率保持一致。
分层视频编码和视频大小流编码只会拉取一层,网络情况良好时,只拉扩展层,网络情况不好时,只拉取基础层。
例如,用户设置编码分辨率为 “800 × 600”,则扩展层分辨率为 “800 × 600”,基本层分辨率为 “400 × 300”。
分层视频编码和视频大小流编码使用的是 ZEGO 的私有协议,拉流端只有从 ZEGO 服务器上才能拉取到不同分层的视频流。
转推 CDN 场景下,推流端推送到 ZEGO 服务器的流可以使用分层视频编码或视频大小流编码,从 ZEGO 服务器也可以拉取到分层的码流。但是 ZEGO 服务器转推到 CDN 服务器的流无法使用分层视频编码/视频大小流编码,而会是高质量的流。从 CDN 拉取的流与扩展层的码率、分辨率一致。
直推 CDN 场景下,由于不经过 ZEGO 服务器,所以码流的分层无效。从 CDN 拉取的流的分辨率和码率与推流用户设置的分辨率和码率一致。
功能 | 优点 | 缺点 |
---|---|---|
分层视频编码 |
|
|
视频大小流编码 |
|
使用软件编码时,性能消耗略大于分层视频编码。 |
联系我们
文档反馈