Iot SDK 4.0.0
载入中...
搜索中...
未找到
jrtc.h 文件参考

浏览该文件的源代码.

结构体

struct  jrtc_photo_t
 镜头采集的图像 更多...
 
struct  jrtc_image_t
 视频流中的图像 更多...
 
struct  jrtc_slice_t
 相对某个起始地址的数据片 更多...
 
struct  jrtc_handler_t
 会话中的事件处理函数集合 更多...
 
struct  jrtc_options_t
 可选的会话参数 更多...
 

宏定义

#define JRTC_VERSION   "4.0.0"
 当前的版本号
 
#define JRTC_ROLE_SENDER   0x2
 发送者
 
#define JRTC_ROLE_PLAYER   0x4
 演示者, 其事件将被广播
 
#define JRTC_ROLE_OWNER   0x8
 唯一的拥有者
 
#define JRTC_STATUS_FORWARD_VIDEO   0x1
 通话时, 视频是否被转发
 
#define JRTC_STATUS_FORWARD_AUDIO   0x2
 通话时, 音频是否被转发
 
#define JRTC_STATUS_VIDEO   0x4
 本地, 视频设备是否可发送
 
#define JRTC_STATUS_AUDIO   0x8
 本地, 音频设备是否可发送
 
#define JRTC_STATUS_MEDIA   (JRTC_STATUS_AUDIO|JRTC_STATUS_VIDEO)
 本地, 音视频设备的是否可发送
 
#define JRTC_SENDING_AUDIO   (JRTC_STATUS_AUDIO|JRTC_STATUS_FORWARD_AUDIO)
 最终是否处于发送音频状态
 
#define JRTC_SENDING_VIDEO   (JRTC_STATUS_VIDEO|JRTC_STATUS_FORWARD_VIDEO)
 最终是否处于发送视频状态
 
#define jrtc_request_volume(jc)
 请求用户音量变化.
 
#define jrtc_request_netstate(jc)
 请求用户网络状态.
 

枚举

enum  jrtc_error {
  JRTC_ENIL = 0 , JRTC_EPERM = 1 , JRTC_ENONET = 64 , JRTC_EPROTO = 71 ,
  JRTC_EMSGSIZE = 90 , JRTC_ECONNRESET =104 , JRTC_ETIMEDOUT =101 , JRTC_ECONNREFUSED =111 ,
  JRTC_EOFFLINE = 128 , JRTC_EDECLINE = 129 , JRTC_EINVOKETIMEOUT = 130 , JRTC_ECALLSERVERERROR = 131 ,
  JRTC_EROOMNOTFND = 132 , JRTC_ECALLTIMEOUT = 133 , JRTC_ENOTREG = 134 , JRTC_ELOGIN = 135 ,
  JRTC_ETOKEN_NOTFOUND = 136 , JRTC_ETOKEN_INV = 137 , JRTC_ETOKEN_EXPIRE = 138 , JRTC_ECODECINVALID = 139 ,
  JRTC_EAUDIOCALL = 252 , JRTC_EAUDIO =253 , JRTC_EVIDEO =254 , JRTC_EBYE = 255
}
 错误值 更多...
 
enum  jrtc_dtype {
  JRTC_I420 = 0 , JRTC_NV12 = 1 , JRTC_UYVY = 2 , JRTC_JPEG = 3 ,
  JRTC_NV16 = 4 , JRTC_RGB565 = 64 , JRTC_H264 = 96 , JRTC_H263 = 97
}
 图像编码枚举 更多...
 
enum  jrtc_state {
  JRTC_CLOSED =0 , JRTC_LEAVING , JRTC_OPENED , JRTC_JOINING ,
  JRTC_JOINED , JRTC_TALKING
}
 通话状态 更多...
 
enum  jrtc_batch { JRTC_AUDIO_VOLUME = 1 , JRTC_USER_NETSTATE = 2 }
 全局动态的批量数据类型 更多...
 
enum  jrtc_device { JRTC_SPEAKER = 1 , JRTC_MICROPHONE = 2 , JRTC_CAMERA = 4 , JRTC_AUDIO = 3 }
 为了保持暂时兼容, 即将废弃的接口, 新项目上不要使用 * 更多...
 

函数

void jrtc_config (const char appKey[24], const char license[64], const char aesKey[16], const char tokens[128], const struct jrtc_handler_t *handler)
 全局配置, 只需调用一次, 内部将复制所有参数
 
struct jrtc_t * jrtc_open (const char channelId[64], const char uid[64], struct jrtc_image_t *video, struct jrtc_image_t *camera, struct jrtc_options_t *options)
 分配通话资源并启动网络线程.
 
void jrtc_close (struct jrtc_t *jc, enum jrtc_error err)
 等待网络线程结束.
 
enum jrtc_error jrtc_error (const struct jrtc_t *jc)
 返回最近的错误值
 
enum jrtc_state jrtc_state (const struct jrtc_t *jc)
 返回通话状态
 
enum jrtc_state jrtc_leave (struct jrtc_t *jc, enum jrtc_error err)
 主动离开/挂断, 不会阻塞, 也没有后续任何事件.
 
void jrtc_set_video (struct jrtc_t *jc, const char vid[64], int index)
 请求视频源.
 
void jrtc_set_status (struct jrtc_t *jc, const char uid[64], unsigned mask, unsigned status)
 请求设置用户的状态.
 
void jrtc_set_role (struct jrtc_t *jc, const char uid[64], unsigned mask, unsigned role)
 请求设置用户的角色.
 
void jrtc_set_index (struct jrtc_t *jc, const char uid[64], int index)
 请求绑定用户的索引值.
 
void jrtc_request_batch (struct jrtc_t *jc, int types)
 请求会话中的动态批量数据.
 
void * jrtc_set_ptr (struct jrtc_t *jc, void *ptr)
 保存外部指针, 返回上次值
 
void * jrtc_get_ptr (struct jrtc_t *jc)
 返回保存的指针,初始值为NULL
 
void jrtc_set_camera (struct jrtc_t *jc, int camera, void(*effect)(struct jrtc_photo_t *frame))
 动态设置前后镜头.
 
void jrtc_activate (struct jrtc_t *jc, int devices)
 开启发送状态.
 
void jrtc_deactivate (struct jrtc_t *jc, int devices)
 关闭发送状态.
 

变量

unsigned _jrtc_net_id
 展锐 Mocor 平台 需要设置PDP流程后获得的网络 ID
 
unsigned _jrtc_cam_angle
 展锐 Mocor 平台的镜头角度.
 
void * _jrtc_net_info
 quectel 平台的全局拨号信息地址.
 

宏定义说明

◆ JRTC_VERSION

#define JRTC_VERSION   "4.0.0"

当前的版本号

在文件 jrtc.h76 行定义.

◆ jrtc_request_volume

#define jrtc_request_volume ( jc)
值:
@ JRTC_AUDIO_VOLUME
请求用户音量大小
定义 jrtc.h:495
void jrtc_request_batch(struct jrtc_t *jc, int types)
请求会话中的动态批量数据.

请求用户音量变化.

将触发jrtc_handler_t::on_audio_volume回调

在文件 jrtc.h505 行定义.

◆ jrtc_request_netstate

#define jrtc_request_netstate ( jc)
值:
@ JRTC_USER_NETSTATE
请求用户网络状态
定义 jrtc.h:496

请求用户网络状态.

将触发jrtc_handler_t::on_user_netstate回调

在文件 jrtc.h509 行定义.

枚举类型说明

◆ jrtc_error

enum jrtc_error

错误值

枚举值
JRTC_ENIL 

操作成功, 没有发生错误

JRTC_EPERM 

非法操作, 通常是参数错误

JRTC_ENONET 

无网络, 请检查设备状态

JRTC_EPROTO 

内部协议错误

JRTC_EMSGSIZE 

数据超过限制

JRTC_ECONNRESET 

连接被重置, 可能网络已断开

JRTC_ETIMEDOUT 

连接超时, 服务或对方无响应

JRTC_ECONNREFUSED 

连接被拒绝或关闭, 可能网络受限或太差

JRTC_EOFFLINE 

对方不在线

JRTC_EDECLINE 

对方已拒绝

JRTC_EINVOKETIMEOUT 

调用服务超时, 请检查服务器

JRTC_ECALLSERVERERROR 

呼叫服务失败, 请检查服务器

JRTC_EROOMNOTFND 

会话或对方不存在, 可能账户不对

JRTC_ECALLTIMEOUT 

呼叫超时, 请检查服务器

JRTC_ENOTREG 

设备未注册, 请使用合法的授权设备

JRTC_ELOGIN 

设备登入失败, 请使用授权的appKey和设备

JRTC_ETOKEN_NOTFOUND 

找不到对应的鉴权凭证, 请使用授权的appKey

JRTC_ETOKEN_INV 

无效的鉴权凭证

JRTC_ETOKEN_EXPIRE 

鉴权凭证已过期

JRTC_ECODECINVALID 

通信的编码设置无效

JRTC_EAUDIOCALL 

external audio call, don't close audio deivce

JRTC_EAUDIO 

本地音频异常, 请检查当前Mic或稍后重试

JRTC_EVIDEO 

本地视频异常, 请检查当前镜头或稍后重试

JRTC_EBYE 

对方正常挂断

在文件 jrtc.h79 行定义.

◆ jrtc_state

enum jrtc_state

通话状态

枚举值
JRTC_CLOSED 

初始状态

JRTC_LEAVING 

jrtc_leave 或内部出错后的状态

JRTC_OPENED 

向服务请求后的等待状态

JRTC_JOINING 

加入中的临时状态

JRTC_JOINED 

成功加入会话, 将打开音视频设备

JRTC_TALKING 

收到媒体后的状态

在文件 jrtc.h410 行定义.

◆ jrtc_batch

enum jrtc_batch

全局动态的批量数据类型

枚举值
JRTC_AUDIO_VOLUME 

请求用户音量大小

JRTC_USER_NETSTATE 

请求用户网络状态

在文件 jrtc.h493 行定义.

◆ jrtc_device

为了保持暂时兼容, 即将废弃的接口, 新项目上不要使用 *

通话中的媒体设备.

弃用
该枚举和相关函数都将废弃, 不要使用
枚举值
JRTC_SPEAKER 
JRTC_MICROPHONE 
JRTC_CAMERA 
JRTC_AUDIO 

在文件 jrtc.h584 行定义.

函数说明

◆ jrtc_config()

void jrtc_config ( const char appKey[24],
const char license[64],
const char aesKey[16],
const char tokens[128],
const struct jrtc_handler_t * handler )

全局配置, 只需调用一次, 内部将复制所有参数

注解
RTC1.0中的ticket 作为通话ID, 唯一标识每次通话:
  • 不能包含JSON需转义的字符
  • 每次通话, 要使用不同的 ticket,(随机产生或向服务器申请)
  • A 呼叫前,申请获得 ticket
  • A 需要通"某种推送机制"(长连接,推送方式) 将 ticket 通知到B
  • A 和B 对呼时, 必须使用相同的ticket, 以便服务器精确标识会话
参数
[in]appKey当前APP特有的标识, 固定长度24, 需向Juphoon申请获得
[in]license自定义的设备许可标识, 要求在appKey内唯一, 长度不超64, 且需要向Juphoon 登记并激活. 注意: 对接RTC1.0服务时, 代替之前RTC1.0中的ticket, 用于标识区分会话.
[in]aesKey通讯密钥, 必须与 appKey 匹配, 固定长度16, 需向Juphoon申请或注册
[in]tokens用于鉴权的凭证, 长度不超128
[in]handler统一的事件处理回调集合, 若 NULL, 则不处理事件
注解
appKey, license, aesKey, tokens 都不能包含JSON需转义的字符

◆ jrtc_open()

struct jrtc_t * jrtc_open ( const char channelId[64],
const char uid[64],
struct jrtc_image_t * video,
struct jrtc_image_t * camera,
struct jrtc_options_t * options )

分配通话资源并启动网络线程.

若加入多人通话, 成功后将收到jrtc_handler_t::on_user_joined事件

注解
对接RTC1.0服务时,注意三点:
  • 每次会话要设置jrtc_config中的license, 代替之前RTC1.0中的ticket
  • channelId 必须是对端的uid或以room:前缀的房间地址
  • uid 必须是由Juphoon授权的固定账户,服务端会根据uid判断是否是合法用户
参数
[in]channelId会话名(频道名) 注意: 对接RTC1.0服务时, 必须是对端的uid或以room:前缀的房间地址
[in]uid自定义的用户名, 要求在会话内唯一. 注意: 对接RTC1.0服务时, 必须是由Juphoon授权的固定账户
[in,out]video期望接收视频的建议值. 若 NULL, 则不接收视频
[in,out]camera期望发送视频的建议值. 若 NULL, 则不发送视频
[in]options其他可选参数. 若 NULL, 则使用默认值
返回值
会话句柄
注解
uid 和 channelId 不能相等
  • 最终的实际收发参数, 都由服务器协商决定.
  • 若界面上, 检测到 video 和 camera 中的 width,height 都为0, 说明协商后不支持视频, 自动转为音频通话
  • video, camera 指向的 jrtc_image_t 结构 同时用于界面渲染和内部更新, 因此会话中都必须一起保持内存有效,

◆ jrtc_close()

void jrtc_close ( struct jrtc_t * jc,
enum jrtc_error err )

等待网络线程结束.

注解
通话资源在网络线程中释放
参数
[in]err挂断原因, 参考jrtc_leave

◆ jrtc_error()

enum jrtc_error jrtc_error ( const struct jrtc_t * jc)

返回最近的错误值

◆ jrtc_state()

enum jrtc_state jrtc_state ( const struct jrtc_t * jc)

返回通话状态

◆ jrtc_leave()

enum jrtc_state jrtc_leave ( struct jrtc_t * jc,
enum jrtc_error err )

主动离开/挂断, 不会阻塞, 也没有后续任何事件.

注解
这里只改变状态, 销毁将在jrtc_schedule中自动处理 所以最终仍需jrtc_close回收该网络线程
参数
[in]err主动挂断为 JRTC_EBYE 但当语音电话中断时, 须设置为 JRTC_EAUDIOCALL, 其他未知情况,可设置为 JRTC_ENIL (不修改挂断原因)
返回值
返回通话状态

◆ jrtc_set_video()

void jrtc_set_video ( struct jrtc_t * jc,
const char vid[64],
int index )

请求视频源.

默认初始值由 jrtc_options_t::vid 指定 一旦设置后, 共享者改变或用户重新加入导致的视频源失效, 内部都会自动请求 请求后收到首帧图像时将触发 jrtc_handler_t::on_video_changed 事件

参数
[in]vid视频源. 可以是用户视频 uid 或 共享屏幕 channelId, 空则不接收视频
[in]index同时绑定该用户的索引值, 范围[1, 255], 负数表示删除, 0 则不修改
注解
未连接服务或 vid 非法时调用无效。 其他情况均阻塞式发送请求, 最终由服务决定是否可以切换视频源

◆ jrtc_set_status()

void jrtc_set_status ( struct jrtc_t * jc,
const char uid[64],
unsigned mask,
unsigned status )

请求设置用户的状态.

状态变化后将收到 on_user_changed 事件

参数
[in]uid用户ID
[in]mask修改的位掩码
[in]status设置的状态集合
注解
只修改由mask指定的位, 不影响其他位。 即按如下计算 用户状态 = (用户状态 & ~mask) | (status & mask)

允许 uid 为空或未连接服务时强制设置自身状态且不广播, 其他情况均阻塞式发送请求, 最终由服务广播实际的状态值

◆ jrtc_set_role()

void jrtc_set_role ( struct jrtc_t * jc,
const char uid[64],
unsigned mask,
unsigned role )

请求设置用户的角色.

状态变化后将收到 on_user_changed 事件

参数
[in]uid用户ID
[in]mask修改的位掩码
[in]role设置的角色集合
注解
只修改由mask指定的位, 不影响其他位。 即按如下计算 用户角色 = (用户角色 & ~mask) | (role & mask)

未连接服务或 uid 非法时调用无效。 其他情况均阻塞式发送请求, 最终由服务广播实际的角色值

◆ jrtc_set_index()

void jrtc_set_index ( struct jrtc_t * jc,
const char uid[64],
int index )

请求绑定用户的索引值.

因此允许 uid 映射为数值型的 index( 索引值 )

注解
尽量避免使用该函数, 而使用 jrtc_handler_t::on_user_joined/jrtc_handler_t::on_user_changed的返回值绑定索引值. 因为请求 (jrtc_set_index/jrtc_set_role/jrtc_set_status/jrtc_set_video) 每次只能发送一个,连续多次时可能阻塞, 而且index不同可能导致其他异步问题。
参数
[in]uid用户ID
[in]index索引值, 范围[1, 255], 负数表示删除, 0 则忽略

◆ jrtc_request_batch()

void jrtc_request_batch ( struct jrtc_t * jc,
int types )

请求会话中的动态批量数据.

参数
[in]typesjrtc_batch 类型集合

◆ jrtc_set_ptr()

void * jrtc_set_ptr ( struct jrtc_t * jc,
void * ptr )

保存外部指针, 返回上次值

◆ jrtc_get_ptr()

void * jrtc_get_ptr ( struct jrtc_t * jc)

返回保存的指针,初始值为NULL

◆ jrtc_set_camera()

void jrtc_set_camera ( struct jrtc_t * jc,
int camera,
void(* effect )(struct jrtc_photo_t *frame) )

动态设置前后镜头.

参数
[in]camera0为后镜头,1是前镜头
[in]effect编码前图像的处理回调 禁止改变图像尺寸和格式. 可设置为 NULL
static char* imgbuf = NULL;
//只镜像发送图像
jrtc_set_camera(jc, 1, [](struct jrtc_photo_t* frame){
if (!imgbuf) imgbuf = new char[frame->bytes];
assert (frame->format == JRTC_NV12 && "根据平台选择转换函数");
jrtc_nv12_mirror(frame, frame->width, frame->height, imgbuf);
frame->data = imgbuf;
});
//只镜像预览图像
jrtc_set_camera(jc, 1, [](struct jrtc_photo_t* frame){
auto preview = frame->data;
if (!imgbuf) imgbuf = new char[frame->bytes];
frame->data = memcpy(imgbuf, preview, frame->bytes);
assert (frame->format == JRTC_NV12 && "根据平台选择转换函数");
jrtc_nv12_mirror(frame, frame->width, frame->height, preview);
});
//同时镜像预览和发送图像
jrtc_set_camera(jc, 1, [](struct jrtc_photo_t* frame){
auto preview = frame->data;
if (!imgbuf) imgbuf = new char[frame->bytes];
frame->data = memcpy(imgbuf, preview, frame->bytes);
assert (frame->format == JRTC_NV12 && "根据平台选择转换函数");
jrtc_nv12_mirror(frame, frame->width, frame->height, preview);
frame->data = preview;
});
@ JRTC_NV12
图像字节数=W*H*3/2
定义 jrtc.h:131
void jrtc_nv12_mirror(const struct jrtc_photo_t *src, int dst_w, int dst_h, char *dst)
void jrtc_set_camera(struct jrtc_t *jc, int camera, void(*effect)(struct jrtc_photo_t *frame))
动态设置前后镜头.
镜头采集的图像
定义 jrtc.h:144
char format
jrtc_dtype 采集预览格式
定义 jrtc.h:149
void * data
图像数据
定义 jrtc.h:145
unsigned short width
图像宽
定义 jrtc.h:147
unsigned short height
图像高
定义 jrtc.h:148
unsigned bytes
图像数据长度
定义 jrtc.h:146

◆ jrtc_activate()

void jrtc_activate ( struct jrtc_t * jc,
int devices )

开启发送状态.

参数
[in]devices设备jrtc_device 的集合
弃用
将废弃, 请直接使用jrtc_set_status. 对应代码:
int status = 0;
if (devices & JRTC_SPEAKER) MME_MutePlayout(0);
if (devices & JRTC_MICROPHONE) status |= JRTC_STATUS_AUDIO;
if (devices & JRTC_CAMERA) status |= JRTC_STATUS_VIDEO;
jrtc_set_status(jc, NULL, status, status);
#define JRTC_STATUS_AUDIO
本地, 音频设备是否可发送
定义 jrtc.h:238
#define JRTC_STATUS_VIDEO
本地, 视频设备是否可发送
定义 jrtc.h:236
void jrtc_set_status(struct jrtc_t *jc, const char uid[64], unsigned mask, unsigned status)
请求设置用户的状态.
@ JRTC_MICROPHONE
定义 jrtc.h:587
@ JRTC_CAMERA
定义 jrtc.h:588
@ JRTC_SPEAKER
定义 jrtc.h:586

◆ jrtc_deactivate()

void jrtc_deactivate ( struct jrtc_t * jc,
int devices )

关闭发送状态.

参数
[in]devices设备jrtc_device 的集合
弃用
将废弃, 请直接使用jrtc_set_status. 对应代码:
int status = 0;
if (devices & JRTC_SPEAKER) MME_MutePlayout(1);
if (devices & JRTC_MICROPHONE) status |= JRTC_STATUS_AUDIO;
if (devices & JRTC_CAMERA) status |= JRTC_STATUS_VIDEO;
jrtc_set_status(jc, NULL, status, ~status);