AI教育
  • 概述
  • SDK 集成指引
  • 实现流程教师端
  • 实现流程学生端
  • API 文档
  • 常见错误码
  • 文档中心
  • AI教育
  • 实现流程教师端
  • Linux

AI课堂 - 教师端功能实现

更新时间:2021-06-10 10:07

1 功能实现流程图

教师端具体功能实现图参考如下:

/Pics/Common/Applications-AIClass/callFlow_teacher.jpg

2 教师端推视频流

ZEGO SDK 提供 MediaPublihser 模块用于推 mp4 视频流,其优势在于 mp4 文件直接以码流的形式进行推流,在教师端不需要先经过解码操作,极大幅度降低 CPU 占用;同时,推流过程中可根据业务的需要中途无缝切换视频源,实现 AI 教学的效果。如:学生回答问题之后教师根据其作答给出对错判断,切换到不同的视频。

2.1 预处理视频文件

ZEGO SDK 直推码率功能目前仅对经过处理的 mp4 文件有效,格式须满足以下条件:

  • 视频编码为 H.264,不能包含 B 帧,仅包含 I 帧和 P 帧,I 帧间隔为 2s,即单个 gop 值为 2s。
  • 视频的帧率、码率、分辨率与初始化 SDK 时设置的帧率、码率、分辨率保持一致。
  • 音频编码为 MPEG-4、AAC。

请使用 ZEGO 提供的视频文件格式转换工具进行处理,请点击下载:mp4convert.py

以下为基础的处理方式:

python3 mp4convert.py --src /Users/user/video_src/ --dst /Users/user/video_dst/
命令 [参数] 详情
--src SRC 指定 mp4 源文件路径。
--dst DST 指定输出路径。
--size SIZE 设置帧大小(“W × H” 或缩写),默认为 “960 × 540”。如果设置,将覆盖配置文件的值。
--vfr VFR 设置帧频(Hz 值,分数或缩写),默认为 20。如果设置,将覆盖配置文件的值。
--bitrate BITRATE 设置视频比特率,默认为 1000 KB。 如果设置,将覆盖配置文件的值。
--ar AR 设置音频采样率,默认为 44100 Hz。如果设置,将覆盖配置文件的值。
--abitrate ABITRATE 设置音频比特率,默认为 128 K。 如果设置,将覆盖配置文件的值。
--channel CHANNEL 设置音频通道号,默认为 1。如果设置,将覆盖配置文件的值。
--config CONFIG 从文件解析配置。

2.2 创建推流器

  • 接口原型:

    ZEGOAVKIT_API void Create(AV::PublishChannelIndex channelIdx)

  • 参数:

    channelIdx:指定推流通道,与 StartPublishing2 中的通道号对应。

  • 备注:

    创建推流器时,如果没有指定 channelIdx,将默认创建主通道的推流器。Create 接口必须在 InitSDK 之前调用。

2.3 设置推流器事件回调

  • 接口原型:

    ZEGOAVKIT_API void SetEventCallback(PublisherEventCallback* callback, AV::PublishChannelIndex channelIdx)

  • 参数:

    • callback:用于接收推流器事件的回调。

    • channelIdx:指定推流通道,与 Create 中的 channelIdx 对应。

    • PublihserEventCallback 类定义如下:

      接口 详情
      virtual void OnStart(AV::PublishChannelIndex channelIdx) 当 StartPublishing 开始推流成功后回调
      virtual void OnStop(AV::PublishChannelIndex channelIdx) 当 StopPublishing 停止推流成功后回调
      virtual void OnFileOpen(const char* path, AV::PublishChannelIndex channelIdx) 当开始处理某个文件时回调
      virtual void OnFileClose(const char* path, int code, AV::PublishChannelIndex channelIdx) 当处理完某个文件或者出错时回调
      virtual void OnFileDataBegin(const char* path, AV::PublishChannelIndex channelIdx) 每个文件开始出帧时回调

2.4 开始/切换视频流

  1. 开始推流之后调用该 API 开始塞第一个视频数据。
  2. 推流中途的任意时刻调用该 API,可将新的 mp4 码流塞到推流视频队列中,根据 bool clear 标志位决定是否要立即播放新的视频。
  • 接口原型:

    ZEGOAVKIT_API void AddPath(const char* path, bool clear, AV::PublishChannelIndex channelIdx)

  • 参数:

    • path:待推文件的路径。
    • clear:是否清除之前的所有待播放文件。当为 true 时,立即处理此文件;false 时只是将文件加入待处理队列。
    • channelIdx:指定推流通道,与 Create 中的 channelIdx 对应。
  • 备注:

    添加一个待推流的多媒体文件,目前仅支持 mp4 文件,且需要做特殊转换。mp4 文件格式必须满足:

    1. 视频编码为 H.264,不能包含 B 帧,仅包含 I 帧和 P 帧,I 帧间隔为 2s,即单个 gop 值为 2s。
    2. 视频的帧率、码率、分辨率与初始化 SDK 时设置的帧率、码率、分辨率保持一致。
    3. 音频编码为 MPEG-4、AAC。

2.5 监听视频播放进度

当开发者收到 OnFileDataBegin 回调时,当前视频的首帧到达,此时在该回调中可开启一个秒级或毫秒级定时器,用于模拟视频进度;当开发者收到 OnFileClose 回调时,可停止或重置定时器。开发者可以通过这种方式判断当前每一个视频的进度并且做进一步的业务逻辑,例如在既定的时间点里发送题目

示例代码片段如下:

// 每个视频文件开始出帧时回调
void ZegoAITeacher::OnFileDataBegin(const char* path, AV::PublishChannelIndex channelIdx) {

    // 开启一个秒级定时器,作为视频播放的进度
    m_cur_second = 0;
    m_is_timer_active = true;

    m_video_tick_timer->expires_after(std::chrono::seconds(1));
    m_video_tick_timer->async_wAIt(std::bind(&ZegoAITeacher::OnVideoSecondTick, this));

    // ...
    // ...
}

// 定时器回调
void ZegoAITeacher::OnVideoSecondTick() {

    // ...
    // ...

    //处理某个时间点的事件:假定第10秒发送一道题目
    if(m_cur_second == 10) {

        const char *question = "\"title\": \"1+1=?\",\"options\": [{\"answer\": \"1\"},{\"answer\": \"2\"}]";
        MEDIASIDEINFO::SendMediaSideInfo(question, strlen(question), false);
    }


    // ...
    // ...    
    m_cur_second++;

    if(m_is_timer_active) {
       m_video_tick_timer->expires_after(std::chrono::seconds(1));
       m_video_tick_timer->async_wAIt(std::bind(&ZegoAITeacher::OnVideoSecondTick, this));
    }

}

// 视频结束
void ZegoAITeacher::OnFileClose(AV::PublishChannelIndex channelIdx) {

    m_is_timer_active = false;
    m_video_tick_timer->cancel();

    // ...
}

2.6 销毁推流器

  • 接口原型:

    ZEGOAVKIT_API void Destroy(AV::PublishChannelIndex channelIdx)

  • 参数:

    channelIdx:指定推流通道,与 Create 中的通道号对应。

  • 备注:

    销毁推流器接口,推荐在 UnInitSDK 之后调用。

2.7 错误码

/**
 OnFileClose 错误码定义
 */
enum
{
    /**
     正常关闭
     */
    ERROR_NONE = 0,

    /**
     文件出错
     */
    ERROR_FILE = -1,

    /**
     路径有错
     */
    ERROR_PATH = -2,

    /**
     解码异常
     */
    ERROR_CODEC = -3,

    /**
     时间戳不对(后一帧的时间戳比前一帧的时间戳还要小)
     */
    ERROR_TS_GO_BACK = -4,
};

3 教师端下发媒体次要信息

ZEGO SDK 提供 MediaSideInfo 模块用于下发媒体次要信息,开发者可根据自身的业务场景在合适的时间点向视频数据塞入自定义附加信息,拉流端在拉取到该视频数据时可解析出附加信息以进行业务逻辑的处理。如:教师端通过媒体次要信息在某一时间点向学生端发送题目,学生端收到后展示题目并进行作答。有关媒体次要信息调用流程、打包原理和示例代码,请参考:互动视频 - 视频进阶 - 媒体次要信息

3.1 开启媒体次要信息开关

在发送媒体次要信息之前,需要在 InistSDK 之后、推流前设置开关。

  • 接口原型:

    ZEGOAVKIT_API void SetMediaSideFlags(bool bStart, bool bOnlyAudioPublish, bool bSendSEI = false, AV::PublishChannelIndex idx = AV::PUBLISH_CHN_MAIN)

  • 参数:

    • bStart:true 开启, false 关闭。
    • bOnlyAudioPublish:true 纯音频直播,不传输视频数据, false 音视频直播,传输视频数据。
    • bSendSEI:true 发送SEI,false 不发送SEI,默认不发送SEI。
    • idx:推流 channel Index. 默认为主Channel。
  • 备注:

    • onlyAudioPublish 开关在 start 开关开启时才生效。
    • SetMediaSideFlags 必须在 InistSDK 之后、推流前,设置。

3.2 发送媒体次要信息

推流过程中下发媒体次要信息,如发送题目、发送动作等。

  • 接口原型:

    ZEGOAVKIT_API void SendMediaSideInfo(const unsigned char *inData, int dataLen, bool bPacket, AV::PublishChannelIndex idx = AV::PUBLISH_CHN_MAIN)

  • 参数:

    • inData:媒体次要信息数据。
    • dataLen:数据长度。
    • bPacket:是否外部已经打包好包头。
    • idx:推流 channel Index,默认为主 Channel。
  • 备注:

    必须在推流成功后调用。

4 教师端与学生端的信令交互

ZEGO SDK 提供自定义房间信令进行教师与学生之间的交互,开发者可根据自身的业务场景定制信令模块,实现交互操作。

4.1 设置房间信息通知回调

  • 接口原型:

    ZEGO_API bool SetRoomCallback(IRoomCallback* pCB)

  • 参数:

    pCB:用于接收房间信息通知回调。

4.2 接收自定义房间信令

  • 接口原型:

    virtual void OnRecvCustomCommand(const char *pszUserId, const char *pszUserName, const char *pszContent, const char *pszRoomID) = 0

  • 参数:

    • pszUserId:发送者 UserId。
    • pszUserName:发送者 UserName。
    • pszContent:收到的信令内容。
    • pszRoomID:房间 ID。

4.3 发送自定义房间信令

  • 接口原型:

    ZEGO_API int SendCustomCommand(ROOM::ZegoUser *memberList, unsigned int memberCount, const char *content)

  • 参数:

    • memberList:信令发送成员列表。
    • memberCount:成员个数。
    • content:信令内容。
  • 返回值:

    seq:消息 seq。

5 API 参考列表

方法 描述
LIVEROOM::LoginRoom 登录房间
LIVEROOM::StartPublishing 开始推流
MEDIAPUBLISHER::Create 创建推流器
MEDIAPUBLISHER::SetEventCallback 设置推流器事件监听
MEDIAPUBLISHER::AddPath 添加一个待推流的多媒体文件,目前仅支持 mp4 文件,且需要做特殊转换
MEDIASIDEINFO::SetMediaSideCallback 设置接收媒体次要信息回调
MEDIASIDEINFO::SetMediaSideFlags 发送媒体次要信息开关
MEDIASIDEINFO::SendMediaSideInfo 发送媒体次要信息
IZegoMediaSideCallback::OnRecvMediaSideInfo 流媒体次要信息回调
LIVEROOM::SetRoomCallback 设置房间回调接口
LIVEROOM::SendCustomCommand 发送自定义消息
IRoomCallback::OnRecvCustomCommand 收到自定义消息
本篇目录