uinisdk_ngrtcuxinsdk是什么文件夹夹

就是嗨:&:-& - 歌单 - 网易云音乐
就是嗨:&:-&
动感,清纯
播放:13次
网易云音乐多端下载
同步歌单,随时畅听320k好音乐
网易公司版权所有(C)杭州乐读科技有限公司运营:纯~风 - 歌单 - 网易云音乐
快樂★憂傷
播放:24次
网易云音乐多端下载
同步歌单,随时畅听320k好音乐
网易公司版权所有(C)杭州乐读科技有限公司运营:1434人阅读
anyrtc, 连麦直播, rtmp
基于anyrtc的sdk实现直播连麦互动
1.由于粘贴了较大的代码,造成内容比较长,可能会花费您较长的时间。&
2.项目里面没有做权限判断,所以如果发现有页面发生崩溃可能是权限没有打开,请打开权限后再进行尝试。&
3.录制的GIF画质好差,真实环境很好。
一.有图有真相
主播端 : 
游客端 : 
二.集成步骤,教你实现直播连麦互动
从github上下载下来,导入AS,结构如下图所示。
1.初始化RTMP引擎
MainActivity.java
RTMPCHybird.Inst().Init(getApplicationContext()); RTMPCHybird.Inst().InitEngineWithAnyrtcInfo(&你的开发者ID&, &liveDemo&, &LslMfUyvcW8hv6NgY0n8FOWf5t1K+YWpoMzRsqwkBiE&, &d6ff4b7d1b549f497a0b94cf500fd549&);
以上的四个参数可以在注册开发者账号并创建一个应用可得,如下图所示。你可以把它放在继承Application的onCreate()方法中。
2.获取直播列表,随时随地观看主播
MainActivity.java
RTMPCHttpSDK.GetLiveList(this, RTMPCHybird.Inst().GetHttpAddr(), 你的开发者ID&, &liveDemo&,
&d6ff4b7d1b549f497a0b94cf500fd549&, mRTMPCHttpCallback);
private RTMPCHttpSDK.RTMPCHttpCallback mRTMPCHttpCallback = new RTMPCHttpSDK.RTMPCHttpCallback() {
public void OnRTMPCHttpOK(String strContent) {
mRecyclerViewUtils.endRefreshing();
listLive.clear();
JSONObject liveJson = new JSONObject(strContent);
JSONArray liveList = liveJson.getJSONArray(&LiveList&);
JSONArray memberList = liveJson.getJSONArray(&LiveMembers&);
for (int i = 0; i & liveList.length(); i++) {
LiveItemBean bean = new LiveItemBean();
JSONObject itemJson = new JSONObject(liveList.getString(i));
bean.setmHosterId(itemJson.getString(&hosterId&));
bean.setmRtmpPullUrl(itemJson.getString(&rtmp_url&));
bean.setmHlsUrl(itemJson.getString(&hls_url&));
bean.setmLiveTopic(itemJson.getString(&topic&));
bean.setmAnyrtcId(itemJson.getString(&anyrtcId&));
bean.setmMemNumber(memberList.getInt(i));
listLive.add(bean);
mAdapter.setDatas(listLive);
} catch (JSONException e) {
e.printStackTrace();
public void OnRTMPCHttpFailed(int code) {
以上代码可以获取所有正在直播列表名单
3.发起直播,成就自己的直播梦
a.你可以自己设置推流地址和拉流地址,这里我直接用他提供的地址了
RTMPUrlHelper.java
public class RTMPUrlHelper {
public static final String RTMP_PUSH_URL = &rtmp://192.168.7.207:1935/live/%s&;
public static final String RTMP_PULL_URL = &rtmp://192.168.7.207:1935/live/%s&;
public static final String HLS_URL = &http://192.169.7.207/live/%s.m3u8&;
public static final String SHARE_WEB_URL = &http://123.59.68.21/rtmpc-demo/?%s&;}
b.这里要使用到你创建应用的anyrtcid、推流拉流hls地址、直播名称。到这一步你已经离你的直播梦完成了一半了&( ̄︶ ̄)&。
PreStartLiveActivity.java
String anyrtcId = RTMPCHttpSDK.getRandomString(12);
String rtmpPushUrl = String.format(RTMPUrlHelper.RTMP_PUSH_URL, anyrtcId);
String rtmpPullUrl = String.format(RTMPUrlHelper.RTMP_PULL_URL, anyrtcId);
String hlsUrl = String.format(RTMPUrlHelper.HLS_URL, anyrtcId);
JSONObject item = new JSONObject();
item.put(&hosterId&, &hostID&);
item.put(&rtmp_url&, rtmpPullUrl);
item.put(&hls_url&, hlsUrl);
item.put(&topic&, topic);
item.put(&anyrtcId&, anyrtcId);
} catch (JSONException e) {
e.printStackTrace();
Bundle bundle = new Bundle();
bundle.putString(&hosterId&, &hostID&);
bundle.putString(&rtmp_url&, rtmpPushUrl);
bundle.putString(&hls_url&, hlsUrl);
bundle.putString(&topic&, topic);
bundle.putString(&andyrtcId&, anyrtcId);
bundle.putString(&userData&, item.toString());
Intent intent = new Intent(this, HosterActivity.class);
intent.putExtras(bundle);
startActivity(intent);
4.你的直播梦就在此就要实现了,打起精神(⊙o⊙)哦
a.从上个Activity拿到传过来的数据
HosterActivity.java
mHosterId = getIntent().getExtras().getString(&hosterId&);
mRtmpPushUrl = getIntent().getExtras().getString(&rtmp_url&);
mAnyrtcId = getIntent().getExtras().getString(&andyrtcId&);
mUserData = getIntent().getExtras().getString(&userData&);
mHlsUrl = getIntent().getExtras().getString(&hls_url&);
mTopic = getIntent().getExtras().getString(&topic&);
这里的R.id.rl_rtmpc_videos表示打开手机摄像头捕获的像呈现的地方,如下图所示。&
HosterActivity.java
mVideoView = new RTMPCVideoView((RelativeLayout) findViewById(R.id.rl_rtmpc_videos), RTMPCHybird.Inst().Egl(), true);
mVideoView.setBtnCloseEvent(mBtnVideoCloseEvent);
mHosterKit = new RTMPCHosterKit(this, mHosterListener);
VideoRenderer render = mVideoView.OnRtcOpenLocalRender();
mHosterKit.SetVideoCapturer(render.GetRenderPointer(), true);
b.这里是创建和音频管理器,将照顾音频路由,音频模式,音频设备枚举等、存储现有的音频设置更改音频模式达到最佳的VoIP性能。
mRtmpAudioManager = RTMPAudioManager.create(this, new Runnable() {
public void run() {
onAudioManagerChangedState();
mRtmpAudioManager.init();
mRtmpAudioManager.setAudioDevice(RTMPAudioManager.AudioDevice.SPEAKER_PHONE);
mStartRtmp = true;
mHosterKit.StartPushRtmpStream(mRtmpPushUrl);
mHosterKit.OpenRTCLine(mAnyrtcId, mHosterId, mUserData);
c.主播的直播回调接口
mHosterKit = new RTMPCHosterKit(this, mHosterListener);&
这句代码是主播直播的回调接口,可以做连麦、取消连麦、接收消息和弹幕消息、实时观看人数和人员上下线等。实用的操作一般再此实行。&
HosterActivity.java
private RTMPCAbstractHoster mHosterListener = new RTMPCAbstractHoster() {
public void OnRtmpStreamOKCallback() {
HosterActivity.this.runOnUiThread(new Runnable() {
public void run() {
((TextView) findViewById(R.id.txt_rtmp_connection_status)).setText(R.string.str_rtmp_connect_success);
times 重连次数
public void OnRtmpStreamReconnectingCallback(final int times) {
HosterActivity.this.runOnUiThread(new Runnable() {
public void run() {
((TextView) findViewById(R.id.txt_rtmp_connection_status)).setText(String.format(getString(R.string.str_reconnect_times), times));
delayMs 推流延时
netBand 推流码流
public void OnRtmpStreamStatusCallback(final int delayMs, final int netBand) {
HosterActivity.this.runOnUiThread(new Runnable() {
public void run() {
((TextView) findViewById(R.id.txt_rtmp_status)).setText(String.format(getString(R.string.str_rtmp_status), delayMs, netBand));
public void OnRtmpStreamFailedCallback(int code) {
HosterActivity.this.runOnUiThread(new Runnable() {
public void run() {
((TextView) findViewById(R.id.txt_rtmp_connection_status)).setTextColor(R.color.yellow);
((TextView) findViewById(R.id.txt_rtmp_connection_status)).setText(R.string.str_rtmp_connect_failed);
public void OnRtmpStreamClosedCallback() {
code 0: 连接成功
strErr 原因
public void OnRTCOpenLineResultCallback(final int code, String strErr) {
HosterActivity.this.runOnUiThread(new Runnable() {
public void run() {
if (code == 0) {
((TextView) findViewById(R.id.txt_rtc_connection_status)).setText(R.string.str_rtc_connect_success);
((TextView) findViewById(R.id.txt_rtc_connection_status)).setTextColor(R.color.yellow);
((TextView) findViewById(R.id.txt_rtc_connection_status)).setText(R.string.str_rtmp_connect_failed);
strLivePeerID
strCustomID
strUserData
public void OnRTCApplyToLineCallback(final String strLivePeerID, final String strCustomID, final String strUserData) {
HosterActivity.this.runOnUiThread(new Runnable() {
public void run() {
ShowDialog(HosterActivity.this, strLivePeerID, strCustomID);
strLivePeerID
strCustomID
strUserData
public void OnRTCLineFullCallback(final String strLivePeerID, String strCustomID, String strUserData) {
HosterActivity.this.runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(HosterActivity.this, getString(R.string.str_connect_full), Toast.LENGTH_LONG).show();
mHosterKit.RejectRTCLine(strLivePeerID, true);
strLivePeerID
public void OnRTCCancelLineCallback(String strLivePeerID) {
HosterActivity.this.runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(HosterActivity.this, getString(R.string.str_line_disconnect), Toast.LENGTH_LONG).show();
code 207:请去AnyRTC官网申请账号,如有疑问请联系客服!
public void OnRTCLineClosedCallback(final int code, String strReason) {
HosterActivity.this.runOnUiThread(new Runnable() {
public void run() {
if (code == 207) {
Toast.makeText(HosterActivity.this, getString(R.string.str_apply_anyrtc_account), Toast.LENGTH_LONG).show();
strLivePeerID
public void OnRTCOpenVideoRenderCallback(final String strLivePeerID) {
HosterActivity.this.runOnUiThread(new Runnable() {
public void run() {
final VideoRenderer render = mVideoView.OnRtcOpenRemoteRender(strLivePeerID);
if (null != render) {
mHosterKit.SetRTCVideoRender(strLivePeerID, render.GetRenderPointer());
strLivePeerID
public void OnRTCCloseVideoRenderCallback(final String strLivePeerID) {
HosterActivity.this.runOnUiThread(new Runnable() {
public void run() {
mHosterKit.SetRTCVideoRender(strLivePeerID, 0);
mVideoView.OnRtcRemoveRemoteRender(strLivePeerID);
strCustomID 消息的发送者id
strCustomName 消息的发送者昵称
strCustomHeader 消息的发送者头像url
strMessage 消息内容
public void OnRTCUserMessageCallback(final String strCustomID, final String strCustomName, final String strCustomHeader, final String strMessage) {
HosterActivity.this.runOnUiThread(new Runnable() {
public void run() {
addChatMessageList(new ChatMessageBean(strCustomID, strCustomName, &&, strMessage));
strCustomID 弹幕的发送者id
strCustomName 弹幕的发送者昵称
strCustomHeader 弹幕的发送者头像url
strBarrage 弹幕的内容
public void OnRTCUserBarrageCallback(final String strCustomID, final String strCustomName, final String strCustomHeader, final String strBarrage) {
HosterActivity.this.runOnUiThread(new Runnable() {
public void run() {
addChatMessageList(new ChatMessageBean(strCustomID, strCustomName, &&, strBarrage));
IDanmakuItem item = new DanmakuItem(HosterActivity.this, new SpannableString(strBarrage), mDanmakuView.getWidth(), 0, R.color.yellow_normol, 18, 1);
mDanmakuView.addItemToHead(item);
totalMembers 观看总人数
public void OnRTCMemberListWillUpdateCallback(final int totalMembers) {
HosterActivity.this.runOnUiThread(new Runnable() {
public void run() {
((TextView) findViewById(R.id.txt_watcher_number)).setText(String.format(getString(R.string.str_live_watcher_number), totalMembers));
strCustomID
strUserData
public void OnRTCMemberCallback(final String strCustomID, final String strUserData) {
HosterActivity.this.runOnUiThread(new Runnable() {
public void run() {
JSONObject userData = new JSONObject(strUserData);
addChatMessageList(new ChatMessageBean(userData.getString(&nickName&), &&, userData.getString(&headUrl&), &&));
} catch (JSONException e) {
e.printStackTrace();
public void OnRTCMemberListUpdateDoneCallback() {
d.一些对应直播回调的方法
接下来就要说对应这些回调的方法了,这里可以做关闭直播、直播分享、切换摄像头和发送消息。&
HosterActivity.java
public void OnBtnClicked(View btn) {
if (btn.getId() == R.id.btn_close) {
mStartRtmp = false;
mHosterKit.StopRtmpStream();
} else if (btn.getId() == R.id.btn_copy_hls) {
int index = mHlsUrl.lastIndexOf(&/&);
int lastIndex = mHlsUrl.lastIndexOf(&.&);
String shareUrl = String.format(RTMPUrlHelper.SHARE_WEB_URL, mHlsUrl.substring(index + 1, lastIndex));
mShareHelper.shareWeiXin(mTopic, shareUrl);
} else if (btn.getId() == R.id.btn_switch_camera) {
mHosterKit.SwitchCamera();
} else if (btn.getId() == R.id.btn_send_message) {
String message = editMessage.getText().toString();
editMessage.setText(&&);
if (message.equals(&&)) {
if (mCheckBarrage.isChecked()) {
mHosterKit.SendBarrage(mNickname, &&, message);
IDanmakuItem item = new DanmakuItem(HosterActivity.this, new SpannableString(message), mDanmakuView.getWidth(), 0, R.color.yellow_normol, 18, 1);
mDanmakuView.addItemToHead(item);
mHosterKit.SendUserMsg(mNickname, &&, message);
addChatMessageList(new ChatMessageBean(mNickname, mNickname, &&, message));
} else if (btn.getId() == R.id.iv_host_text) {
btnChat.clearFocus();
vaBottomBar.setDisplayedChild(1);
editMessage.requestFocus();
softKeyboardUtil.showKeyboard(HosterActivity.this, editMessage);
5.主播端的已经完成了,现在该轮到你的小伙伴们看你直播~(≧▽≦)/~啦啦啦
a.前面已经说了,我们可以实时获取开启直播的主播,点击列表就可以观看主播直播。
MainActivity.java
public void onItemChildClick(ViewGroup viewGroup, View view, int i) {
Intent it = new Intent(this, GuestActivity.class);
Bundle bundle = new Bundle();
bundle.putString(&hls_url&, listLive.get(i).getmHlsUrl());
bundle.putString(&rtmp_url&, listLive.get(i).getmRtmpPullUrl());
bundle.putString(&anyrtcId&, listLive.get(i).getmAnyrtcId());
bundle.putString(&userData&, new JSONObject().toString());
bundle.putString(&topic&, listLive.get(i).getmLiveTopic());
it.putExtras(bundle);
startActivity(it);
b.再实现游客端这个项目基本上就完成了,是不是有点小激动?
与主播端一样,拿上个Activity传过来的数据,其实这里代码与主播端的代码基本上可以说是一模一样,看完之后你应该会有我这样的体会。&
GuestActivity.java
mNickname = ((HybirdApplication)HybirdApplication.app()).getmNickname();
mRtmpPullUrl = getIntent().getExtras().getString(&rtmp_url&);
mAnyrtcId = getIntent().getExtras().getString(&anyrtcId&);
mHlsUrl = getIntent().getExtras().getString(&hls_url&);
mGuestId = mN
mTopic = getIntent().getExtras().getString(&topic&);
mVideoView = new RTMPCVideoView((RelativeLayout) findViewById(R.id.rl_rtmpc_videos), RTMPCHybird.Inst().Egl(), false);
mVideoView.setBtnCloseEvent(mBtnVideoCloseEvent);
mGuestKit = new RTMPCGuestKit(this, mGuestListener);
VideoRenderer render = mVideoView.OnRtcOpenLocalRender();
mRtmpAudioManager = RTMPAudioManager.create(this, new Runnable() {
public void run() {
onAudioManagerChangedState();
mRtmpAudioManager.init();
mRtmpAudioManager.setAudioDevice(RTMPAudioManager.AudioDevice.SPEAKER_PHONE);
mUserData = new JSONObject();
mUserData.put(&nickName&, mNickname);
mUserData.put(&headUrl&, &&);
} catch (JSONException e) {
e.printStackTrace();
mGuestKit.StartRtmpPlay(mRtmpPullUrl, render.GetRenderPointer());
mGuestKit.JoinRTCLine(mAnyrtcId, mGuestId, mUserData.toString());
c.观看直播的回调接口
mGuestKit = new RTMPCGuestKit(this, mGuestListener);&
这句代码是观看直播的回调接口,可以做申请连麦、断开连麦、接收消息和弹幕消息、实时观看人数和人员上下线等。实用的操作一般再此实行。&
GuestActivity.java
private RTMPCAbstractGuest mGuestListener = new RTMPCAbstractGuest() {
public void OnRtmplayerOKCallback() {
cacheTime 当前缓存时间
curBitrate 当前播放器码流
public void OnRtmplayerStatusCallback(int cacheTime, int curBitrate) {
time 缓冲时间
public void OnRtmplayerCacheCallback(int time) {
public void OnRtmplayerClosedCallback(int errcode) {
code 回调响应码:0:正常;101:主播未开启直播;
strReason 原因描述
public void OnRTCJoinLineResultCallback(final int code, String strReason) {
GuestActivity.this.runOnUiThread(new Runnable() {
public void run() {
if (code == 0) {
} else if (code == 101) {
Toast.makeText(GuestActivity.this, R.string.str_hoster_not_live, Toast.LENGTH_LONG).show();
mHandler.sendEmptyMessageDelayed(CLOSED, 2000);
code 0:申请连线成功;-1:主播拒绝连线
public void OnRTCApplyLineResultCallback(final int code) {
GuestActivity.this.runOnUiThread(new Runnable() {
public void run() {
if (code == 0) {
VideoRenderer render = mVideoView.OnRtcOpenRemoteRender(&LocalCameraRender&);
mGuestKit.SetVideoCapturer(render.GetRenderPointer(), true);
} else if (code == -1) {
Toast.makeText(GuestActivity.this, R.string.str_hoster_refused, Toast.LENGTH_LONG).show();
mStartLine = false;
mBtnConnect.setText(R.string.str_connect_hoster);
strLivePeerID
strCustomID
strUserData
public void OnRTCOtherLineOpenCallback(String strLivePeerID, String strCustomID, String strUserData) {
strLivePeerID
public void OnRTCOtherLineCloseCallback(String strLivePeerID) {
public void OnRTCHangupLineCallback() {
GuestActivity.this.runOnUiThread(new Runnable() {
public void run() {
mGuestKit.HangupRTCLine();
mVideoView.OnRtcRemoveRemoteRender(&LocalCameraRender&);
mStartLine = false;
mBtnConnect.setText(R.string.str_connect_hoster);
public void OnRTCLineLeaveCallback(int code, String strReason) {
GuestActivity.this.runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(GuestActivity.this, R.string.str_hoster_leave, Toast.LENGTH_LONG).show();
mHandler.sendEmptyMessageDelayed(CLOSED, 2000);
strLivePeerID
public void OnRTCOpenVideoRenderCallback(final String strLivePeerID) {
GuestActivity.this.runOnUiThread(new Runnable() {
public void run() {
final VideoRenderer render = mVideoView.OnRtcOpenRemoteRender(strLivePeerID);
mGuestKit.SetRTCVideoRender(strLivePeerID, render.GetRenderPointer());
strLivePeerID
public void OnRTCCloseVideoRenderCallback(final String strLivePeerID) {
GuestActivity.this.runOnUiThread(new Runnable() {
public void run() {
mGuestKit.SetRTCVideoRender(strLivePeerID, 0);
mVideoView.OnRtcRemoveRemoteRender(strLivePeerID);
strCustomID 消息的发送者id
strCustomName 消息的发送者昵称
strCustomHeader 消息的发送者头像url
strMessage 消息内容
public void OnRTCUserMessageCallback(final String strCustomID, final String strCustomName, final String strCustomHeader, final String strMessage) {
GuestActivity.this.runOnUiThread(new Runnable() {
public void run() {
addChatMessageList(new ChatMessageBean(strCustomID, strCustomName, &&, strMessage));
strCustomID 弹幕的发送者id
strCustomName 弹幕的发送者昵称
strCustomHeader 弹幕的发送者头像url
strBarrage 弹幕的内容
public void OnRTCUserBarrageCallback(final String strCustomID, final String strCustomName, final String strCustomHeader, final String strBarrage) {
GuestActivity.this.runOnUiThread(new Runnable() {
public void run() {
addChatMessageList(new ChatMessageBean(strCustomID, strCustomName, &&, strBarrage));
IDanmakuItem item = new DanmakuItem(GuestActivity.this, new SpannableString(strBarrage), mDanmakuView.getWidth(), 0, R.color.yellow_normol, 18, 1);
mDanmakuView.addItemToHead(item);
totalMembers 观看直播的总人数
public void OnRTCMemberListWillUpdateCallback(final int totalMembers) {
GuestActivity.this.runOnUiThread(new Runnable() {
public void run() {
((TextView) findViewById(R.id.txt_watcher_number)).setText(String.format(getString(R.string.str_live_watcher_number), totalMembers));
strCustomID
strUserData
public void OnRTCMemberCallback(final String strCustomID, final String strUserData) {
GuestActivity.this.runOnUiThread(new Runnable() {
public void run() {
JSONObject userData = new JSONObject(strUserData);
addChatMessageList(new ChatMessageBean(userData.getString(&nickName&), &&, userData.getString(&headUrl&), &&));
} catch (JSONException e) {
e.printStackTrace();
public void OnRTCMemberListUpdateDoneCallback() {
d.一些对应观看直播回调的方法
接下来就要说对应这些回调的方法了,这里可以做直播分享、申请连麦、断开连麦和发送消息。&
GuestActivity.java
public void OnBtnClicked(View btn) {
if(btn.getId() == R.id.btn_copy_hls) {
int index = mHlsUrl.lastIndexOf(&/&);
int lastIndex = mHlsUrl.lastIndexOf(&.&);
String shareUrl = String.format(RTMPUrlHelper.SHARE_WEB_URL, mHlsUrl.substring(index + 1, lastIndex));
mShareHelper.shareWeiXin(mTopic, shareUrl);
} else if (btn.getId() == R.id.btn_line) {
if (!mStartLine) {
JSONObject json = new JSONObject();
json.put(&guestId&, mNickname);
} catch (JSONException e) {
e.printStackTrace();
mGuestKit.ApplyRTCLine(json.toString());
mStartLine = true;
mBtnConnect.setText(R.string.str_hangup_connect);
mGuestKit.HangupRTCLine();
mVideoView.OnRtcRemoveRemoteRender(&LocalCameraRender&);
mStartLine = false;
mBtnConnect.setText(R.string.str_connect_hoster);
} else if (btn.getId() == R.id.btn_send_message) {
String message = editMessage.getText().toString();
editMessage.setText(&&);
if (message.equals(&&)) {
if (mCheckBarrage.isChecked()) {
mGuestKit.SendBarrage(mNickname, &&, message);
IDanmakuItem item = new DanmakuItem(GuestActivity.this, new SpannableString(message), mDanmakuView.getWidth(), 0, R.color.yellow_normol, 18, 1);
mDanmakuView.addItemToHead(item);
mGuestKit.SendUserMsg(mNickname, &&, message);
addChatMessageList(new ChatMessageBean(mNickname, mNickname, &&, message));
} else if (btn.getId() == R.id.iv_host_text) {
btnChat.clearFocus();
vaBottomBar.setDisplayedChild(1);
editMessage.requestFocus();
softKeyboardUtil.showKeyboard(GuestActivity.this, editMessage);
对于这个基于Anyrtc sdk的直播RTMPCHybirdEngine-Android核心的几个类基本上介绍完成,我在此仅仅是大概介绍了几点,可以让你大概了解这个SDK的直播流程,方便您快速上手。
转载请注明出处,谢谢!
访问:9870次
排名:千里之外
原创:11篇
(1)(2)(1)(1)(6)

我要回帖

更多关于 unisdk ngrtc 的文章

 

随机推荐