... | ... | @@ -228,7 +228,7 @@ Destination 选择 "Frameworks" -> |
|
|
|
|
|
在启动方法中添加日志存储
|
|
|
|
|
|
```
|
|
|
```objc
|
|
|
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
|
|
|
/**
|
|
|
* @brief 是否存储日志
|
... | ... | @@ -242,7 +242,7 @@ Destination 选择 "Frameworks" -> |
|
|
|
|
|
服务错误类型
|
|
|
|
|
|
```
|
|
|
```objc
|
|
|
ERROR_SERVICE_TYPE
|
|
|
|
|
|
ERROR_ROOM_STATE = 1001 直播间状态不可用,可能没有开始推流
|
... | ... | @@ -252,7 +252,7 @@ Destination 选择 "Frameworks" -> |
|
|
|
|
|
系统错误类型
|
|
|
|
|
|
```
|
|
|
```objc
|
|
|
ERROR_SYSTEM_TYPE
|
|
|
|
|
|
ERROR_RETURNDATA = 1004 返回内容格式错误
|
... | ... | @@ -280,7 +280,7 @@ Destination 选择 "Frameworks" -> |
|
|
|
|
|
3.1.1 调用方法
|
|
|
|
|
|
```objective-c
|
|
|
```objc
|
|
|
/**
|
|
|
* @brief 登录房间
|
|
|
* @param parameter 配置参数信息
|
... | ... | @@ -290,7 +290,7 @@ Destination 选择 "Frameworks" -> |
|
|
* 必填参数 viewerName //用户名称
|
|
|
* 必填参数 token //房间密码
|
|
|
* (已弃用!) security //是否使用https
|
|
|
*
|
|
|
*/
|
|
|
- (id)initLoginWithParameter:(PlayParameter *)parameter;
|
|
|
/**
|
|
|
* @brief 进入房间,并请求画图聊天数据并播放视频(可以不登陆,直接从此接口进入直播间)
|
... | ... | @@ -306,7 +306,7 @@ Destination 选择 "Frameworks" -> |
|
|
* 必填参数 playerFrame; //视频区域
|
|
|
* (已弃用!) security //是否使用https
|
|
|
* 必填参数 pauseInBackGround; //后台是否继续播放,注意:如果开启后台播放需要打开 xcode->Capabilities->Background Modes->on->Audio,AirPlay,and Picture in Picture
|
|
|
* 必填参数 defaultColor; //ppt默认底色,不写默认为白色
|
|
|
* 必填参数 defaultColor; //ppt默认底色,不写默认为白色 不写默认为白色 (16进制颜色,默认白色 @"#FFFFFF");
|
|
|
* 必填参数 PPTScalingMode; //PPT适配方式
|
|
|
PPT适配模式分为四种,
|
|
|
1.拉伸填充,PPT内容全部展示在显示区域,会被拉伸或压缩,不会存在黑边
|
... | ... | @@ -320,7 +320,7 @@ Destination 选择 "Frameworks" -> |
|
|
|
|
|
代理方法
|
|
|
|
|
|
```objective-c
|
|
|
```objc
|
|
|
/**
|
|
|
* @brief 请求回放地址成功
|
|
|
*/
|
... | ... | @@ -345,19 +345,19 @@ Destination 选择 "Frameworks" -> |
|
|
|
|
|
导入头文件
|
|
|
|
|
|
```
|
|
|
```objc
|
|
|
#import "CCSDK/RequestDataPlayBack.h"//SDK
|
|
|
```
|
|
|
|
|
|
声明变量
|
|
|
|
|
|
```
|
|
|
```objc
|
|
|
@property (nonatomic,strong)RequestData * requestDataPlayBack;//sdk
|
|
|
```
|
|
|
|
|
|
配置参数:PlayParameter的属性如下
|
|
|
|
|
|
```objective-c
|
|
|
```objc
|
|
|
/**
|
|
|
* @brief 用户ID
|
|
|
*/
|
... | ... | @@ -417,9 +417,9 @@ Destination 选择 "Frameworks" -> |
|
|
*/
|
|
|
@property(assign, nonatomic)NSInteger scalingMode;//屏幕适配方式,含义见上面
|
|
|
/**
|
|
|
* @brief ppt默认底色,不写默认为白色
|
|
|
* @brief ppt默认底色,不写默认为白色(@"#FFFFFF")
|
|
|
*/
|
|
|
@property(nonatomic,strong)UIColor *defaultColor;//ppt默认底色,不写默认为白色
|
|
|
@property(nonatomic, copy) NSString *defaultColor;//ppt默认底色,不写默认为白色(@"#FFFFFF")
|
|
|
/**
|
|
|
* @brief /后台是否继续播放,注意:如果开启后台播放需要打开 xcode->Capabilities->Background Modes->on->Audio,AirPlay,and Picture in Picture
|
|
|
*/
|
... | ... | @@ -448,7 +448,7 @@ Destination 选择 "Frameworks" -> |
|
|
|
|
|
新增 **HDQualityModel** 类 (切换线路清晰度)
|
|
|
|
|
|
```objective-c
|
|
|
```objc
|
|
|
@interface HDQualityModel : NSObject
|
|
|
/** 清晰度 */
|
|
|
@property (nonatomic, copy) NSString * _Nonnull quality;
|
... | ... | @@ -459,7 +459,7 @@ Destination 选择 "Frameworks" -> |
|
|
|
|
|
新增枚举类型
|
|
|
|
|
|
```objective-c
|
|
|
```objc
|
|
|
/**
|
|
|
* 音视频模式
|
|
|
* PLAY_MODE_TYEP_VIDEO 视频
|
... | ... | @@ -480,30 +480,37 @@ typedef NS_ENUM(NSUInteger, HAVE_AUDIO_LINE) { |
|
|
};
|
|
|
```
|
|
|
|
|
|
新增 **HDReplayDotModel** 类
|
|
|
|
|
|
```objc
|
|
|
/** 打点时间:单位:S */
|
|
|
@property (nonatomic, assign) NSInteger time;
|
|
|
/** 打点描述 */
|
|
|
@property (nonatomic, copy) NSString * _Nullable desc;
|
|
|
```
|
|
|
|
|
|
开始配置
|
|
|
|
|
|
```
|
|
|
第一步:实例化参数类
|
|
|
```objc
|
|
|
//第一步:实例化参数类
|
|
|
PlayParameter *parameter = [[PlayParameter alloc] init];
|
|
|
//配置PlayParameter里面的属性,如userId,roomId等!
|
|
|
第二步实例化RequestData类
|
|
|
//第二步实例化RequestData类
|
|
|
_requestDataPlayBack = [[RequestDataPlayBack alloc] initWithParameter:parameter];
|
|
|
_requestDataPlayBack.delegate = self;
|
|
|
第三步添加代理
|
|
|
//第三步添加代理
|
|
|
_requestDataPlayBack.delegate = self;
|
|
|
```
|
|
|
|
|
|
添加代理
|
|
|
|
|
|
```
|
|
|
```objc
|
|
|
@interface 您的控制器 ()<RequestDataPlayBackDelegate>
|
|
|
```
|
|
|
|
|
|
实现代理
|
|
|
|
|
|
```objective-c
|
|
|
```objc
|
|
|
/**
|
|
|
* @brief 请求回放地址成功
|
|
|
*/
|
... | ... | @@ -518,7 +525,7 @@ typedef NS_ENUM(NSUInteger, HAVE_AUDIO_LINE) { |
|
|
|
|
|
**至此您的项目已经可以运行了,并且已经集成好了视频基本功能;如果不需要文档功能则不配置文档相关属性即可,另外添加文档功能写一个定时器在视频开始播放时调用下面的方法即可**
|
|
|
|
|
|
```objective-c
|
|
|
```objc
|
|
|
/**
|
|
|
* (已废弃)
|
|
|
* @brief time:从直播开始到现在的秒数,SDK会在画板上绘画出来相应的图形
|
... | ... | @@ -529,7 +536,7 @@ typedef NS_ENUM(NSUInteger, HAVE_AUDIO_LINE) { |
|
|
|
|
|
代理方法 (可选)
|
|
|
|
|
|
```objective-c
|
|
|
```objc
|
|
|
/**
|
|
|
* @brief 播放器时间
|
|
|
* @param currentTime 当前时间
|
... | ... | @@ -544,7 +551,7 @@ typedef NS_ENUM(NSUInteger, HAVE_AUDIO_LINE) { |
|
|
|
|
|
3.2.1 代理方法(可选)
|
|
|
|
|
|
```objective-c
|
|
|
```objc
|
|
|
/**
|
|
|
* @brief 加载视频失败
|
|
|
*/
|
... | ... | @@ -638,7 +645,7 @@ typedef NS_ENUM(NSUInteger, HAVE_AUDIO_LINE) { |
|
|
|
|
|
3.2.2 主动方法(可选)
|
|
|
|
|
|
```objective-c
|
|
|
```objc
|
|
|
/**
|
|
|
* @brief 销毁文档和视频,清除视频和文档的时候需要调用,推出播放页面的时候也需要调用
|
|
|
*/
|
... | ... | @@ -771,7 +778,7 @@ typedef NS_ENUM(NSUInteger, HAVE_AUDIO_LINE) { |
|
|
|
|
|
3.3.1 代理方法(可选)
|
|
|
|
|
|
```objective-c
|
|
|
```objc
|
|
|
/**
|
|
|
* @brief 获取文档内白板或者文档本身的宽高,来进行屏幕适配用的
|
|
|
*/
|
... | ... | @@ -809,11 +816,17 @@ typedef NS_ENUM(NSUInteger, HAVE_AUDIO_LINE) { |
|
|
* 2 非动画文档加载完成
|
|
|
*/
|
|
|
- (void)docLoadCompleteWithIndex:(NSInteger)index;
|
|
|
/**
|
|
|
* @brief 回放打点数据
|
|
|
* @param dotList 打点信息
|
|
|
* @[HDReplayDotModel,HDReplayDotModel]
|
|
|
*/
|
|
|
- (void)HDReplayDotList:(NSArray *)dotList;
|
|
|
```
|
|
|
|
|
|
3.3.2 主动方法(可选)
|
|
|
|
|
|
```objective-c
|
|
|
```objc
|
|
|
/**
|
|
|
* @brief time:从直播开始到现在的秒数,SDK会在画板上绘画出来相应的图形
|
|
|
*/
|
... | ... | @@ -859,7 +872,7 @@ typedef NS_ENUM(NSUInteger, HAVE_AUDIO_LINE) { |
|
|
|
|
|
代理方法(可选)
|
|
|
|
|
|
```objective-c
|
|
|
```objc
|
|
|
/**
|
|
|
* @brief 获取房间信息,主要是要获取直播间模版来类型,根据直播间模版类型来确定界面布局
|
|
|
* 房间信息
|
... | ... | @@ -885,76 +898,132 @@ typedef NS_ENUM(NSUInteger, HAVE_AUDIO_LINE) { |
|
|
-(void)setMyViewerInfo:(NSDictionary *) infoDic;
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 3.5 聊天功能
|
|
|
|
|
|
代理方法(可选)
|
|
|
聊天功能的方法回调,相关类RequestDataPlayBack,相关方法如下:
|
|
|
|
|
|
| 方法 | 说明 | 备注 |
|
|
|
| :----------- | :----------------------- | ---------------------------------- |
|
|
|
| onParserChat | 解析本房间的历史聊天数据 | RequestDataPlayBack 代理方法(可选) |
|
|
|
|
|
|
```objective-c
|
|
|
示例代码
|
|
|
|
|
|
```objc
|
|
|
/**
|
|
|
* @brief 解析本房间的历史聊天数据
|
|
|
* @param chatArr [{ chatId //聊天ID
|
|
|
content //聊天内容
|
|
|
groupId //聊天组ID
|
|
|
time //时间
|
|
|
userId //用户ID
|
|
|
userName //用户名
|
|
|
userRole //用户角色}]
|
|
|
*/
|
|
|
-(void)onParserChat:(NSArray *)arr;
|
|
|
* @param arr 聊天数组
|
|
|
*/
|
|
|
- (void)onParserChat:(NSArray *)arr;
|
|
|
```
|
|
|
|
|
|
其中聊天数组包含字段信息如下:
|
|
|
|
|
|
| 字段 | 类型 | 注释 |
|
|
|
| -------------- | ------ | -------------------------------------------------- |
|
|
|
| chatId | String | 聊天消息ID |
|
|
|
| content | String | 聊天消息内容 |
|
|
|
| groupId | String | 组ID |
|
|
|
| time | int | 聊天消息时间 秒 |
|
|
|
| userId | String | 发送人userId |
|
|
|
| userName | String | 发送人昵称 |
|
|
|
| userRole | String | 发送人角色 (具体参考 回放用到的 “角色” 字段含义) |
|
|
|
| userAvatar | String | 发送人头像 |
|
|
|
| userCustomMark | String | 发送人自定义标记 |
|
|
|
| role | int | 发送人角色 (具体参考 回放用到的 “角色” 字段含义) |
|
|
|
| status | String | 是否显示此条消息(0: 不显示 1:显示) |
|
|
|
|
|
|
|
|
|
|
|
|
## 3.6 问答功能
|
|
|
|
|
|
代理方法(可选)
|
|
|
问答功能的方法回调,相关类RequestDataPlayBack,相关方法如下:
|
|
|
|
|
|
| 方法 | 说明 | 备注 |
|
|
|
| :------------------------------------ | :----------------------- | ---------------------------------- |
|
|
|
| onParserQuestionArr onParserAnswerArr | 解析本房间的历史问答数据 | RequestDataPlayBack 代理方法(可选) |
|
|
|
|
|
|
```objective-c
|
|
|
/**
|
|
|
* @brief 收到历史提问&回答
|
|
|
* @param questionArr [{content //问答内容
|
|
|
encryptId //加密ID
|
|
|
groupId //分组ID
|
|
|
isPublish //1 发布的问答 0 未发布的问答
|
|
|
questionUserId //问答用户ID
|
|
|
questionUserName //问答用户名
|
|
|
time //问答时间
|
|
|
triggerTime //问答具体时间}]
|
|
|
* @param answerArr [{answerUserId //回复用户ID
|
|
|
answerUserName //回复名
|
|
|
answerUserRole //回复角色(主讲、助教)
|
|
|
content //回复内容
|
|
|
encryptId //加密ID
|
|
|
groupId //分组ID
|
|
|
isPrivate //1 私聊回复 0 公共回复
|
|
|
time = 135; //回复时间
|
|
|
triggerTime //回复具体时间}]
|
|
|
示例代码
|
|
|
|
|
|
```objc
|
|
|
/**
|
|
|
* @brief 收到本房间的历史提问&回答
|
|
|
*/
|
|
|
- (void)onParserQuestionArr:(NSArray *)questionArr onParserAnswerArr:(NSArray *)answerArr;
|
|
|
```
|
|
|
|
|
|
其中 questionArr 数据中包含的字段信息如下:
|
|
|
|
|
|
| 字段 | 类型 | 注释 |
|
|
|
| ------------------ | ------ | ----------------------------------------------------- |
|
|
|
| id | String | 问答ID |
|
|
|
| content | String | 问答内容 |
|
|
|
| groupId | String | 组ID |
|
|
|
| time | int | 问答发布时间 秒 (相对时间) |
|
|
|
| questionUserId | String | 发送人ID |
|
|
|
| questionUserName | String | 发送人昵称 |
|
|
|
| questionUserAvatar | String | 发送人头像 |
|
|
|
| encryptId | String | 加密ID |
|
|
|
| isPublish | int | 是否发布此条问答 |
|
|
|
| ttriggerTime | String | 问答发布时间 秒 (绝对时间)例:"2012-09-03 00:09:43" |
|
|
|
|
|
|
answerArr 数组中包含的字段信息如下:
|
|
|
|
|
|
| 字段 | 类型 | 注释 |
|
|
|
| ---------------- | ------ | ------------------------------------------------------- |
|
|
|
| content | Sting | 回复内容 |
|
|
|
| groupId | String | 组ID |
|
|
|
| id | String | 回复ID |
|
|
|
| isPrivate | int | 是否是私密回复 |
|
|
|
| time | int | 发布回复的时间 秒 (相对时间) |
|
|
|
| triggerTime | String | 发布回复的时间 秒 (角色时间)例:"2012-09-03 00:09:43" |
|
|
|
| answerUserAvatar | String | 发送人头像 |
|
|
|
| answerUserId | String | 发送人ID |
|
|
|
| answerUserName | String | 发送人昵称 |
|
|
|
| answerUserRole | String | 发送人角色 (具体参考 回放用到的 “角色” 字段含义) |
|
|
|
| encryptId | String | 加密ID |
|
|
|
|
|
|
|
|
|
|
|
|
## 3.7 广播功能
|
|
|
|
|
|
代理方法(可选)
|
|
|
广播功能的方法回调,相关类RequestDataPlayBack,相关方法如下:
|
|
|
|
|
|
| 方法 | 说明 | 备注 |
|
|
|
| :------------------- | :------------------- | ---------------------------------- |
|
|
|
| broadcastHistory_msg | 解析本房间的广播数据 | RequestDataPlayBack 代理方法(可选) |
|
|
|
|
|
|
```objective-c
|
|
|
示例代码
|
|
|
|
|
|
```objc
|
|
|
/**
|
|
|
* @brief 收到本房间历史广播(The new method)
|
|
|
* @brief 收到本房间历史广播
|
|
|
* content 广播内容
|
|
|
* time 发布时间(单位:秒)
|
|
|
*/
|
|
|
- (void)broadcastHistory_msg:(NSArray *)array;
|
|
|
```
|
|
|
|
|
|
其中聊天数组包含字段信息如下:
|
|
|
|
|
|
| 字段 | 类型 | 注释 |
|
|
|
| ------------- | ------ | -------------------------------------------------- |
|
|
|
| content | String | 广播内容 |
|
|
|
| time | int | 发送广播时间 秒 |
|
|
|
| publisherId | String | 发送人ID |
|
|
|
| publisherName | String | 发送人昵称 |
|
|
|
| publisherRole | String | 发送人角色 (具体参考 回放用到的 “角色” 字段含义) |
|
|
|
|
|
|
|
|
|
|
|
|
## 3.8 随堂测
|
|
|
|
|
|
代理方法(可选)
|
|
|
|
|
|
```objective-c
|
|
|
```objc
|
|
|
/**
|
|
|
* @brief 接收到随堂测(The new method)
|
|
|
* @brief 接收到随堂测
|
|
|
* rseultDic 随堂测内容
|
|
|
resultDic {isExist //1 随堂考存在 0随堂考不存在
|
|
|
practice {id //随堂考主键ID
|
... | ... | @@ -967,14 +1036,25 @@ typedef NS_ENUM(NSUInteger, HAVE_AUDIO_LINE) { |
|
|
serverTime //分发时间}
|
|
|
*
|
|
|
*/
|
|
|
-(void)receivePracticeWithDic:(NSDictionary *) resultDic;
|
|
|
-(void)receivePracticeWithDic:(NSDictionary *)resultDic;
|
|
|
```
|
|
|
|
|
|
主动方法(可选)
|
|
|
|
|
|
```objc
|
|
|
/**
|
|
|
* @brief 获取随堂测信息
|
|
|
*/
|
|
|
- (void)getPracticeInformation;
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 3.9 视频播放状态
|
|
|
|
|
|
播放器状态类型
|
|
|
|
|
|
```objective-c
|
|
|
```objc
|
|
|
/**
|
|
|
* 视频播放状态
|
|
|
* HDMoviePlaybackStateStopped 播放停止
|
... | ... | @@ -1022,7 +1102,7 @@ typedef NS_ENUM(NSUInteger, HDMovieFinishReason) { |
|
|
|
|
|
代理方法(可选)
|
|
|
|
|
|
```objective-c
|
|
|
```objc
|
|
|
/**
|
|
|
* @brief 视频状态改变
|
|
|
* @param state
|
... | ... | @@ -1053,7 +1133,7 @@ typedef NS_ENUM(NSUInteger, HDMovieFinishReason) { |
|
|
- (void)HDMoviePlayerPlaybackDidFinish:(HDMovieFinishReason)reason;
|
|
|
/**
|
|
|
* @brief 播放器初始化完成 (会多次回调)
|
|
|
* @param dict 数据
|
|
|
* @param dict 数据
|
|
|
*/
|
|
|
- (void)HDMediaPlaybackIsPreparedToPlayDidChange:(NSDictionary *)dict;
|
|
|
```
|
... | ... | @@ -1062,7 +1142,7 @@ typedef NS_ENUM(NSUInteger, HDMovieFinishReason) { |
|
|
|
|
|
代理方法(可选)
|
|
|
|
|
|
```objective-c
|
|
|
```objc
|
|
|
/**
|
|
|
* @brief 视频加载速度
|
|
|
* @param speed 视频加载速度字符串
|
... | ... | @@ -1070,6 +1150,20 @@ typedef NS_ENUM(NSUInteger, HDMovieFinishReason) { |
|
|
- (void)onBufferSpeed:(NSString *)speed;
|
|
|
```
|
|
|
|
|
|
## 3.11 防录屏
|
|
|
|
|
|
主动方法(可选)
|
|
|
|
|
|
```objc
|
|
|
/**
|
|
|
* @brief 设置防录屏功能
|
|
|
* @param isEnable YES 开启 NO 关闭(默认)
|
|
|
*/
|
|
|
- (void)setAntiRecordScreen:(BOOL)isEnable;
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
# 4.常见问题
|
|
|
|
|
|
## 4.1 旋转屏错误
|
... | ... | @@ -1084,13 +1178,13 @@ typedef NS_ENUM(NSUInteger, HDMovieFinishReason) { |
|
|
|
|
|
HD云直播的页面跳转均是采用模态形式跳转
|
|
|
|
|
|
```objective-c
|
|
|
```objc
|
|
|
- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^ __nullable)(void))completion NS_AVAILABLE_IOS(5_0);
|
|
|
```
|
|
|
|
|
|
在每个控制器或者基类控制器设置旋转选项
|
|
|
|
|
|
```objective-c
|
|
|
```objc
|
|
|
#pragma mark - 屏幕旋转
|
|
|
- (BOOL)shouldAutorotate{
|
|
|
return NO;//该旋转的页面自己变量控制
|
... | ... | @@ -1141,7 +1235,7 @@ player.delegate = self |
|
|
|
|
|
错误大意为
|
|
|
|
|
|
```
|
|
|
```objc
|
|
|
Failed to verify bitcode in xxxxx
|
|
|
error: Bundle only contains bitcode-marker /var/folders/s5/lnk362pd4cs0lmtn_43ppjzw0000gn/T/XcodeDistPipeline.2TS/Root/Payload/268YK.appxxxxxxxxxx (armv7)
|
|
|
```
|
... | ... | @@ -1156,14 +1250,14 @@ error: Bundle only contains bitcode-marker /var/folders/s5/lnk362pd4cs0lmtn_43pp |
|
|
|
|
|
## 4.5 关于api回调所在线程问题
|
|
|
|
|
|
```objective-c
|
|
|
```objc
|
|
|
/**
|
|
|
* @brief 回放翻页数据列表 (会在子线程回调)
|
|
|
*/
|
|
|
- (void)pageChangeList:(NSMutableArray *)array;
|
|
|
```
|
|
|
|
|
|
```objective-c
|
|
|
```objc
|
|
|
/**
|
|
|
* @brief 获取ppt当前页数和总页数 (会在子线程回调)
|
|
|
*
|
... | ... | @@ -1175,7 +1269,7 @@ error: Bundle only contains bitcode-marker /var/folders/s5/lnk362pd4cs0lmtn_43pp |
|
|
- (void)onPageChange:(NSDictionary *) dictionary;
|
|
|
```
|
|
|
|
|
|
```objective-c
|
|
|
```objc
|
|
|
/**
|
|
|
* @brief 文档加载状态 (会在子线程回调)
|
|
|
* index
|
... | ... | @@ -1188,3 +1282,22 @@ error: Bundle only contains bitcode-marker /var/folders/s5/lnk362pd4cs0lmtn_43pp |
|
|
|
|
|
PS:直播、在线回放只有上述api会在子线程回调,其余的api均在主线程进行回调。
|
|
|
|
|
|
|
|
|
|
|
|
## 4.6 回放用到的 “角色” 字段含义
|
|
|
|
|
|
| 字段 | 注释 | int值参考 |
|
|
|
| ---------- | ------ | --------- |
|
|
|
| 云直播角色 | | |
|
|
|
| publisher | 主讲 | 1 |
|
|
|
| teacher | 助教 | 2 |
|
|
|
| host | 主持人 | 3 |
|
|
|
| student | 学生 | 4 |
|
|
|
| other | 其他 | 0 |
|
|
|
| | | |
|
|
|
| 云课堂角色 | | |
|
|
|
| presenter | 讲师 | 10 |
|
|
|
| talker | 学生 | 11 |
|
|
|
| audience | 旁听 | 12 |
|
|
|
| inspector | 隐身者 | 13 |
|
|
|
| assistant | 助教 | 14 | |