# 房间管理
本文将介绍视频双录中房间管理的相关功能。
# 1. 查询房间
如需查询房间相关信息,例如房间名称、是否存在、成员名、成员数,可以调用 query (opens new window) 接口进行查询操作。
/**
* 查询房间相关信息
*
* 调用此接口可以查询房间相关信息,例如房间是否存在,房间人数等,结果通过 {@link JRTCRoomCallback.onQuery:result:reason:queryInfo:room: onQuery} 回调通知
*
* @param roomId 房间号
* @return 操作ID,与 {@link JRTCRoomCallback.onQuery:result:reason:queryInfo:room: onQuery} 回调中的 operationId 对应
*/
- (int)query:(NSString* __nonnull)roomId;
查询操作发起后,查询结果通过 onQuery (opens new window) 回调上报:
/**
* 查询房间信息结果回调
*
* 调用 {@link JRTCRoom.query: query} 接口成功后,会收到此回调。
* @param operationId 操作id,对应 {@link JRTCRoom.query: query} 接口返回值
* @param result 查询房间信息是否成功
* - true: 查询成功
* - false: 查询失败
* @param reason 查询失败原因,当 result 为 false 时该值有效。失败原因参见:@ref ReasonCode "错误码"
* @param queryInfo JRTCRoomQueryInfo 对象,查询到的房间信息,当失败时只需关注 {@link JRTCRoomQueryInfo.roomId roomId}
* @param room 当前 JRTCRoom 对象
*/
- (void)onQuery:(int)operationId result:(bool)result reason:(ReasonCode)reason queryInfo:(JRTCRoomQueryInfo*)queryInfo room:(JRTCRoom *)room;
示例代码:
// 查询
[_room query:@"roomId"];
// 查询结果通知
- (void)onQuery:(int)operationId result:(bool)result reason:(ReasonCode)reason queryInfo:(JRTCRoomQueryInfo*)queryInfo room:(JRTCRoom *)room {
if (result) {
// 房间号
NSString* roomId = queryInfo.roomId;
// 房间号(服务器生成)
int number = queryInfo.number;
// 房间成员数
int clientCount = queryInfo.roomNumber;
// 房间成员ID列表
NSMutableArray *members = queryInfo.members;
} else {
// 查询失败
}
}
# 2. 获取统计信息
实时统计信息用于在通话中查看音视频收发情况,以及分辨率、帧率、码率、网络情况等。
/**
* 获取统计信息
*
* 以字符串形式返回,其中包含 "Config", "Network","Transport" 和 "Participants" 4个节点,统计信息具体内容如下: <br>
* {
* "Config": // 音视频设置信息
* {
* "Audio Config: // 音频设置
* {
* "SRTP": off, // 是否对音频RTP数据加密,以及加密会显示使用的加密协议,加密协议两端一致才会音频互通正常
* "Codec": opus, // 本端设置的音频编码
* "Payload": 116, // 音频payload的大小
* "Bitrate": 16000, // 音频码率
* "Pkt Len": 60, // 音频包长
* "Nack": off, // 丢包是否允许数据包重传
* "RTX": off, // 是否允许RTX技术
* "FEC/RED": off, // 是否开启FEC
* "AEC": on, // 是否开启回声消除
* "Mode": OS, // AEC模式
* "HowlSupp": Auto, // AEC HowlSupp模式
* "Sts": Auto, // AEC Sts模式
* "AGC": on, // 是否开启发送端自动增益
* "Mode": Fixed, // 发送端AGC Mode
* "Target": 3, // 发送端AGC Target
* "Gain": 9, // 接收端AGC Gain
* "Rx AGC": off, // 是否开启接收端自动增益
* "Mode": Fixed, // 接收端AGC Mode
* "Target": 3, // 接收端AGC Target
* "Gain": 9, // 接收端AGC Gain
* "VAD": off, // 是否开启VAD
* "Mode": Mid, // VAD Mode
* "ANR": off, // 是否开启发送端噪音抑制
* "Mode": High, // ANR mode
* "Noise": N/A, // 噪音音量
* "SNR": N/A, // 信噪比
* "Rx ANR": off, // 是否开启接收端噪音抑制
* "Mode": Low, // 接收端ANR mode
* "ARS": off, // 是否开启音频码率控制
* "BR Min": N/A, // ARS码率最小值
* "BR Max": N/A // ARS码率最大值
* },
"Video Config": // 视频设置
* {
* "SRTP": off, // 是否对音频RTP数据加密,以及加密会显示使用的加密协议,加密协议两端一致才会音频互通正常
* "Codec": H264-SVC, // 双方通话采用的编解码类型
* "Payload": 125, // 视频Payload的大小
* "Bitrate": 2250, // 视频码率,单位kbps
* "Framerate": 24, // 视频帧率,单位fps
* "Resolution": 1280x720, // 视频分辨率
* "FEC": on|124|123, // FEC是否打开和payload的类型号
* "FIR": off, // 是否允许重发关键帧
* "Key Interval": 0, // 允许的最小关键帧间隔
* "Repeat": 0, // 关键帧丢失是否允许重发
* "NACK": off, // 丢包是否允许数据包重传
* "RTX": off, // 是否允许RTX技术,RTX的payload类型
* "TMMBR": off, // 是否允许带宽估计
* "RPSI": off, // 是否允许RPSI技术
* "Small NALU": on, // 是否允许NALU技术
* "ARS": off, // 是否开启ARS自动码率检测
* "BR Min": 10, // ARS发送码率下限
* "BR Max": 2000, // ARS发送码率上限
* "FR Min": 1, // ARS发送帧速率下限
* "FR Max": 30, // ARS发送帧速率上限
* "Res. Ctrl": off, // 是否允许分辨率控制
* "Res. Mode": 0, // 分辨率Mode
* "Fr Ctrl": on, // 是否允许帧速率控制
* "CPU Load Ctrl": off, // 是否允许CPU控制
* "Target": 80, // CPU控制的最大使用率
* "Bw Efficient": off, // 是否采用节省带宽模式
* "Error Conceal": off, // 是否允许错误隐藏技术,在解码出错的时候采用
* "Enhance color": off, // 是否采用颜色增强技术
* "Boost bright": off, // 是否采用亮度增强技术
* "Boost contrast": off, // 是否采用对比度增强技术
* "RTP Ext": CVO, // 使用的RTP扩展的类型
* "Render Name": N/A, // 渲染图像的名字
* "SVC": "320 180 250 640 360 600 1280 720 1400", // 会议SVC配置
* "TemporalLayers": 4, // 取值1、2、3、4,会议时间层设置
* "PreferMode":Clear // 偏好设置
* }
* },
* "Network": // 网络统计信息
* {
* "Send Statistic: // 数据发送统计信息
* {
* "Packets": 181|1305|0|0, // 发送的数据包的个数。正常包个数 | 探测包个数 | RED包个数 | NACK包个数
* "RTT": 4, // 网络双向延时的时间,单位为毫秒
* "Jitter": 2, // 网络的扰动,表征数据包抖动的时间,单位毫秒
* "Lost": 2, // 丢失的数据包的个数
* "LostRate": 0, // 当前的丢包率,单位百分比
* "RelayLost": 0, // 服务器转发丢包率
* "RelayRtt": 0, // 服务器转发往返时延,单位为毫秒
* "BitRate/BWE": 16/1345, // BitRate表示当前发送的数据包的码率,单位kbps;BWE表示当前发送带宽的估计值
* "AudioSend": 0|0, // 实际发送音频包次数|估计发送音频包次数
* "VideoSend": 0|0, // 实际发送视频包次数|估计发送视频包次数
* "ScreenSend": 0|0, // 实际发送屏幕共享包次数|估计发送屏幕共享包次数
* "MaxPredKbps": 100, // 发送最大需求码率
* "Server(102679111220103708)": // 选用的第一个服务器
* [
* 2211(1): BWE(1345|697) LOSS(0|0) OUT(A:37) IN(A:0;)
* ]
* },
* "Recv Statistic": // 数据接收统计信息
* {
* "Packets": 1423|675|0|0, // 收到的数据包的个数。正常包个数 | 探测包个数 | RED包个数 | NACK包个数
* "Jitter": 1, // 网络的扰动,表征数据包乱序的时间,单位毫秒
* "Lost": 0, // 丢失的数据包的个数
* "Lost Ratio": 0, // 当前的丢包率,单位百分比
* "BitRate/BWE":178/2291, // BitRate表示当前接收的数据包的码率,单位kbps;BWE表示当前接收带宽的估计值
* "Server(102679111220103708)": // 选用的第一个服务器
* [
* 2211(3): BWE(1979|2150) LOSS(0|0) OUT(A:37;FPS:24,FEC:10,SUB:00f0=3456) IN(A:17;V:2273=2211[00f0]2273)
* ]
* },
* }
* "Transport": // 运输通道
* {
* "Local": 2.1923737535:32414, // 本地地址
* "Remote": 2:11023, // 远端地址
* "LastPaths": 2,2, // 最后使用通道
* "Path": 2 [udp], // 通道名
* "Step1": Delay/Loss(S/R): 4/0/0, // 通道质量
* "Cost": 7** (best: -1) // 通道分数
*
* },
* "Participants":
* {
* "2333": // 成员为自己
* {
* "Audio Sending Stats": // 音频发送数据统计
* {
* "Packets": 143, // 发送的数据包的个数
* "BitRate": 18.5, // 发送的数据包的码率,单位kbps
* "FecPrecent": 0 // 音频Fec保护百分比,N/A表示未开启FEC保护
* },
* "Video Sending Stats": // 视频发送数据统计
* {
* "Packets": 19502, // 发送的数据包的个数
* "Capture Res": 640x360, // 视频采集分辨率
* "Capture Fr": 30, // 视频采集帧率
* "FPS/IDR": [0|0|24|0]/3, // 当前视频发送帧速/已发送的视频关键帧数
* "Resolution": 1280x720[0|0|0], // 当前发送图像最大尺寸。[]中为每种尺寸的帧率,取值范围为0到f(十六进制),0表示该层视频未被发送, 值越大表示该层视频帧率越高;
* "Bitrate/Setrate": 0/2250, // Bitrate表示当前发送的数据包的码率,单位kbps; Setrate表示视频编码的目标码率,单位kbps。
* "QP": 20, // 发送当前图像的量化步长(0-51),越小图像画质越好。
* "EncodeTime": 10, // 当前编码时间,可以体现终端编码时占用的CPU性能,越大表示CPU占有越高,单位毫秒
* "Codec": H264-SVC, // 采用的编解码类型
* "FecPrecent": 20 // 视频Fec保护百分比,N/A表示未开启FEC保护
* },
* "Be Subscribed Stats": // 被订阅统计信息
* {
* "Audio": true, // 音频是否被订阅
* "Video": [0|0|F|0] // [S0|S1|S2|S3]表示4个空间层被订阅
* },
* "Publish Stats": // 当前音视频发布状态
* {
* "Audio": true, // 当前音频发布状态
* "Video": true // 当前视频发布状态
* }
* },
* "6666": // 成员不是自己
* {
* "Audio Receiving Stats": // 音频接收统计信息
* {
* "Packets": 40243, // 接收的数据包的个数
* "BitRate": 18.5, // 当前接收的数据包的码率,单位kbps。
* "EpdRate/lr/dc": 0/0/0, // expand rate/loss rate/discard rate。neteq buffer中的扩展比例/丢包比例/丢弃比例
* },
* "Video Receiving Stats": // 视频接收统计信息
* {
* "Packets": 19502, // 接收的数据包的个数
* "BitRate": 161, // 当前发送的数据包的码率,单位kbps
* "FPS/FIR": 24/0, // 当前视频接收帧率/视频关键帧请求个数
* "Resolution": 1280x720, // 当前接收分辨率
* "Render FR": 24, // 当前渲染帧速率
* "Codec": H264-SVC, // 采用的编解码类型
* "PvMos": 4.9, // 表示过去5s平均流畅度MOS分,每5s更新一次。体现视频画面的流畅程度。1到5分,1分最差,5分最好
* "SMOS": 5, // 表示当前清晰度MOS分。体现视频画面的清晰程度。1到5分,1分最差,5分最好。前5s是0,是正常现象,因为PvMos还没有值
* },
* "Subscribed Stats": // 订阅统计信息
* {
* "Channel Audio": true, // 当前是否发布音频
* "Audio": true, // 当前音频订阅状态
* "Video": [0|0|F|0] // [S0|S1|S2|S3]表示4个空间层被订阅
* }
* }
* }
* }
*/
- (NSString* __nullable)getStatistics;
示例代码:
NSString *statistics = [_room getStatistics];
# 3. 获取通话唯一标识
通话唯一标识 callId (opens new window) 对应于业务管理平台上的 callId ,可用于查询录像数据、查询录像上传结果等等。
/**
* 通话唯一标识
*/
@property (nonatomic, copy) NSString *callId;
# 4. 房间中的自定义属性
# 设置房间属性
通过调用 setCustomProperty (opens new window) 设置房间属性,任何一个成员设置房间属性后,其他成员都将收到房间属性变化通知。
/**
* 设置房间中的自定义属性
*
* @param value 自定义属性的value值
* @param key 自定义属性的key值
* @return 接口调用结果
* - true: 接口调用成功
* - false: 接口调用异常
*/
- (bool)setCustomProperty:(NSString* __nonnull)value forKey:(NSString* __nonnull)key;
其他成员会收到 onRoomPropertyChanged (opens new window) 回调通知。
/**
* 房间属性变化回调
*
* 当房间的属性发生变化时,会收到此回调,例如房间中有成员发起屏幕共享、录制状态发生变化等。
*
* @param changeParam JRTCRoomPropChangeParam 变化标识集合
* @param room 当前 JRTCRoom 对象
*/
- (void)onRoomPropertyChanged:(JRTCRoomPropChangeParam *)changeParam room:(JRTCRoom *)room;
# 获取房间属性
通过调用 getCustomProperty (opens new window) 获取已经在设置的房间属性。
/**
* 获取自定义房间属性
*
* 调用此接口来获取自定义房间属性
*
* @param key 自定义属性 key
* @return 属性值
*/
- (NSString* __nullable)getCustomProperty:(NSString* __nonnull)key;
示例代码:
//成员1设置房间属性
[_room setCustomProperty:@"value" forKey:@"key"];
//成员2接收房间属性变化通知
- (void)onRoomPropertyChanged:(JRTCRoomPropChangeParam *)changeParam room:(JRTCRoom *)room {
//成员2获取房间属性
NSString *value = [_room getCustomProperty:@"key"];
}
# 5. 获取房间标题
第一个加入房间成员设置房间标题,其他成员加入后,可以通过调用 title (opens new window) 获取到已经设置的房间标题,可根据实际需求使用。
/**
* 房间标题
*/
@property (nonatomic, readonly, copy, nullable) NSString *title;