游戏直播的应用场景是用户在使用游戏类 App 时,使用第三方直播类 App 进行游戏直播。Zego 提供了对游戏直播场景的支持,建议开发者按照下述步骤,逐渐熟悉并掌握游戏直播技术的使用与开发。
zego提供包括游戏直播iOS/Android demo和iOS/Android SDK下载,详细的demo运行指引和SDK集成指引请阅读《游戏直播概述》。
下面以iOS环境为例,具体讲述游戏直播功能实现流程。
游戏直播的应用场景是用户在使用游戏类 App 时,使用第三方直播类 App 进行游戏直播。
推荐第三方直播类 App 使用 Apple 的 ReplayKit 框架(仅支持 iOS9 及以上系统),及其中的 Broadcast UI Extension、Broadcast Upload Extension (仅支持 iOS10 及以上系统)扩展功能,嵌入到第三方的 App 中。
使用 ReplayKit 实现游戏直播场景的主流程如下:
请注意:
1、上述的流程中,游戏 App 对 ReplayKit 的实现,不在本文的讨论范围内。
2、第三方直播 App 对于 ReplayKit 的功能实现,建议开发者优先参考苹果官方文档,亦可参考 LiveDemo5 中的
GameLive 和 GameLiveUI ,这两个 Target 简单演示了第三方直播 App 如何使用 BroadcastUI 和
BroadcastUpload 实现游戏画面音视频流的输出。3、为了便于开发者更快理解 LiveDemo5 中的逻辑,下述每节会将功能核心源码片段挑出来并加以讲解。开发者亦可直接阅读
LiveDemo5 源码,两者是一致的。
下文将重点讲述,如何通过 SDK 直播 ReplayKit 传递出的音视频流数据。
1、初始化 ReplayLive
调用如下 API 初始化 ReplayLive,该接口必须在调用 initWithAppID:appSignature: 初始化 SDK 前被调用。
ZegoLiveRoomApi-ReplayLive.h
/**
初始化 ReplayLive
@discussion 必须在 InitSDK 前调用
*/
+ (void)prepareReplayLiveCapture;
·LiveDemo5 演示源码:
GameLive Target, ZegoAVKitManager.m
- (void)initZegoLiveApi
{
if (self.zegoLiveApi != nil)
return;
[ZegoLiveRoomApi setUseTestEnv:self.testEnvironment];
// 初始化 ReplayLive
[ZegoLiveRoomApi prepareReplayLiveCapture];
NSData *appSign = [self getZegoAppSign];
[ZegoLiveRoomApi setUserID:self.userID userName:self.userName];
// 初始化 SDK
_zegoLiveApi = [[ZegoLiveRoomApi alloc] initWithAppID:1 appSignature:appSign];
}
2、开始推流
App 的推流流程,和常规的视频直播推流流程一致,区别是游戏直播场景下的音视频数据,均由 ReplayKit 提供。
SDK 推流流程请参考:初级功能指南-推流
3、ReplayKit 提供音视频数据
音视频数据由 ReplayKit 提供。SDK 提供了两个接口,用于处理 ReplayKit 传递出的 CMSampleBufferRef 数据,分别是:
ZegoLiveRoomApi-ReplayLive.h
/**
处理视频数据
@param sampleBuffer ReplayLiveKit 返回的视频数据
*/
- (void)handleVideoInputSampleBuffer:(CMSampleBufferRef)sampleBuffer;
/**
处理音频数据
@param sampleBuffer ReplayLiveKit 返回的音频数据
@param sampleBufferType 类型 RPSampleBufferTypeAudioApp, RPSampleBufferTypeAudioMic
*/
- (void)handleAudioInputSampleBuffer:(CMSampleBufferRef)sampleBuffer withType:(RPSampleBufferType)sampleBufferType;
App 启动推流,并调用上述两个 API 接收音视频流数据后,SDK 会自动将音视频流推流出去,开发者无需再进行其他操作。
LiveDemo5 中演示了 SDK 从 ReplayKit 中的 SampleHandler 获取数据并处理:
SampleHandler.m
// ReplayKit 提供的、在 broadcast 中处理视频和音频数据
- (void)processSampleBuffer:(CMSampleBufferRef)sampleBuffer withType:(RPSampleBufferType)sampleBufferType {
switch (sampleBufferType) {
case RPSampleBufferTypeVideo:
// 处理视频数据
[[ZegoAVKitManager sharedInstance] handleVideoInputSampleBuffer:sampleBuffer];
break;
case RPSampleBufferTypeAudioApp:
// 处理音频数据,音频由 App 产生
[[ZegoAVKitManager sharedInstance] handleAudioInputSampleBuffer:sampleBuffer withType:RPSampleBufferTypeAudioApp];
break;
case RPSampleBufferTypeAudioMic:
// 处理音频数据,音频由麦克风产生
[[ZegoAVKitManager sharedInstance] handleAudioInputSampleBuffer:sampleBuffer withType:RPSampleBufferTypeAudioMic];
break;
default:
break;
}
}