推多路流即 SDK 提供了同时推多路流的能力。目前即构实时音视频 SDK 支持最大推流通道数量为 4 路流,2.14.0 之前版本默认最大推流通道数量为 2 路,如需支持更多推流通道,请联系 ZEGO 技术支持进行特殊编包。
当开发者业务中出现以下情况时,推荐使用 SDK 的推多路流的功能:
- 游戏主播主路流推摄像头画面,第二路流推屏幕采集画面;
- 户外主播主路流推前置摄像头,第二路流推后置摄像头。
(以下以macOS为例进行说明)
示例源码下载
请参考 下载示例源码 获取源码。
相关源码请查看 “/ZegoExpressExample/Examples/AdvancedStreaming/PublishingMultipleStreams” 目录下的文件。
前提条件
在实现推多路流功能之前,请确保:
- 已在项目中集成 ZEGO Express SDK,实现基本的实时音视频功能,详情请参考 快速开始 – 集成 和 快速开始 – 实现视频通话。
- 已在 ZEGO 控制台 创建项目,并申请有效的 AppID 和 AppSign,详情请参考 控制台 – 项目管理 中的“项目信息”。
使用步骤
- 推除主路流以外的其他路流无法直接获取摄像头数据。;
- 默认情况下所推的其余路流只能推音频数据,若需要推音视频数据,需要开启自定义视频采集功能。
1 创建 ZegoExpressEngine 引擎
请参考 快速开始 – 实现流程 的 “3.1 创建引擎”。
ZegoEngineProfile *profile = [[ZegoEngineProfile alloc] init];
profile.appID = [KeyCenter appID];
profile.appSign = [KeyCenter appSign];
profile.scenario = ZegoScenarioGeneral;
[ZegoExpressEngine createEngineWithProfile:profile eventHandler:self];
2(可选)设置自定义视频采集配置
调用 ZegoCustomVideoCaptureConfig 接口创建自定义视频采集对象,设置属性 bufferType,向 SDK 提供视频帧数据类型;调用接口 enableCustomVideoCapture 开启自定义视频采集功能。
由于 iOS 采集的多样性,SDK 支持多种视频帧数据类型 bufferType,开发者需告知 SDK 使用的数据类型。目前 SDK 仅支持 CVPixelBuffer 类型 “ZegoVideoBufferTypeCVPixelBuffer” 和 GLTexture2D 类型 “ZegoVideoBufferTypeGLTexture2D”,设置其他枚举值将无法向 SDK 提供视频帧数据。
ZegoCustomVideoCaptureConfig *captureConfig = [[ZegoCustomVideoCaptureConfig alloc] init];
// 选择 CVPixelBuffer 类型视频帧数据
captureConfig.bufferType = ZegoVideoBufferTypeCVPixelBuffer;
[[ZegoExpressEngine sharedEngine] enableCustomVideoCapture:YES config:captureConfig channel:ZegoPublishChannelMain];
3(可选)设置辅助推流器自定义视频采集回调
3.1 设置自定义视频采集回调对象
将 “ViewController” 作为自定义视频采集回调对象,遵循 ZegoCustomVideoCaptureHandler 协议。
@interface ViewController () <ZegoEventHandler, ZegoCustomVideoCaptureHandler>
......
@end
调用 setCustomVideoCaptureHandler 接口设置自定义视频采集回调。
// 将自身作为自定义视频采集回调对象
[[ZegoExpressEngine sharedEngine] setCustomVideoCaptureHandler:self];
3.2 实现自定义视频采集回调方法
实现 onStart 和 onStop 自定义采集回调方法。
// 注意:此回调不在主线程,如有 UI 操作请自行切换到主线程
- (void)onStart {
// 收到回调后,开发者需要执行启动采集相关的业务逻辑,例如开启摄像头等
// 此处示例启动一个自己实现的视频采集设备
[self.captureDevice startCapture];
}
// 注意:此回调不在主线程,如有 UI 操作请自行切换到主线程
- (void)onStop {
// 收到回调后,开发者需要执行停止采集相关的业务逻辑,例如关闭摄像头等
// 此处示例停止一个自己实现的视频采集设备
[self.captureDevice stopCapture];
}
4 调用辅助推流器方法实现预览和推流
登录房间后,调用开始预览接口 startPreview 或者开始推流接口 startPublishingStream,触发 设置辅助推流器自定义视频采集回调 的 onStart。当 onStart 回调触发后,开发者可以开始采集视频帧数据。
当停止推流 stopPublishingStream 且停止预览 stopPreview 后,会触发 设置辅助推流器自定义视频采集回调 的 onStop 的回调,此时开发者应停止视频数据的采集。
[self.engine startPreview:mainPreviewCanvas channel:ZegoPublishChannelAux];
[self.engine startPublishingStream:self.auxStreamID channel:ZegoPublishChannelAux];
5
5(可选)向 SDK 发送采集到视频帧数据
当 onStart 回调触发之后,开发者可以调用 sendCustomVideoCaptureTextureData 或 sendCustomVideoCapturePixelBuffer向 SDK 发送采集到的视频数据。
[self.engine sendCustomVideoCaptureTextureData:textureID size:size timeStamp:timeStamp channel:ZegoPublishChannelAux];
或
[self.engine sendCustomVideoCapturePixelBuffer:data timeStamp:timeStamp channel:ZegoPublishChannelAux];
6 设置非主路推流事件回调
调用辅助推流器的 setEventHandler 接口为辅助推流器设置事件回调,以接收辅助推流器的“推流状态改变回调”、“推流质量回调”、“推流首帧回调”等通知。
[self.player setEventHandler:self];
- (void)onPublisherStateUpdate:(ZegoPublisherState)state errorCode:(int)errorCode extendedData:(nullable NSDictionary *)extendedData streamID:(NSString *)streamID{
// 进行对应的推流动作结果的逻辑
...
};
- (void)onPublisherQualityUpdate:(ZegoPublishStreamQuality *)quality streamID:(NSString *)streamID{
// 进行对应的推流中途流质量相关显示等业务逻辑
...
};
- (void)onPublisherCapturedVideoFirstFrame:(ZegoPublishChannel)channel{
// SDK 第一次收到到视频数据的通知
...
};
- (void)onPublisherVideoSizeChanged:(CGSize)size channel:(ZegoPublishChannel)channel{
// 开发者可以在此回调里去掉显示视频的 UI 遮罩空间等逻辑
};
- (void)onPublisherRelayCDNStateUpdate:(NSArray<ZegoStreamRelayCDNInfo *> *)infoList streamID:(NSString *)streamID{
// 流转推到 CDN 的通知
};
// 重写的其他回调
...
});
API 参考列表
方法 | 描述 |
startPublishingStream | 创建辅助推流器 |
stopPublishingStream | 销毁辅助推流器 |
常见问题
1、onStart 什么时候会回调?
当开启了自定义视频采集的情况下,SDK 开始推流 startPublishingStream 或启动预览 startPreview 的时候会触发。
2、是否支持同时推 4 路以上的流?
为了配合实时信令功能,该版本默认最大推流通道数量为 4 路,但 2.14.0 之前版本默认最大推流通道数量为 2 路。如需支持更多推流通道,请联系 ZEGO 技术支持进行特殊编包。
更多平台内容可点击【同时推多路流】查看!
本文为原创稿件,版权归作者所有,如需转载,请注明出处:https://www.nxrte.com/jishu/yinshipin/4847.html