iOS

# 房间管理

本文将介绍多方视频中房间管理的相关功能。

# 1. 查询房间

如需查询房间相关信息,例如房间名称、是否存在、成员名、成员数,可以调用 query (opens new window) 接口进行查询操作

/**
  * 查询房间相关信息
  *
  * 调用此接口可以查询房间相关信息,例如房间是否存在,房间人数等,结果通过 {@link JRTCRoomCallback#onQuery onQuery} 回调通知
  *
  * @param roomId 房间标识
  * @return 操作id,与 {@link JRTCRoomCallback#onQuery onQuery} 回调中的 operationId 对应
  */
public abstract int query(String roomId);

查询操作发起后,查询结果通过 onQuery (opens new window) 回调上报:

/**
  * 查询房间信息结果回调
  *
  * 调用 {@link JRTCRoom#query query} 接口成功后,会收到此回调。
  * @param operationId  操作id,对应 {@link JRTCRoom#query query} 接口返回值
  * @param result       查询房间信息是否成功
  * - true: 查询成功
  * - false: 查询失败
  * @param reason       查询失败原因,当 result 为 false 时该值有效。失败原因参见:{@link ReasonCode 错误码}
  * @param queryInfo    JRTCRoomQueryInfo 对象,查询到的房间信息,当失败时只需关注 {@link JRTCRoomQueryInfo#getRoomId roomId}
  * @param room 当前 JRTCRoom 对象
  */
void onQuery(int operationId, boolean result, @ReasonCode int reason, JRTCRoomQueryInfo queryInfo, JRTCRoom room);

示例代码:

// 通过房间号查询房间信息
room.query("roomId");
public void onQuery(int operationId, boolean result, @ReasonCode int reason, JRTCRoomQueryInfo queryInfo, JRTCRoom room) {
   // 查询成功
   if (result) {
        // 房间号
        String roomId = queryInfo.getRoomId();
        // 房间号(服务器生成)
        int roomNumber = queryInfo.getRoomNumber();
        // 成员数
        int memberCount = queryInfo.getMemberCount();
        // 成员用户ID列表
        List<String>  userIdList = queryInfo.getMemberUserIdList();
   } else {
        // 查询失败
   }
}

# 2. 获取统计信息

实时统计信息用于在通话中查看音视频收发情况,以及分辨率、帧率、码率,网络情况等。

/**
* 获取统计信息
*
* 以Json字符串形式返回,其中包含 "Config", "Network","Transport" 和 "Participants" 4个节点:
* {
*      "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个空间层被订阅
*              }
*          }
*      }
* }
*/
public abstract String getStatistics();

/**
* 获取天赛实时统计信息
*
* 以Json字符串形式返回,包含以下信息:
* {
*  "localActor": "[username:2333@100645.cloud.justalk.com]", // actorID
*  "sendBWE": "1440",      // 发送带宽估计
*  "recvBWE": "929",       // 接收带宽估计
*  "sendBr": "16",         // 发送码率
*  "recvBr": "772",        // 接收码率
*  "sendJitter": "1",      // 发送jitter
*  "recvJitter": "0",      // 接收jitter
*  "sendLossRate": "0",    // 发送丢包率
*  "recvLossRate": "0",    // 接收丢包率
*  "encodeTime": "0",      // 编码时长
*  "rtt":"5",              // 往返延时
*  "audioSendBr": "19",    // 音频发送码率
*  "videoSendBr": "0",     // 视频发送码率
*  "audioLevel": "58",     // 音量
*  "event":""
* }
*/
public abstract String getJsonStats();

# 3. 获取通话唯一标识

通话唯一标识 getCallId (opens new window) 对应于业务管理平台上的callid,可用于查询录像数据、查询录像上传结果等等。

/**
 * 获取房间唯一标识(服务器生成)
 * @return 房间唯一标识
 */
public abstract String getCallId();

# 4. 房间中的自定义属性

# 设置房间属性

通过调用 setCustomProperty (opens new window) 设置房间属性,任何一个成员设置房间属性后,其他成员都将收到房间属性变化通知。

/**
 * 设置房间属性
 *
 * @param value 自定义属性的value值
 * @param key   自定义属性的key值
 * @return 接口调用结果
 * - true: 接口调用成功
 * - false: 接口调用异常
 */
public abstract boolean setCustomProperty(String key, String value);

其他成员会收到 onRoomPropertyChanged (opens new window) 回调通知

/**
 * 房间属性变化回调
 *
 * 当房间的属性发生变化时,会收到此回调,例如房间中有成员发起屏幕共享、录制状态发生变化等。
 *
 * @param propChangeParam  {@link JRTCRoom.PropChangeParam} 变化标识集合
 * @param room 当前 JRTCRoom 对象
 */
void onRoomPropertyChanged(JRTCRoom.PropChangeParam propChangeParam, JRTCRoom room);

# 获取房间属性

通过调用 getCustomProperty (opens new window) 获取已经在设置的房间属性。

/**
 * 获取房间属性
 *
 * 调用此接口来获取自定义房间属性
 *
 * @param key 自定义属性 key
 * @return 属性值
 */
public abstract String getCustomProperty(String key);

示例代码:

//成员1设置房间属性
this.room.setCustomProperty("key", "value");

//成员2接收房间属性变化通知
void onRoomPropertyChanged(JRTCRoom.PropChangeParam propChangeParam, JRTCRoom room) {
    //成员2获取房间属性
    String value = room.getCustomProperty("key");
}

# 5. 获取房间标题

第一个加入房间成员设置房间标题,其他成员加入后,可以通过调用 getTitle (opens new window) 获取到已经设置的房间标题,可根据实际需求使用。

/**
 * 获取房间标题
 *
 * @return 房间标题
 */
public abstract String getTitle();