本文主要介绍了 Android SDK 中 RTC 相关的 API。
创建房间
public void createRoom(Context context,
final final IdrsSdk.SdkInitCallBack sdkInitCallBack)
请求参数
参数 | 类型 | 说明 | 是否必须 |
context | Context | 上下文 | 是 |
sdkInitCallBack | SdkInitCallBack | 创建的房间的回调接口 | 是 |
返回值
无
代码示例
IdrsSdk.getInstance().createRoom(this, new IdrsSdk.SdkInitCallBack() {
@Override
public void success() {
//成功
}
@Override
public void fail(String message) {
//失败
}
});
加入房间
public void joinRoom(Context context, String roomId, String token,
final IdrsSdk.SdkInitCallBack sdkInitCallBack)
请求参数
参数 | 类型 | 说明 | 是否必须 |
context | Context | 上下文 | 是 |
roomId | String | 房间号 | 是 |
token | String | 房间密码 | 是 |
sdkInitCallBack | SdkInitCallBack | 创建的房间的回调接口 | 是 |
返回值
无
代码示例
IdrsSdk.getInstance().joinRoom(this, roomId, roomToken, sdkInitCallBack);
获取房间信息
public RoomInfo getRoomInfo()
请求参数
无
返回值
类型 | 说明 |
RoomInfo | 返回房间的实体类 |
代码示例
IdrsSdk.getInstance().getRoomInfo();
设置房间信息
public void setRoomInfo(RoomInfo roomInfo)
请求参数
参数 | 类型 | 说明 | 是否必须 |
roomInfo | RoomInfo | 房间实体类 | 是 |
返回值
无
代码示例
IdrsSdk.getInstance().setRoomInfo(roomInfo);
获取ARTVC实例
public AlipayRtcEngine getRtcEngineInstance()
请求参数
无
返回值
类型 | 说明 |
AlipayRtcEngine | ARTVC 实例 |
代码示例
mRtcEngine = IdrsSdk.getInstance().getRtcEngineInstance();
设置 RTC 监听和处理
public void setRtcListenerAndHandler(AlipayRtcEngineEventListener listener,
Handler handler)
请求参数
参数 | 类型 | 说明 | 是否必须 |
listener | AlipayRtcEngineEventListener | RTC 引擎事件监听器 | 是 |
handler | Handler | 处理消息 | 是 |
返回值
无
代码示例
mRtcEngine.setRtcListenerAndHandler(alipayRtcEngineEventListener, eventHandler);
private final AlipayRtcEngineEventListener alipayRtcEngineEventListener = new AlipayRtcEngineEventListener() {
@Override
public void onError(int i, String s, Bundle bundle) {
Log.d(TAG, "onError() called with: i = [" + i + "], s = [" + s + "], bundle = [" + bundle + "]");
}
@Override
public void onCommonEvent(int i, String s, Bundle bundle) {
Log.d(TAG, "onCommonEvent() called with: i = [" + i + "], s = [" + s + "], bundle = [" + bundle + "]");
}
@Override
public void onRoomInfo(final RoomInfo roomInfo) {
}
@Override
public void onEnterRoom(int i) {
Log.d(TAG, "onEnterRoom() called with: i = [" + i + "]");
}
@Override
public void onLeaveRoom(int i) {
Log.d(TAG, "onLeaveRoom() called with: i = [" + i + "]");
}
@Override
public void onInviteReply(ReplyOfInviteInfo replyOfInviteInfo) {
Log.d(TAG, "onInviteReply() called with: replyOfInviteInfo = [" + replyOfInviteInfo + "]");
}
@Override
public void onRecordInfo(String s) {
Log.d(TAG, "onRecordInfo() called with: s = [" + s + "]");
}
@Override
public void onCameraPreviewInfo(final ARTVCView artvcView) {
}
@Override
public void onCameraPreviewFirstFrame() {
Log.d(TAG, "onCameraPreviewFirstFrame() called");
}
@Override
public void onCameraPreviewStop() {
Log.d(TAG, "onCameraPreviewStop() called");
}
@Override
public void onPublishEvent(PublishConfig publishConfig, PublishEventCode publishEventCode, String s, FeedInfo feedInfo) {
Log.d(TAG, "onPublishEvent() called with: publishConfig = [" + publishConfig + "], publishEventCode = [" + publishEventCode + "], s = [" + s + "], feedInfo = [" + feedInfo + "]");
}
@Override
public void onUnpublishEvent(UnpublishConfig unpublishConfig, PublishEventCode publishEventCode, String s) {
Log.d(TAG, "onUnpublishEvent() called with: unpublishConfig = [" + unpublishConfig + "], publishEventCode = [" + publishEventCode + "], s = [" + s + "]");
}
@Override
public void onSubscribeEvent(FeedInfo feedInfo, SubscribeEventCode subscribeEventCode, String s, ARTVCView artvcView) {
Log.d(TAG, "onSubscribeEvent() called with: feedInfo = [" + feedInfo + "], subscribeEventCode = [" + subscribeEventCode + "], s = [" + s + "], artvcView = [" + artvcView + "]");
}
@Override
public void onUnsubscribeEvent(FeedInfo feedInfo, SubscribeEventCode subscribeEventCode, String s) {
Log.d(TAG, "onUnsubscribeEvent() called with: feedInfo = [" + feedInfo + "], subscribeEventCode = [" + subscribeEventCode + "], s = [" + s + "]");
}
@Override
public void onParticipantsEnter(final List<ParticipantInfo> infos) {
}
@Override
public void onParticipantsLeave(List<ParticipantLeaveInfo> list) {
Log.d(TAG, "onParticipantsLeave() called with: list = [" + list + "]");
}
@Override
public void onPublishNotify(FeedInfo feedInfo) {
Log.d(TAG, "onPublishNotify() called with: feedInfo = [" + feedInfo + "]");
}
@Override
public void onUnpublishNotify(FeedInfo feedInfo) {
Log.d(TAG, "onUnpublishNotify() called with: feedInfo = [" + feedInfo + "]");
}
@Override
public void onSubscribeNotify(FeedInfo feedInfo, String s) {
Log.d(TAG, "onSubscribeNotify() called with: feedInfo = [" + feedInfo + "], s = [" + s + "]");
}
@Override
public void onUnsubscribeNotify(FeedInfo feedInfo, String s) {
Log.d(TAG, "onUnsubscribeNotify() called with: feedInfo = [" + feedInfo + "], s = [" + s + "]");
}
@Override
public void onRemoteViewFirstFrame(final FeedInfo feedInfo, final ARTVCView artvcView) {
}
@Override
public void onRemoteViewStop(FeedInfo feedInfo, ARTVCView artvcView) {
Log.d(TAG, "onRemoteViewStop() called with: feedInfo = [" + feedInfo + "], artvcView = [" + artvcView + "]");
}
@Override
public void onCurrentNetworkType(int i) {
Log.d(TAG, "onCurrentNetworkType() called with: i = [" + i + "]");
}
@Override
public void onCurrentAudioPlayoutMode(int i) {
Log.d(TAG, "onCurrentAudioPlayoutMode() called with: i = [" + i + "]");
}
@Override
public void onBandwidthImportanceChangeNotify(boolean b, double v, FeedInfo feedInfo) {
Log.d(TAG, "onBandwidthImportanceChangeNotify() called with: b = [" + b + "], v = [" + v + "], feedInfo = [" + feedInfo + "]");
}
@Override
public void onSnapShotComplete(Bitmap bitmap, FeedInfo feedInfo) {
Log.d(TAG, "onSnapShotComplete() called with: bitmap = [" + bitmap + "], feedInfo = [" + feedInfo + "]");
}
@Override
public void onStatisticDebugInfo(StatisticInfoForDebug statisticInfoForDebug, FeedInfo feedInfo) {
Log.d(TAG, "onStatisticDebugInfo() called with: statisticInfoForDebug = [" + statisticInfoForDebug + "], feedInfo = [" + feedInfo + "]");
}
@Override
public void onRealTimeStatisticInfo(RealTimeStatisticReport realTimeStatisticReport, FeedInfo feedInfo) {
Log.d(TAG, "onRealTimeStatisticInfo() called with: realTimeStatisticReport = [" + realTimeStatisticReport + "], feedInfo = [" + feedInfo + "]");
}
};
设置 RTC 音频监听器
public void setAlipayRtcEngineAudioListener(
AlipayRtcEngineAudioListener rtcEngineAudioListener,
@Nullable Handler handler)
请求参数
参数 | 类型 | 说明 | 是否必须 |
rtcEngineAudioListener | AlipayRtcEngineAudioListener | RTC 音频监听器 | 是 |
handler | Handler | 处理消息 | 是 |
返回值
无
代码示例
AlipayRtcEngineAudioListener audioListener = new AlipayRtcEngineAudioListener() {
@Override
public void onWebRtcAudioCapturered(AlipayRtcAudioInfo alipayRtcAudioInfo) {
super.onWebRtcAudioCapturered(alipayRtcAudioInfo);
if (alipayRtcAudioInfo != null) {
ByteArrayInputStream fis = new ByteArrayInputStream(alipayRtcAudioInfo.data);
ByteArrayOutputStream fos = new ByteArrayOutputStream(alipayRtcAudioInfo.data.length);
try {
new SSRC(fis, fos, 48000, 16000, 2, 2, 1, Integer.MAX_VALUE, 0, 0,
true);
mAudioSpliter.splitAudioData(fos.toByteArray());
} catch (Throwable t) {
t.printStackTrace();
}
}
}
};
audioListener.setEnableAudioCaptured(true);
mRtcEngine.setAlipayRtcEngineAudioListener(audioListener, new Handler());
设置 RTC 事件监听器
public void setRtcEventExtendListener(AlipayRtcEngineEventExtendListener listener)
请求参数
参数 | 类型 | 说明 | 是否必须 |
listener | AlipayRtcEngineEventExtendListener | RTC 事件监听器 | 是 |
返回值
无
代码示例
mRtcEngine.setRtcEventExtendListener(new AlipayRtcEngineEventExtendListener() {
@Override
public void onVideoSizeChangedTo(int height, int width, ARTVCView view, FeedInfo feedInfo) {
super.onVideoSizeChangedTo(height, width, view, feedInfo);
}
@Override
public void onCustomRawResp(long requestId, int oldOpcmd, JSONObject jsonObject) {
super.onCustomRawResp(requestId, oldOpcmd, jsonObject);
if (jsonObject == null) {
return;
}
Log.i("CallActCustom", "cmd result: " + jsonObject.toJSONString());
int opcmdInner = jsonObject.getIntValue("opcmd");
String recordId = jsonObject.getString("recordId");
mRecordId = jsonObject.getString("recordId");
if (opcmdInner == 1032) {
recordIdList.add(mRecordId);
mSessionId = jsonObject.getString("sessionId");
recordAtLong = System.currentTimeMillis();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
recordAt = df.format(recordAtLong);
Log.d(TAG, "recordAt: " + recordAt);
} else if (opcmdInner == 1034) {
long recordDuration = System.currentTimeMillis() - recordAtLong;
UploadReportRequest reportRequest = new UploadReportRequest();
reportRequest.setAppId(appId);
reportRequest.setRoomId(mRoomInfo.roomId);
reportRequest.setType("REMOTE");
reportRequest.setRecordAt(recordAt);
reportRequest.setDuration(recordDuration);
String metaFileName = "remotemeta";
GetAppBean.DataBean data = IdrsSdk.getInstance().getAppData();
String metaFilePath = ConfigurationFile.getInstance().createMetaFilePath(CreateRoomActivity.this, metaFileName);
VideoConfigurator.getInstance().saveToFile(metaFilePath);
String resultFilename = "remoteresult";
String resultFilePaht = ConfigurationFile.getInstance().createMetaFilePath(CreateRoomActivity.this, resultFilename);
VideoConfigurator.getInstance().saveResultToFile(resultFilePaht);
IdrsProcessResultBean idrsResultBean = new IdrsProcessResultBean();
idrsResultBean.setAk(AK);
idrsResultBean.setSk(SK);
idrsResultBean.setAppId(appId);
idrsResultBean.setFeeId(data == null ? "" : data.getFeeId());
idrsResultBean.setType(IdrsSdk.TYPE_REMOTE);
idrsResultBean.setRoomId(mRoomInfo.roomId);
idrsResultBean.setDuration(recordDuration);
idrsResultBean.setRecordAt(recordAtLong);
idrsResultBean.setRecordId(recordId);
List<FileBean> fileBeanList = new ArrayList<>();
idrsResultBean.setFiles(fileBeanList);
FileBean metaBean = new FileBean();
metaBean.setFileName(metaFileName);
metaBean.setUrlType(IdrsProcessResultBean.FILE_TYPE_META);
metaBean.setFilePath(metaFilePath);
fileBeanList.add(metaBean);
FileBean resultBean = new FileBean();
resultBean.setFileName(resultFilename);
resultBean.setUrlType(IdrsProcessResultBean.FILE_TYPE_RESULT);
resultBean.setFilePath(resultFilePaht);
fileBeanList.add(resultBean);
IdrsSdk.uploadFiles(idrsResultBean, new UploadCallback() {
@Override
public void success(String json) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(CreateRoomActivity.this, "上报成功", Toast.LENGTH_LONG).show();
}
});
}
@Override
public void fail(String msg) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(CreateRoomActivity.this, "上报失败", Toast.LENGTH_LONG).show();
}
});
}
});
Log.i("CallActCustom", "stop record result: " + jsonObject.toJSONString());
}
}
});
开启录制
public void startRTCRecord(String waterMarkId)
请求参数
参数 | 类型 | 说明 | 是否必须 |
waterMarkId | String | 水印 ID | 是 |
返回值
无
代码示例
IdrsSdk.getInstance().startRTCRecord(waterMarkId);
开启录制扩展
public Long startRTCRecord(String waterMarkId, String tagFilter,
Map<String, String> config, String userTag,
IdrsSdk.RecordType recordType, RecordParam recordParamObj)
请求参数
参数 | 类型 | 说明 | 是否必须 |
waterMarkId | String | 水印 ID,没有时传 null | 是 |
tagFilter | String | 混流传 null,单流传 tag | 是 |
config | Map<String, String> | 自定义配置,可传 null | 是 |
userTag | String | 用户类型 | 是 |
recordType | IdrsSdk.RecordType | 录制类型,可传 null | 是 |
recordParamObj | RecordParam | 自定义水印实体列 | 是 |
返回值
类型 | 说明 |
Long | 返回的成功码 |
代码示例
RecordParam recordParam = new RecordParam();
recordParam.setHeight(720);
recordParam.setWidth(1280);
JSONArray overlaps = new JSONArray();
JSONObject overlap_1 = new JSONObject();
overlap_1.put("enable", true);
overlap_1.put("fontSize", 60);
overlap_1.put("id", 777);
overlap_1.put("tag", videoTag);
overlap_1.put("text", customWatermark);
overlap_1.put("type", 2);
overlap_1.put("xPosition", 30);
overlap_1.put("yPosition", 30);
JSONObject overlap_2 = new JSONObject();
overlap_2.put("enable", true);
overlap_2.put("fontSize", 60);
overlap_2.put("id", 888);
overlap_2.put("tag", videoTag);
overlap_2.put("text", customWatermark);
overlap_2.put("type", 2);
overlap_2.put("xPosition", 30);
overlap_2.put("yPosition", 30);
overlaps.add(overlap_1);
overlaps.add(overlap_2);
recordParam.setOverlaps(overlaps, null);
if(rtc_single){//单流
IdrsSdk.getInstance().startRTCRecord(null, tagFilter, null, "idrs_test", IdrsSdk.RecordType.RECORD_SINGLE, recordParam);
}
if (rtc_hybrid){//混流
IdrsSdk.getInstance().startRTCRecord(null, null, null, "idrs_test", IdrsSdk.RecordType.RECORD_MIX, recordParam);
}
变更录制配置
public Long modifyRTCRecordConfig(String recordId,
TagPositions tagPositions, Overlaps overlaps)
请求参数
参数 | 类型 | 说明 | 是否必须 |
recordId | String | 录制 ID | 是 |
tagPositions | TagPositions | 布局配置 | 是 |
overlaps | Overlaps | 水印配置 | 是 |
返回值
类型 | 说明 |
Long | 返回的成功码 |
代码示例
IdrsSdk.getInstance().modifyRTCRecordConfig(recordId,tagPositions,overlaps);
结束录制
public void stopRTCRecord(String recordId)
请求参数
参数 | 类型 | 说明 | 是否必须 |
recordId | String | 录制 ID,在开启 RTC 事件回调接口中返回 | 是 |
返回值
无
代码示例
IdrsSdk.getInstance().stopRTCRecord(recordId);
退出房间
public void release()
请求参数
无
返回值
无
代码示例
IdrsSdk.getInstance().release()