游戏直播功能实现流程

游戏直播的应用场景是用户在使用游戏类 App 时,使用第三方直播类 App 进行游戏直播。Zego 提供了对游戏直播场景的支持,建议开发者按照下述步骤,逐渐熟悉并掌握游戏直播技术的使用与开发。html

zego提供包括游戏直播iOS/Android demo和iOS/Android SDK下载,详细的demo运行指引和SDK集成指引请阅读《游戏直播概述》。ios

下面以iOS环境为例,具体讲述游戏直播功能实现流程。web

游戏直播的应用场景是用户在使用游戏类 App 时,使用第三方直播类 App 进行游戏直播。app

推荐第三方直播类 App 使用 Apple 的 ReplayKit 框架(仅支持 iOS9 及以上系统),及其中的 Broadcast UI Extension、Broadcast Upload Extension (仅支持 iOS10 及以上系统)扩展功能,嵌入到第三方的 App 中。框架

使用 ReplayKit 实现游戏直播场景的主流程以下:
在这里插入图片描述
请注意:ide

一、上述的流程中,游戏 App 对 ReplayKit 的实现,不在本文的讨论范围内。svg

二、第三方直播 App 对于 ReplayKit 的功能实现,建议开发者优先参考苹果官方文档,亦可参考 LiveDemo5 中的
GameLive 和 GameLiveUI ,这两个 Target 简单演示了第三方直播 App 如何使用 BroadcastUI 和
BroadcastUpload 实现游戏画面音视频流的输出。ui

三、为了便于开发者更快理解 LiveDemo5 中的逻辑,下述每节会将功能核心源码片断挑出来并加以讲解。开发者亦可直接阅读
LiveDemo5 源码,二者是一致的。code

下文将重点讲述,如何经过 SDK 直播 ReplayKit 传递出的音视频流数据。视频

一、初始化 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];
}

二、开始推流

App 的推流流程,和常规的视频直播推流流程一致,区别是游戏直播场景下的音视频数据,均由 ReplayKit 提供。

SDK 推流流程请参考:初级功能指南-推流

三、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;
    }
}