教师端具体功能实现图参考如下:
ZEGO SDK 提供 MediaPublihser
模块用于推 mp4 视频流,其优势在于 mp4 文件直接以码流的形式进行推流,在教师端不需要先经过解码操作,极大幅度降低 CPU 占用;同时,推流过程中可根据业务的需要中途无缝切换视频源,实现 AI 教学的效果。如:学生回答问题之后教师根据其作答给出对错判断,切换到不同的视频。
ZEGO SDK 直推码率功能目前仅对经过处理的 mp4 文件有效,格式须满足以下条件:
请使用 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 | 从文件解析配置。 |
接口原型:
ZEGOAVKIT_API void Create(AV::PublishChannelIndex channelIdx)
参数:
channelIdx
:指定推流通道,与 StartPublishing2 中的通道号对应。
备注:
创建推流器时,如果没有指定 channelIdx,将默认创建主通道的推流器。Create 接口必须在 InitSDK 之前调用。
接口原型:
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) | 每个文件开始出帧时回调 |
bool clear
标志位决定是否要立即播放新的视频。接口原型:
ZEGOAVKIT_API void AddPath(const char* path, bool clear, AV::PublishChannelIndex channelIdx)
参数:
path
:待推文件的路径。clear
:是否清除之前的所有待播放文件。当为 true 时,立即处理此文件;false 时只是将文件加入待处理队列。channelIdx
:指定推流通道,与 Create 中的 channelIdx 对应。备注:
添加一个待推流的多媒体文件,目前仅支持 mp4 文件,且需要做特殊转换。mp4 文件格式必须满足:
当开发者收到 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();
// ...
}
接口原型:
ZEGOAVKIT_API void Destroy(AV::PublishChannelIndex channelIdx)
参数:
channelIdx
:指定推流通道,与 Create 中的通道号对应。
备注:
销毁推流器接口,推荐在 UnInitSDK 之后调用。
/**
OnFileClose 错误码定义
*/
enum
{
/**
正常关闭
*/
ERROR_NONE = 0,
/**
文件出错
*/
ERROR_FILE = -1,
/**
路径有错
*/
ERROR_PATH = -2,
/**
解码异常
*/
ERROR_CODEC = -3,
/**
时间戳不对(后一帧的时间戳比前一帧的时间戳还要小)
*/
ERROR_TS_GO_BACK = -4,
};
ZEGO SDK 提供 MediaSideInfo
模块用于下发媒体次要信息,开发者可根据自身的业务场景在合适的时间点向视频数据塞入自定义附加信息,拉流端在拉取到该视频数据时可解析出附加信息以进行业务逻辑的处理。如:教师端通过媒体次要信息在某一时间点向学生端发送题目,学生端收到后展示题目并进行作答。有关媒体次要信息调用流程、打包原理和示例代码,请参考:互动视频 - 视频进阶 - 媒体次要信息。
在发送媒体次要信息之前,需要在 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。备注:
推流过程中下发媒体次要信息,如发送题目、发送动作等。
接口原型:
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。备注:
必须在推流成功后调用。
ZEGO SDK 提供自定义房间信令进行教师与学生之间的交互,开发者可根据自身的业务场景定制信令模块,实现交互操作。
接口原型:
ZEGO_API bool SetRoomCallback(IRoomCallback* pCB)
参数:
pCB
:用于接收房间信息通知回调。
接口原型:
virtual void OnRecvCustomCommand(const char *pszUserId, const char *pszUserName, const char *pszContent, const char *pszRoomID) = 0
参数:
pszUserId
:发送者 UserId。pszUserName
:发送者 UserName。pszContent
:收到的信令内容。pszRoomID
:房间 ID。接口原型:
ZEGO_API int SendCustomCommand(ROOM::ZegoUser *memberList, unsigned int memberCount, const char *content)
参数:
memberList
:信令发送成员列表。memberCount
:成员个数。content
:信令内容。返回值:
seq
:消息 seq。
方法 | 描述 |
---|---|
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 | 收到自定义消息 |
联系我们
文档反馈