使用融云 CallPlus SDK,一小时实现一款 1V1 视频应用
9 月 21 日,融云直播课 社交泛娱乐出海最短变现路径如何快速实现一款 1V1 视频应用? 欢迎点击小程序报名~
1V1 音视频、远程服务类应用的实现利器——融云 CallPlus SDK 上线! 关注【融云全球互联网通信云】了解更多
作为新一代音视频通话场景化 SDK,融云 CallPlus 完整封装了拨打、接听、挂断等整套呼叫流程,支持一对一及多人音视频通话,功能齐全、体验丝滑,且契合海外用户的交互偏好。
本文将以 Android 端集成为例,分享实战教程:
使用融云 CallPlus SDK,一小时集成 1V1 视频通话能力。
一个 RTC 实时音视频底层零经验开发者,只需 3 个核心 API、4 步 即可轻松实现音视频通话能力。并且,融云提供 Quick Demo 源码供开发者集成参考。
前置条件
创建融云开发者账号
创建融云开发者账号,获取 App Key。
开始之前,需创建融云开发者账号并获取 App Key。在开发者后台,系统会自动为新账号创建一个应用。默认使用国内数据中心,并提供开发环境。如果您已经有融云开发者账号,可以直接创建新应用。
导入 SDK
打开根目录下的 build.gradle(新版 Android studio 为 settings.gradle),Project 视图下,声明融云的 Maven 代码库。
allprojects {repositories {...//融云 maven 仓库地址maven {url "https://maven.rongcloud.cn/repository/maven-releases/"}}
}
添加依赖项
在应用的 build.gradle 中,添加如下远程依赖项。
注意:融云 CallPlus 业务依赖 IM 通道,所以须同时集成 IMLibCore SDK。
dependencies {// 请填写具体的 SDK 版本号,新集成用户建议使用最新版。此处以5.6.2版本为例。implementation 'cn.rongcloud.sdk:im_libcore:5.6.2' // 即时通讯基础能力库。implementation 'cn.rongcloud.sdk:callplus_lib:1.0.0'// 音视频呼叫能力库(内含 rtc_lib)
}
权限声明
在 AndroidManifest.xml 中声明 SDK 需要的所有权限。
<!-- 允许程序访问网络连接 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 允许程序获取网络信息状态,如当前的网络连接是否有效 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<!-- 允许程序获取当前WiFi接入的状态以及WLAN热点的信息 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 允许程序访问摄像头进行拍照 -->
<uses-permission android:name="android.permission.CAMERA" />
<!-- 允许程序录制声音通过手机或耳机的麦克 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- 允许程序修改声音设置信息 -->
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<!--允许程序访问电话状态,如通话中收到来自SIM卡的来电时,会将SIM卡通话状态通知给远端用户,所以需要该权限-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
注意:如果开发应用需要支持 Android 6.0(API 级别 23)或更高版本的设备,还需要在 App 用户使用对应功能时(如发起呼叫、接听)请求摄像头(CAMERA)、麦克风(RECORD_AUDIO)权限。
详见 Android 开发者官方文档运行时权限与请求权限的工作流。
正式集成
在着手实现之前,我们需要关注以下几个关键点:
☑ 如何发起通话
☑ 如何接收来电
☑ 通话接通后,双方通话界面如何显示
要想实现通话功能,必须以双端都已经成功连接融云为基础,参考下图所示 1V1 主叫端和被叫端的流程时序图。
主叫端时序图:
被叫端时序图:
初始化连接融云
CallPlus for Android 依赖融云即时通讯客户端 SDK 提供信令通道,故需先对 IMLibCore 进行初始化,建议放到 Application 中。
String appKey = "Your_AppKey"; // example: bos9p5rlcm2ba 创建融云开发者账号,获取 App Key。
InitOption initOption = new InitOption.Builder().build();
RongCoreClient.init(getApplicationContext(), appKey, initOption);
要拨打和接听一对一呼叫或开始多人呼叫,必须先通过 RongCoreClient 的 connect 方法连接融云服务器。
传入用户身份令牌(Token),向融云服务器验证用户身份;连接成功后,使用 RCCallPlusClient.getInstance().init() 方法初始化和配置 CallPlus SDK。
String token = "用户Token";// 您在申请开发者账号后,可以在融云后台北极星位置直接生成用户token
RongCoreClient.connect(token, new IRongCoreCallback.ConnectCallback() {/*** 成功回调* @param userId 当前用户 ID*/@Overridepublic void onSuccess(String userId) {runOnUiThread(new Runnable() {@Overridepublic void run() {//todo 尽管在主线程初始化 RCCallPlusClient 不是必需的,但考虑到代码示例后续对 RCCallPlusClient 的调用都在主线程进行,所以目前选择在主线程进行初始化。//todo 请确保在同一个线程进行 RCCallPlusClient 的初始化、反初始化和使用,以确保操作的一致性。RCCallPlusConfig config = RCCallPlusConfig.Builder.create().build();/*** 初始化并设置通话全局配置,重复调用该方法时SDK内部会重新初始化* @param config 设置通话全局配置* @return 方法调用后同步返回结果,可以在这里得到初始化是否成功*/RCCallPlusResultCode resultCode = RCCallPlusClient.getInstance().init(config);}});}/*** 错误回调* @param errorCode 错误码*/@Overridepublic void onError(IRongCoreEnum.ConnectionErrorCode errorCode) {}/*** 数据库回调.* @param code 数据库打开状态. DATABASE_OPEN_SUCCESS 数据库打开成功; DATABASE_OPEN_ERROR 数据库打开失败*/@Overridepublic void onDatabaseOpened(DatabaseOpenStatus code) {}
});
发起呼叫并设置本地和远端视图
使用 startCall 方法来发起一对一通话。
该方法内部会以异步方式执行,并通过 IRCCallPlusResultListener#onStartCall 回调来获取方法的结果。
在发起通话之前需先设置本地和远端视图,在对端接听视频通话时,本端会自动渲染对端的视图。
使用 setCallPlusResultListener 方法添加通话 API 异步结果回调监听。该监听可以接收 startCall、accept、hangup 等方法的结果回调。
发起呼叫:
private void startCall(String remoteUserId) {//todo 打开摄像头采集,请提前完成摄像头、麦克风权限的动态申请RCCallPlusClient.getInstance().startCamera();RCCallPlusClient.getInstance().enableMicrophone(true);//设置本端视图setLocalVideoView();//设置对端视图setRemotVideoView(remoteUserId);List<String> userIds = new ArrayList<>();userIds.add(remoteUserId);//todo remoteUserId 为被呼叫的远端用户userIdRCCallPlusType callType = RCCallPlusType.PRIVATE;//PRIVATE: 1V1通话RCCallPlusMediaType mediaType = RCCallPlusMediaType.VIDEO;/*** 开始发起呼叫* 该方法内部为异步执行,结果回调是注册的{@link RCCallPlusClient#setCallPlusResultListener(IRCCallPlusResultListener)} 监听的 {@link IRCCallPlusResultListener#onStartCall(RCCallPlusCode, String, List)}方法<br>*/RCCallPlusClient.getInstance().startCall(userIds, callType, mediaType);}
发起端设置本地视图:
/*** 设置本地视频渲染视图*/private void setLocalVideoView() {//创建本地视图对象RCCallPlusLocalVideoView localVideoView = new RCCallPlusLocalVideoView(this.getApplicationContext());//FIT: 视频帧通过保持宽高比(可能显示黑色边框)来缩放以适应视图的大小localVideoView.setRenderMode(RCCallPlusRenderMode.FIT);//设置本地视图给 SDKRCCallPlusClient.getInstance().setVideoView(localVideoView);FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT);params.gravity = Gravity.CENTER_HORIZONTAL;//在父布局中横向居中显示//将本地视图添加到XML中显示//示例代码中 mLocalVideoViewFrameLayout 为 android.widget.FrameLayout 对象mLocalVideoViewFrameLayout.removeAllViews();mLocalVideoViewFrameLayout.addView(localVideoView, params);}
发起端设置对端视图:
/*** 发起通话时设置对端视频渲染视图*/private void setRemotVideoView(String remoteUserId) {//创建远端视图对象 remoteUserId为远端用户userIdRCCallPlusRemoteVideoView remoteVideoView = new RCCallPlusRemoteVideoView(remoteUserId, this.getApplicationContext(), false);//FIT: 视频帧通过保持宽高比(可能显示黑色边框)来缩放以适应视图的大小remoteVideoView.setRenderMode(RCCallPlusRenderMode.FIT);//因为远端视图显示在最顶层,为了防止远端视频视图被底部控件遮挡,所以添加如下设置:remoteVideoView.setZOrderOnTop(true);remoteVideoView.setZOrderMediaOverlay(true);List<RCCallPlusRemoteVideoView> remoteVideoViewList = new ArrayList<>(); remoteVideoViewList.add(remoteVideoView);//设置远端视图给SDKRCCallPlusClient.getInstance().setVideoView(remoteVideoViewList);FrameLayout.LayoutParams remoteVideoViewParams = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT);remoteVideoViewParams.gravity = Gravity.CENTER_HORIZONTAL;//将远端视图添加到XML中显示//示例代码中 mRemoteVideoViewFrameLayout 为 android.widget.FrameLayout 对象mRemoteVideoViewFrameLayout.removeAllViews();mRemoteVideoViewFrameLayout.addView(remoteVideoView, remoteVideoViewParams);
}
接收端接听通话并设置本地和远端视图
可选择接听或挂断来电,若要接听电话,请使用 accept 方法;若要挂断来电,请使用 RCCallPlusClient.getInstance().hangup() 方法。
可以通过 RCCallPlusSession#getCallId() 方法获取执行接听和挂断操作所需的 CallId 值。
要接收远端呼叫通知,必须确保已经注册了 IRCCallPlusEventListener,并实现了 onReceivedCall(RCCallPlusSession callSession) 方法。被叫用户通过与融云服务端的连接或者离线推送通知(离线推送 App 必须已集成第三方厂商推送,详见推送 2.0 集成概述)接收来电通知。
使用 setCallPlusEventListener 方法添加通话事件监听,提供来电事件、通话状态、通话记录等事件相关回调。
添加通话事件监听:
RCCallPlusClient.getInstance().setCallPlusEventListener(new IRCCallPlusEventListener() {/*** 用户通过该回调接收到通话呼叫 在这个回调中,可以接听通话** @param callSession 通话实体信息<br>*/@Overridepublic void onReceivedCall(RCCallPlusSession callSession) {RCCallPlusSession currentCallSession = RCCallPlusClient.getInstance().getCurrentCallSession();if (currentCallSession != null && !TextUtils.equals(callSession.getCallId(), currentCallSession.getCallId())) {//可以使用该方法判断出,有正在进行中的通话,又有第二通通话呼入的情况<br>//todo 第二通通话可以直接调用 RCCallPlusClient.getInstance().accept 方法接听,SDK内部会将第一通通话挂断}//todo SDK 的回调均为子线程调用,showDialog() 方法中存在UI操作,所以切换到主线程执行runOnUiThread(new Runnable() {@Overridepublic void run() {//todo 打开摄像头采集,请提前完成摄像头、麦克风权限的动态申请RCCallPlusClient.getInstance().startCamera();RCCallPlusClient.getInstance().enableMicrophone(true);setLocalVideoView();//复用发起通话逻辑中的 设置本地视频渲染视图 方法showDialog(CallPlusActivity.this, "收到通话,是否接听?", "接听", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {acceptCall(callSession);}}, "挂断", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {RCCallPlusClient.getInstance().hangup();}});}});}@Overridepublic void onCallEnded(RCCallPlusSession session, RCCallPlusReason reason) {IRCCallPlusEventListener.super.onCallEnded(session, reason);runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(CallPlusActivity.this,"通话结束,callId: "+session.getCallId() +" 通话结束原因:"+ reason.getValue(), Toast.LENGTH_SHORT).show();}});}/*** 远端用户状态改变监听<br>** @param callId 通话Id<br>* @param userId 用户Id<br>* @param status 该用户当前状态<br>* @param reason 该用户当前状态原因<br>*/@Overridepublic void onRemoteUserStateChanged(String callId, String userId, RCCallPlusUserSessionStatus status, RCCallPlusReason reason) {IRCCallPlusEventListener.super.onRemoteUserStateChanged(callId, userId, status, reason);runOnUiThread(new Runnable() {@Overridepublic void run() {StringBuilder stringBuilder = new StringBuilder("通话 ");stringBuilder.append(callId).append(" 中的远端用户 ").append(userId).append(" 当前状态为 ");switch (status) {case CALLING:stringBuilder.append("呼叫中");break;case INVITED:stringBuilder.append("被邀请中");break;case CONNECTING:stringBuilder.append("已接听,连接中");break;case ON_CALL:stringBuilder.append("通话中");break;case ENDED:stringBuilder.append("通话已结束");break;}Toast.makeText(CallPlusActivity.this, stringBuilder.toString(), Toast.LENGTH_SHORT).show();}});}
});
具体接听通话的方法:
private void acceptCall(RCCallPlusSession callSession) {setRemoteUserVideoView(callSession.getRemoteUserList());/*** 开始接听通话* 该方法内部为异步执行,结果回调是注册的{@link RCCallPlusClient#setCallPlusResultListener(IRCCallPlusResultListener)} 监听的 {@link IRCCallPlusResultListener#onAccept(RCCallPlusCode, String)}方法<br>*/RCCallPlusClient.getInstance().accept(callSession.getCallId());
}
接收端设置本地和远端视图:
/*** 接听方设置远端用户视频渲染视图*/
private void setRemoteUserVideoView(List<RCCallPlusUser> remoteUserList) {List<RCCallPlusRemoteVideoView> remoteVideoViewList = new ArrayList<>();for (RCCallPlusUser callPlusUser : remoteUserList) {RCCallPlusRemoteVideoView remoteVideoView = new RCCallPlusRemoteVideoView(callPlusUser.getUserId(), this.getApplicationContext(), false);//视频帧通过保持宽高比(可能显示黑色边框)来缩放以适应视图的大小remoteVideoView.setRenderMode(RCCallPlusRenderMode.FIT);remoteVideoViewList.add(remoteVideoView);//本示例代码中,因为远端视图显示在最顶层,为了防止远端视频视图被底部控件(视图)遮挡,所以添加如下设置:remoteVideoView.setZOrderOnTop(true);remoteVideoView.setZOrderMediaOverlay(true);FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT);params.gravity = Gravity.CENTER_HORIZONTAL;//todo 将每个远端视图(remoteVideoView)添加到XML中显示,远端为多人时,需要添加给多个控件显示,本示例代码仅展示一个远端用户情况mRemoteVideoViewFrameLayout.removeAllViews();mRemoteVideoViewFrameLayout.addView(remoteVideoView, params);}/*** 设置远端用户视频流渲染视图给SDK* 若没有为远端用户设置视频渲染视图,则不会产生该用户的视频流的下行流量*/RCCallPlusClient.getInstance().setVideoView(remoteVideoViewList);
}
private AlertDialog showDialog(Context context, String content, String positiveBtn, final DialogInterface.OnClickListener positiveListener, final String negativeBtn, final DialogInterface.OnClickListener negativeListener) {AlertDialog.Builder builder = new AlertDialog.Builder(context);builder = builder.setMessage(content);builder.setCancelable(false);if (!TextUtils.isEmpty(positiveBtn)) {builder.setPositiveButton(positiveBtn, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {if (positiveListener != null) {positiveListener.onClick(dialog, which);} else {dialog.dismiss();}}});} if (!TextUtils.isEmpty(negativeBtn)) {builder.setNegativeButton(negativeBtn, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {if (negativeListener != null) {negativeListener.onClick(dialog, which);} else {dialog.dismiss();}}});} return builder.show();
}
运行项目发起通话,当被叫端接听并且主叫端能够看到双方视频,说明 1V1 音视频通话核心能力已经实现了,全程仅需 4 个步骤、3 个核心 API。
其他功能
切换前后摄像头
成功打开摄像头后,可以使用 switchCamera 方法切换前后摄像头。
switchCamera 方法是异步调用的,支持通过 IRCCallPlusResultListener 的 onSwitchCamera 回调来获取调用结果。
RCCallPlusClient.getInstance().switchCamera();
RCCallPlusClient.getInstance().setCallPlusResultListener(new IRCCallPlusResultListener() {/*** 切换前后摄像头方法结果回调<br>** @param code 方法请求结果<br>* @param isFrontCamera 当前开启的摄像头是否是前置摄像头<br>*/@Overridepublic void onSwitchCamera(RCCallPlusCode code, boolean isFrontCamera) {IRCCallPlusResultListener.super.onSwitchCamera(code, isFrontCamera);}
});
美颜
融云 SDK 已经接入专业三方美颜服务,三步即可实现美颜功能。
-
在应用的 build.gradle 中添加如下远程依赖项。
implementation 'cn.rongcloud.sdk:fu_beautifier:5.6.2' implementation 'androidx.core:core-ktx:1.7.0'
- 提供有效的美颜授权文件(感兴趣可联系融云商务详细咨询:131 6185 6839)。
- 初始化美颜插件,初始化时请提供有效的美颜授权文件。应用运行期间只调用一次即可,建议在 Application#onCreate 中初始化。
下面代码块中的 authpackNew 即为相关美颜服务的授权文件。
RCRTCFUBeautifierEngine.getInstance().register(getApplicationContext(),null,authpackNew.A(),new FUBeautifierResultCallback() {@Overridepublic void onSuccess() {setBeautyEnable();SetBeautyParameters();}@Overridepublic void onFailed(int code) {}});
private void setBeautyEnable() {// 打开美颜开关后设置的美颜效果才会生效;关闭开关美颜会失效。RCRTCFUBeautifierEngine.getInstance().setBeautyEnable(true, new FUBeautifierResultCallback() {@Overridepublic void onSuccess() {}@Overridepublic void onFailed(int code) {}});
}
// 设置美颜参数
private void SetBeautyParameters() {RCRTCFUBeautifierEngine.getInstance().setBlurIntensity(6); 范围[0-6]RCRTCFUBeautifierEngine.getInstance().setColorIntensity(2); // 范围 [0-2]RCRTCFUBeautifierEngine.getInstance().setRedIntensity(2);// 范围 [0-2]RCRTCFUBeautifierEngine.getInstance().setSharpenIntensity(1);// 范围 [0-1]RCRTCFUBeautifierEngine.getInstance().setEyeBrightIntensity(1); // 范围 [0-1]RCRTCFUBeautifierEngine.getInstance().setToothIntensity(1);// 范围 [0-1]RCRTCFUBeautifierEngine.getInstance().setRemovePouchIntensity(1);// 范围 [0-1]RCRTCFUBeautifierEngine.getInstance().setRemoveLawPatternIntensity(1);// 范围 [0-1]
}
在业务开发集成、上线运营等全过程中,融云都将提供全流程一站式技术服务支持,开发者可提交工单与融云工程师交流。欢迎来电咨询:131 6185 6839
最后,callback 一下融云 CallPlus SDK 的核心优势:
完整封装:提供完整的呼叫功能方案,包括连接、呼叫、接听、拒接、挂断、呼叫状态通知等。
集成便捷:接口设计贴近业务且简洁明了,结合 Quick Demo 源码,开发者只需使用 3 个核心接口,一小时即可实现音视频通话核心功能。
场景全面:支持 iOS、Android、Web 等平台,可以满足陌生人社交、在线招聘、远程医疗、线上咨询、售后客服等多种单人和多人通话场景使用。
服务稳定: 100% 可靠必达的音视频呼叫信令能力,保证连接安全可靠;音频弱网抗丢包 80%,视频弱网抗丢包 60%,并有 3A 算法,保证通话清晰稳定。
周边完善:提供业务场景所需的丰富高级功能,包括内容审核、云端录制、高级美颜等,让开发者的业务开展无忧且高效。
性价比高:目前月功能费仅为 1500 元/月,含 200,000 分钟免费时长。场景灵活度高,不限音视频,视频最高分辨率可支持 2K+;真正省心透明,支持 RTC 与 IM 服务单独采购,且不单独收取呼叫信令费用。
相关文章:
使用融云 CallPlus SDK,一小时实现一款 1V1 视频应用
9 月 21 日,融云直播课 社交泛娱乐出海最短变现路径如何快速实现一款 1V1 视频应用? 欢迎点击小程序报名~ 1V1 音视频、远程服务类应用的实现利器——融云 CallPlus SDK 上线! 关注【融云全球互联网通信云】了解更多 作为新一代音视频通话场…...
Redis Part1
单体架构:一台Web服务器、一台数据库服务器。 1.了解NoSql 什么是Nosql? NoSQL,即Not-Only-SQL,意思就是我们干事情不能只用SQL,泛指非关系型的数据库!NoSQL定位:作为关系型数据库的补充&am…...
代理HTTP使用不当会出现哪些问题?如何正确使用代理服务?
代理HTTP是一种常见的网络代理方式,它为客户端和服务器之间提供中间层,转发上下游的请求和响应。正确使用代理HTTP可以提高采集效率、增加网络安全性、加速网络速度、保护用户隐私。但是,使用不当就难以达到预期的效果,在使用代理…...
利用芯片74hc165为单片机增加输入扩展端口proteus仿真arduino
我们前面的博文《输入端口少如何扩展?74hc148或74ls148级联在arduino中实现16转4的应用》介绍了148,148输入后可以立即输出到数码管,可以说它是自带编BCD编码器的。而今天这里我们主要介绍的74hc165是没有编码器,这里我们以proteus为仿真环境…...
docker真实IP解决
背景 在微服务的环境中使用docker部署各个应用,部分应用使用容器内的真实ip暴露出服务。会导致微服务之间调用出现网络超时,要解决这个问题需要让微服务暴露为宿主机的ip 解决 方式一 使用docker-compose的配置 network_mode: "host" emq…...
Linux 内存泄漏检测的基本原理
一、mtrace分析内存泄露 mtrace(memory trace),是 GNU Glibc 自带的内存问题检测工具,它可以用来协助定位内存泄露问题。 它的实现源码在glibc源码的malloc目录下,其基本设计原理为设计一个函数 void mtrace ()&…...
Ubuntu下Nginx配置ModSecurity详细思路及过程
下面是一个简介: Ubuntu是一个linux操作系统,Nginx是一个web服务器软件,ModSecurity是一款开源的web应用防火墙(江湖人称“WAF”)。 如果上面的概念没有一定的了解,下面的内容其实也能看。就是不好操作。…...
入职美团近三个月,闲聊几句
校招入职美团近3个月,随便聊聊 今天和组内的小伙伴们团建来着,聊了很多,感触颇深,碎碎念一下。 作为组内的唯一的校招生,刚入职时面对复杂的业务,各种不熟悉的工具,真的是一脸懵。至少对我自己…...
setInterval倒计时切换页面后不准
背景 最近在做一个倒计时时,发现当切换浏览器tab后,再切回倒计时页面,倒计时的数据不准,比真正的剩余时间多,短时间还好,时间长了,计时器的误差会很大。 原因 倒计时是用setInterval每1000毫…...
信息安全三级概述
信息安全三级概述...
深入JVM:探索Java虚拟机
文章目录 1. JVM简介1.1 定义与核心作用1.2 JVM的跨平台特性 2. JVM内部结构深度探索2.1 类加载机制2.1.1 双亲委派模型2.1.2 OSGI框架2.1.3 类加载器分类 2.2 JVM运行时数据区2.2.1 程序计数器2.2.2 本地方法栈2.2.3 Java虚拟机栈 2.2.4 堆2.2.5 元数据区 2.3 JVM内存区域的性…...
【计算机网络】 RTT和RTO
文章目录 RTT——往返时延RTO(Retransmission Timeout)——超时重传时间 RTT——往返时延 RTT(Round-Trip Time)是计算机网络中的一个重要的性能指标,表示从发送端发送数据开始,到发送端接收到来自接收端的…...
Zabbix监控组件及流程
Zabbix 由5大组件构成 Zabbix Web、Zabbix Server、Zabbix Proxy、Zabbix Database、Zabbix Agent Zabbix监控系统具体监控系统流程如图: Zabbix Web Zabbix Web是基于PHP语言编写的WEB UI界面,展示Zabbix整个监控平台监控数据、配置信息、方便对整个…...
Type-C协议Ver2.0(学习笔记)
题记 本文以TYPE-C协议Ver2.0版本为基础,以直译为主,同时备注作者学习中遇到的问题与理解,如发现文中描述和协议原文有误,欢迎批评指正,感谢! 1 简介 随着USB接口的持续成功,需要调整USB技术…...
智慧工地:实现作业区域安全管控
智慧工地是围绕工程现场人、机、料、法、环及施工过程中质量、安全、进度、成本等各项数据满足工地多角色、多视角的有效监管,实现工程建设管理的降本增效。 建设工程安全文明施工与质量提升,全方位的监测施工人员、各类器械设备、消防安全隐患,并提前对风险进行预警…...
【Unity插件】实现多人在线游戏——Mirror插件的使用介绍
文章目录 前言导入Mirror插件 简单介绍一、RPC调用二、错误注意 基本使用一、创建场景的网络管理器二、创建一个玩家三、添加玩家初始生成位置四、玩家控制五、同步摄像机六、同步不同角色的名字和颜色修改七、同步动画八、同步子弹方法一方法二 九、聊天功能十、场景同步切换十…...
GeoSOS-FLUS未来土地利用变化情景模拟模型
软件简介 适用场景 GeoSOS-FLUS软件能较好的应用于土地利用变化模拟与未来土地利用情景 的预测和分析中,是进行地理空间模拟、参与空间优化、辅助决策制定的有效工 具。FLUS 模型可直接用于: 城市发展模拟及城市增长边界划定;城市内 部高分…...
IntelliJ IDEA使用_Debug操作
文章目录 版本说明图标和快捷键查看变量计算表达式条件断点多线程调试 版本说明 当前的IntelliJ IDEA 的版本是2021.2.2(下载IntelliJ IDEA) ps:不同版本一些图标和设置位置可能会存在差异,但应该大部分都差不多。 图标和快捷键…...
市场的新宠:4G智能手表
现在人们提到智能手表,健康监测、运动记录、接打电话等定是他不可或缺的功能,而其中通讯功能在绝大数多的智能手表上都是通过蓝牙实现的,需要让手表通过蓝牙连接到手机端来进行。在没有手机的情况下,配置再高的蓝牙智能手表也是“…...
Pytorch Advanced(一) Generative Adversarial Networks
生成对抗神经网络GAN,发挥神经网络的想象力,可以说是十分厉害了 参考 1、AI作家 2、将模糊图变清晰(去雨,去雾,去抖动,去马赛克等),这需要AI具有“想象力”,能脑补情节; 3、进行数…...
Python实操如何去除EXCEL表格中的公式并保留原有的数值
import xlwings as xw app xw.App(visibleTrue, add_bookFalse) # 创建一个不可见的Excel应用程序实例 wb app.books.open(rE:\公式.xlsx) # 打开Excel文件 sheet wb.sheets[DC] # 修改为你的工作表名称 # 假设需要清除公式的范围是A1到B10range_to_clear sheet.range(A…...
MFC串口通信控件MSCOMM32.OCX的安装注册
MSCOMM32.OCX是一个与Microsoft Corporation开发的MSComm控件相关联的文件。MSComm控件是软件应用程序用来与调制解调器、条形码读取器和其他串行设备等设备建立串行通信的通信控件。 下载地址1 https://download.csdn.net/download/m0_60352504/88345092 下载地址2 https://ww…...
27.顺序表练习题目(1)(2023王道数据结构2.2.3前8题)
【这里所有解答都写的是全部代码,目的是让大家能够直接复制上手运行,感受代码的运行过程,而不单单只是写了一个函数】 试题1:(王道2023数据结构综合应用题1) 从顺序表中删除具有最小值的元素(…...
Unity VideoPlayer 指定位置开始播放
如果 source是 videoclip(以下两种方式都可以): _videoPlayer.Play();Debug.Log("time: " _videoPlayer.clip.length);_videoPlayer.time 10; [SerializeField] VideoPlayer videoPlayer;public void SetClipWithTime(VideoClip…...
美团多场景建模的探索与实践
本文介绍了美团到家/站外投放团队在多场景建模技术方向上的探索与实践。基于外部投放的业务背景,本文提出了一种自适应的场景知识迁移和场景聚合技术,解决了在投放中面临外部海量流量带来的场景数量丰富、场景间差异大的问题,取得了明显的效果…...
第11篇:ESP32vscode_platformio_idf框架helloworld点亮LED
第1篇:Arduino与ESP32开发板的安装方法 第2篇:ESP32 helloword第一个程序示范点亮板载LED 第3篇:vscode搭建esp32 arduino开发环境 第4篇:vscodeplatformio搭建esp32 arduino开发环境 第5篇:doit_esp32_devkit_v1使用pmw呼吸灯实验 第6篇:ESP32连接无源喇叭播…...
React中的页面跳转方式详解
在React中,页面跳转通常通过路由来实现。React有多种路由库可供选择,其中最常用的是React Router。React Router提供了几种不同的跳转方式,包括使用组件进行页面跳转、使用组件进行重定向,以及使用编程式导航进行跳转。 使用组件进…...
Golang代码漏洞扫描工具介绍——govulncheck
Golang Golang作为一款近年来最火热的服务端语言之一,深受广大程序员的喜爱,笔者最近也在用,特别是高并发的场景下,golang易用性的优势十分明显,但笔者这次想要介绍的并不是golang本身,而且golang代码的漏洞…...
第31章_瑞萨MCU零基础入门系列教程之WIFI蓝牙模块驱动实验
本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写,需要的同学可以在这里获取: https://item.taobao.com/item.htm?id728461040949 配套资料获取:https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总: ht…...
arkworks工具栈概览
1. 引言 arkworks定位为zkSNARK编程的Rust生态。其开源代码见: https://github.com/arkworks-rs/ arkworks目前已广泛用于大量项目中,如:Aleo、anoma、celo、Espresso、Findora、Manta、Mina、Nimiq、penumbra等等。 参与arkworks开源实现…...
国外专门做童装的网站/seo推广有哪些方式
2019独角兽企业重金招聘Python工程师标准>>> 网站发生恶意注册会员,有图形验证码 ,和短信验证码 但是还是有大量恶意注册: session 和 cookie都是可以随便伪造的。 验证码有打码平台。 短信验证有短信验证平台。 IP限制有虚拟拨号…...
wordpress主题列表封面/西安seo教程
我正在尝试平均化熊猫的一组数据。csv文件中的数据。我有一个系列节目叫“轨道”。在前面的阶段中,我使用了dropna()方法来删除在读取csv文件时导入的一些空白行。在我使用的方法是平均5行以上的列。我不能使用滚动平均法,因为我希望使用当前值之前的两行…...
用Axure做的网站原型百度云/十大小说网站排名
人们会因为偶尔的小毛病而异常难受,而对大多数平常日子里的活蹦乱跳却毫无知觉。现代科学发现佛陀“放下身外之物”的观点也不够全面,因为确实有少数的身外之物能够给我们带来持续的幸福,值得我们追求。(1)良好的人际关…...
j2ee网站开发/网站推广四个阶段
第一种 1、windows下进入CMD启动2、在命令行中输入Tomcat安装的磁盘:E:3、进入Tomcat的主安装目录:cd Tomcat4、进入bin文件夹:cd bin5、查看该文件夹下边的文件目录:dir6、启动startup.bat 命令行中输入:startup.ba…...
舟山市普陀区建设局网站/电脑版百度网盘
有一位美丽的公主,被关押在一个城堡中最高的塔上,一条凶恶的巨龙看守着她,需要有一位勇士营救她…下面是各种语言如何想办法将公主从巨龙手中营救出来的。Java – 赶到那里,找到巨龙,开发出一套由多个功能层组成的恶龙…...
中国最火的网站/免费网络推广渠道
#基于ip设置 server{ listen 80; server_name 192.168.116.129; location /{ root /usr/etc/ngin/html/ip; index index.html; } } #基于域名 server{ listen 80; server_name z.com; location /{ root z.com; index index.ht…...