视频直播源码在Android端实现1对1音视频实时通话

申请权限

我们要使用 WebRTC 进行音视频互动时需要申请访问硬件的权限,至少要申请以下三种权限:

  • Camera 权限
  • Record Audio 权限
  • Intenet 权限

在Android中,申请权限分为静态权限申请和动态权限申请,这对于做 Android 开发的同学来说已经是习以为常的事情了。下面我们就看一下具体如何申请权限:

静态权限申请

在 Android 项目中的 AndroidManifest.xml 中增加以下代码:视频直播源码


...<uses-feature android:name="android.hardware.camera" />
<uses-featureandroid:glEsVersion="0x00020000"android:required="true" /><uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTENET" />...复制代码

动态权限申请

随着 Android 的发展,对安全性要求越来越高。除了申请静态权限之外,还需要动态申请权限。代码如下:

void requestPermissions(String[] permissions, intrequestCode);复制代码

实际上,对于权限这块的处理真正做细了要写不少代码,好在 Android 官方给我们又提供了一个非常好用的库 EasyPermissions , 有了这个库我们可以少写不少代码。使用 EasyPermissions 非常简单,在MainActivity中添加代码如下:视频直播源码

...protected void onCreate ( Bundle savedInstanceState ) {...String[] perms = {Manifest.permission.CAMERA,Manifest.permission.RECORD_AUDIO};if (!EasyPermissions.hasPermissions(this, perms)) {EasyPermissions.requestPermissions(this, "Need permissions for camera & microphone", 0, perms);}
}@Override
public void onRequestPermissionsResult(int requestCode,String[] permissions, int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);EasyPermissions.onRequestPermissionsResult(requestCode,permissions, grantResults, this);
}...复制代码

通过添加以上代码,就将权限申请好了,是不是非常简单?权限申请好了,我们开始做第二步,看在 Android 下如何引入 WebRTC 库。

引入库

在我们这个例子中要引入两个比较重要的库,第一个当然就是 WebRTC 库了,第二个是 socket.io 2库,用它来与信令服务器互联。

首先我们看一下如何引入 WebRTC 库(我这里使用的是最新 Android Studio 3.3.2)。在 Module 级别的 build.gradle 文件中增加以下代码:视频直播源码

...
dependencies {...implementation 'org.webrtc:google-webrtc:1.0.+'...
}复制代码

是不是非常简单?

接下来要引入 socket.io 2 库,用它来与我们之前用 Nodejs 搭建的信令服务器进行对接。再加上前面用到的EasyPermissions库,所以真正的代码应写成下面的样子:

...
dependencies {...implementation 'io.socket:socket.io-client:1.0.0'implementation 'org.webrtc:google-webrtc:1.0.+'implementation 'pub.devrel:easypermissions:1.1.3'
}复制代码

通过上面的方式我们就将需要引入的库全部引入进来了。下面就可以开始真的 WebRTC 之旅了。

万物的开始

我们都知道万物有个起源,我们在开发 WebRTC 程序时也不例外,WebRTC程序的起源就是PeerConnectionFactory。这也是与使用 JS 开发 WebRTC 程序最大的不同点之一,因为在 JS 中不需要使用 PeerConnectionFactory 来创建 PeerConnection 对象。

而在 Android/iOS 开发中,我们使用的 WebRTC 中的大部分对象基本上都是通过 PeerConnectionFactory 创建出来的。下面这张图就清楚的表达了 PeerConnectionFactory 在 WebRTC 中的地位。

[

image

 

 

通过该图我们可以知道,WebRTC中的核心对象 PeerConnection、LocalMediaStream、LocalVideoTrack、LocalAudioTrack都是通过 WebRTC 创建出来的。

PeerConnectionFactory的初始化与构造

在 WebRTC 中使用了大量的设计模式,对于 PeerConnectionFactory 也是如此。它本身就是工厂模式,而这个构造 PeerConnection 等核心对象的工厂又是通过 builder 模式构建出来的。

下面我们就来看看如何构造 PeerConectionFactory。在我们构造 PeerConnectionFactory 之前,首先要对其进行初始化,其代码如下:视频直播源码

PeerConnectionFactory.initialize(...);复制代码

初始化之后,就可以通过 builder 模式来构造 PeerConnecitonFactory 对象了。

...PeerConnectionFactory.Builder builder = 		PeerConnectionFactory.builder().setVideoEncoderFactory(encoderFactory).setVideoDecoderFactory(decoderFactory);...return builder.createPeerConnectionFactory();

通过上面的代码,大家也就能够理解为什么 WebRTC 要使用 buider 模式来构造 PeerConnectionFactory 了吧?主要是方便调整建造 PeerConnectionFactory的组件,如编码器、解码器等。

从另外一个角度我们也可以了解到,要更换WebRTC引警的编解码器该从哪里设置了哈!

音视频数据源

有了PeerConnectionFactory对象,我们就可以创建数据源了。实际上,数据源是 WebRTC 对音视频数据的一种抽象,表式数据可以从这里获取。

使用过 JS WebRTC API的同学都非常清楚,在 JS中 VideoTrack 和 AudioTrack 就是数据源。而在 Android 开发中我们可以知道 Video/AudioTrack 就是 Video/AudioSouce的封装,可以认为他们是等同的。

创建数据源的方式如下:视频直播源码

...
VideoSource videoSource = mPeerConnectionFactory.createVideoSource(false);
mVideoTrack = mPeerConnectionFactory.createVideoTrack(VIDEO_TRACK_ID, videoSource);...AudioSource audioSource = mPeerConnectionFactory.createAudioSource(new MediaConstraints());
mAudioTrack = mPeerConnectionFactory.createAudioTrack(AUDIO_TRACK_ID, audioSource);...													复制代码

数据源只是对数据的一种抽象,它是从哪里获取的数据呢?对于音频来说,在创建 AudioSource时,就开始从音频设备捕获数据了。对于视频来说我们可以指定采集视频数据的设备,然后使用观察者模式从指定设备中获取数据。

接下来我们就来看一下如何指定视频设备。

视频采集

在 Android 系统下有两种 Camera,一种称为 Camera1, 是一种比较老的采集视频数据的方式,别一种称为 Camera2, 是一种新的采集视频的方法。它们之间的最大区别是 Camera1使用同步方式调用API,Camera2使用异步方式,所以Camera2更高效。

我们看一下 WebRTC 是如何指定具体的 Camera 的:视频直播源码

private VideoCapturer createVideoCapturer() {if (Camera2Enumerator.isSupported(this)) {return createCameraCapturer(new Camera2Enumerator(this));} else {return createCameraCapturer(new Camera1Enumerator(true));}
}private VideoCapturer createCameraCapturer(CameraEnumerator enumerator) {final String[] deviceNames = enumerator.getDeviceNames();// First, try to find front facing cameraLog.d(TAG, "Looking for front facing cameras.");for (String deviceName : deviceNames) {if (enumerator.isFrontFacing(deviceName)) {Logging.d(TAG, "Creating front facing camera capturer.");VideoCapturer videoCapturer = enumerator.createCapturer(deviceName, null);if (videoCapturer != null) {return videoCapturer;}}}// Front facing camera not found, try something elseLog.d(TAG, "Looking for other cameras.");for (String deviceName : deviceNames) {if (!enumerator.isFrontFacing(deviceName)) {Logging.d(TAG, "Creating other camera capturer.");VideoCapturer videoCapturer = enumerator.createCapturer(deviceName, null);if (videoCapturer != null) {return videoCapturer;}}}return null;
}复制代码

上面代码的逻辑也比较简单:

  • 首先看 Android 设备是否支持 Camera2.
  • 如果支持就使用 Camera2, 如果不支持就使用 Camera1.
  • 在获到到具体的设备后,再看其是否有前置摄像头,如果有就使用
  • 如果没有有效的前置摄像头,则选一个非前置摄像头。

通过上面的方法就可以拿到使用的摄像头了,然后将摄像头与视频源连接起来,这样从摄像头获取的数据就源源不断的送到 VideoTrack 里了。

下面我们来看看 VideoCapture 是如何与 VideoSource 关联到一起的:视频直播源码

...mSurfaceTextureHelper = SurfaceTextureHelper.create("CaptureThread",mRootEglBase.getEglBaseContext());mVideoCapturer.initialize(mSurfaceTextureHelper,getApplicationContext(), videoSource.getCapturerObserver());...mVideoTrack.setEnabled(true);
...复制代码

上面的代码中,在初始化 VideoCaptuer 的时候,可以过观察者模式将 VideoCapture 与 VideoSource 联接到了一起。因为 VideoTrack 是 VideoSouce 的一层封装,所以此时我们开启 VideoTrack 后就可以拿到视频数据了。

当然,最后还要调用一下 VideoCaptuer 对象的 startCapture 方法真正的打开摄像头,这样 Camera 才会真正的开始工作哈,代码如下:视频直播源码

@Override
protected void onResume() {super.onResume();mVideoCapturer.startCapture(VIDEO_RESOLUTION_WIDTH, VIDEO_RESOLUTION_HEIGHT, VIDEO_FPS);
}复制代码

拿到了视频数据后,我们如何将它展示出来呢?

渲染视频

在 Android 下 WebRTC 使用OpenGL ES 进行视频渲染,用于展示视频的控件是 WebRTC 对 Android 系统控件 SurfaceView 的封装。

WebRTC 封装后的 SurfaceView 类为 org.webrtc.SurfaceViewRenderer。在界面定义中应该定义两个SurfaceViewRenderer,一个用于显示本地视频,另一个用于显示远端视频。

其定义如下:

...<org.webrtc.SurfaceViewRendererandroid:id="@+id/LocalSurfaceView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center" /><org.webrtc.SurfaceViewRendererandroid:id="@+id/RemoteSurfaceView"android:layout_width="120dp"android:layout_height="160dp"android:layout_gravity="top|end"android:layout_margin="16dp"/>...复制代码

通过上面的代码我们就将显示视频的 View 定义好了。光定义好这两个View 还不够,还要对它做进一步的设置:

...mLocalSurfaceView.init(mRootEglBase.getEglBaseContext(), null);
mLocalSurfaceView.setScalingType(RendererCommon.ScalingType.SCALE_ASPECT_FILL);
mLocalSurfaceView.setMirror(true);
mLocalSurfaceView.setEnableHardwareScaler(false /* enabled */);...复制代码

其含义是:

  • 使用 OpenGL ES 的上下文初始化 View。
  • 设置图像的拉伸比例。
  • 设置图像显示时反转,不然视频显示的内容与实际内容正好相反。
  • 是否打开便件进行拉伸。

通过上面的设置,我们的 view 就设置好了,对于远端的 Veiw 与本地 View 的设置是一样的,我这里就不再赘述了。

接下来将从摄像头采集的数据设置到该view里就可以显示了。设置非常的简单,代码如下:视频直播源码

...
mVideoTrack.addSink(mLocalSurfaceView);
...复制代码

对于远端来说与本地视频的渲染显示是类似的,只不过数据源是从网络获取的。

通过以上讲解,大家应该对 WebRTC 如何采集数据、如何渲染数据有了基本的认识。下面我们再看来下远端的数据是如何来的。

创建 PeerConnection

要想从远端获取数据,我们就必须创建 PeerConnection 对象。该对象的用处就是与远端建立联接,并最终为双方通讯提供网络通道。

我们来看下如何创建 PeerConnecion 对象。

...
PeerConnection.RTCConfiguration rtcConfig = new PeerConnection.RTCConfiguration(iceServers);
...
PeerConnection connection =mPeerConnectionFactory.createPeerConnection(rtcConfig,mPeerConnectionObserver);...
connection.addTrack(mVideoTrack, mediaStreamLabels);
connection.addTrack(mAudioTrack, mediaStreamLabels);
...复制代码

PeerConnection 对象的创建还是要使我们之前讲过的 PeerConnectionFactory 来创建。WebRTC 在建立连接时使用 ICE 架构,一些参数需要在创建 PeerConnection 时设置进去。

另外,当 PeerConnection 对象创建好后,我们应该将本地的音视频轨添加进去,这样 WebRTC 才能帮我们生成包含相应媒体信息的 SDP,以便于后面做媒体能力协商使用。

通过上面的方式,我们就将 PeerConnection 对象创建好了。与 JS 中的 PeerConnection 对象一样,当其创建好之后,可以监听一些我们感兴趣有事件了,如收到 Candidate 事件时,我们要与对方进行交换。

PeerConnection 事件的监听与 JS 还是有一点差别的。在 JS 中,监听 PeerConnection的相关事件非常直接,直接实现peerconnection.onXXX就好了。而 Android 中的方式与 JS 略有区别,它是通过观察者模式来监听事件的。大家这点一定要注意!

双方都创建好 PeerConnecton 对象后,就会进行媒体协商,协商完成后,数据在底层就开始传输了。

信令驱动

在整个 WebRTC 双方交互的过程中,其业务逻辑的核心是信令, 所有的模块都是通过信令串联起来的。

以 PeerConnection 对象的创建为例,该在什么时候创建 PeerConnection 对象呢?最好的时机当然是在用户加入房间之后了 。

下面我们就来看一下,对于两人通讯的情况,信令该如何设计。在我们这个例子中,可以将信令分成两大类。第一类为客户端命令;第二类为服务端命令;

客户端命令有:

  • join: 用户加入房间
  • leave: 用户离开房间
  • message: 端到端命令(offer、answer、candidate)

服务端命令:

  • joined: 用户已加入
  • leaved: 用户已离开
  • other_joined:其它用户已加入
  • bye: 其它用户已离开
  • full: 房间已满

通过以上几条信令就可以实现一对一实时互动的要求,是不是非常的简单?视频直播源码

在本例子中我们仍然是通过socket.io与之前搭建的信令服备器互联的。由于 socket.io 2 是跨平台的,所以无论是在 js 中,还是在 Android 中,我们都可以使用其客户端与服务器相联,非常的方便。

下面再来看一下,收到不同信令后,客户端的状态变化:

[

image

 

 

客户端一开始的时候处于 Init/Leave 状态。当发送 join 消息,并收到服务端的 joined 后,其状态变为 joined。

此时,如果第二个用户加入到房间,则客户端的状态变为了 joined_conn, 也就是说此时双方可以进行实时互动了。

如果此时,该用户离开,则其状态就变成了 初始化状态。其它 case 大家可以根据上面的图自行理解了。

视频直播源码
本文转载自网络,感谢(音视频直播技术专家)的分享,转载仅为分享干货知识,如有侵权欢迎联系云豹科技进行删除处理

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 都是程序员,为什么差距这么大?原因就是你在看剧耍手机,而他们正在做这些事情

    人要求能成为别人羡慕与尊崇的对象,而又看到自己的缺点只配别人的憎恨与鄙视,他发现自己所处的这种尴尬,便产生出一种想象中最不公平和最容易作奸犯科的激情,因为他对于那谴责他和让他认识自己缺点的真理,心怀切齿痛恨。——《思想录》你的宅家时间疫情这些天在家,上班族…...

    2024/4/15 17:49:42
  2. 肥桃的Java学习记录19:XML与JSON

    XML与JSON 简介 可扩展标记语言(eXtensible Markup Language) 特性: 1.xml具有平台无关性, 是一门独立的标记语言. 不论是在Windows或者Mac或者其他系统打开,还是用Java,C,Python语言进行解析都可以正常显示。 xml可以不依赖任何东西来描述。 2.xml具有自我描述性 可以去描…...

    2024/4/17 15:50:36
  3. 布隆过滤器(Bloom Filter)

    刚接触布隆过滤器这个词,感觉挺难,但是深入去了解会发现里面的设计很巧妙文章目录出现背景和解决的问题先来看看Bitmap布隆过滤器原理运用场景BloomFilter使用总结出现背景和解决的问题 隆过滤器在1970年由布隆提出,它实际上由一个很长的二进制向量和一系列随机映射函数组成…...

    2024/4/24 15:11:38
  4. 结合领域驱动设计的SOA分布式软件架构

    一、SOA与DDD的定义SOA与DDD都是常用的系统架构,但两者之间所针对的核心是不同的。SOA(面向服务架构)由Gartner 在1996年提出来,它是一种分布式的软件架构,它可以根据需求通过网络对松散耦合的粗粒度应用组件进行部署、组合和使用。简单来说,SOA就是一种大型系统开发的体…...

    2024/4/25 7:43:46
  5. JVM自己的线程

    线程说明Attach ListenerAttach Listener线程是负责接收到外部的命令,而对该命令进行执行的并且吧结果返回给发送者。通常我们会用一些命令去要求jvm给我们一些反馈信息,如:java -version、jmap、jstack等等。如果该线程在jvm启动的时候没有初始化,那么,则会在用户第一次执…...

    2024/4/17 20:04:16
  6. JavaWeb——HTML表格作业(2)

    一下为HTML中的表格相关的作业 一、登陆界面 代码实现: <!DOCTYPE html> <html><head><meta charset="UTF-8"><title>登陆</title></head><body style="text-align: center;"><div style="backg…...

    2024/4/5 23:25:21
  7. 【白话图解Representation基础发展】

    转载https://blog.csdn.net/ycheng_sjtu/article/details/48520293深度学习(Deep Learning),自然语言处理(NLP)及其表达(Representation) 简介 过去几年中,深度神经网络在模式识别领域占据着统治地位。他们在诸多计算机视觉任务领域,将之前的最好算法彻底击败。语言识…...

    2024/3/27 20:00:01
  8. 为什么K8s在阿里能成功过?基于K8s的云原生改造实践过程

    导读:本文描述了阿里巴巴在容器管理领域的技术演进历程,解读了为什么 K8s 最终能够大获成功的原因,以及到今年 双11 阿里巴巴内部的 K8s 应用情况。内容着重描述了阿里巴巴基于 K8s 的云原生改造实践过程的三大能力升级,在对应能力升级过程中沉淀的技术解决方案,以及通过这…...

    2024/5/3 21:29:28
  9. 2020-09-09宝塔搭建网站(sql-lab闯关)

    打开虚拟机查询IPVMware workstation 中打开centos 7,登录后查询IP如下图:输入命令 ip addr 查询到ip为192.168.23.138打开宝塔面板cmd中ssh连接虚拟机 命令:ssh root@192.168.23.138 (此处为上文查询到的IP)然后输入密码 接着输入 bt 接着输入14(可以直接输入bt14)登录 如…...

    2024/4/25 9:00:59
  10. UML 建模工具分享,体验不一样的感觉

    亿图图示---中国制造、免费0广告、支持Mac、Windows和Linux系统、有在线网页版、有云储存功能!大家好,我叫亿图图示,英文名Edraw Max ,是一款专业的流程图软件,尤其擅长适合UML图。我自认为是超好用的UML建模工具~希望大家可以认识我有图有真相!以下图片均由亿图图示绘制…...

    2024/4/17 19:06:20
  11. Ajax轮询和WebSocket

    Ajax轮询和WebSocketAjax轮询WebSocketWebSocket的事件触发机制 Ajax轮询 ajax轮询十分简单,让浏览器每隔几秒就发送请求,询问服务器是否有新的信息。也就是说,客户端发起连接后,如果没消息,就一直不返回Response给客户端。直到有消息才返回,返回完之后,客户端再次建立连…...

    2024/3/27 20:16:19
  12. python里面selenium模块安装及驱动

    1、selenium介绍【selenium】是一个浏览器自动化测试工具,爬虫中我们可以利用它驱动浏览器执行特定动作,比如点击、下拉、在网页输入框中输入信息的等… 对于一些动态渲染的页面来说,这种抓取方式非常有效。 只要是网页中可见的内容都能抓取,简单来说就是“可见即可爬”。 …...

    2024/4/26 13:04:36
  13. pycharm安装后打不开?Mac Pycharm2020 打不开的解决方法

    pycharm安装后打不开?Mac Pycharm2020 打不开怎么办? 不废话,直接切入主题: • 打开访达,切到应用程序,找到Pycharm.app,右键->显示包内容,打开Contents/MacOS/ • 打开终端,cd 到Contents/MacOS/目录,直接将MacOS文件夹拖到终端里面,就会显示该文件件的全路径,然后cd进去…...

    2024/5/5 5:14:34
  14. 养老院解决方案之智能无感消毒与智能查房系统-新导智能

    1.产品概述1.1.产品背景随着人口老龄化问题急剧扩大,老年人的养老问题已受到政府及社会的普遍关注及关心,为使更多的老年人更好的安享晚年,越来越多的养老机构不断兴建起来。为保障老年人的安全,使老人能享受到更加全面贴心的服务,需要运用科技的手段进行苏州新导养老院解…...

    2024/3/29 2:55:53
  15. 针对贷款行业目前有什么好的获客渠道吗

    贷款客户大数据精准获客18701370488 2020年已经过去了一大半,上半年对于信贷行业来说无疑是一次挑战,信贷金融行业的整改,让获客变得异常的艰难。有的信贷公司为了完成业绩入驻了大量的获客平台,但是最后却是十分的失望。 为什么说金融行业获客越来越难,主要是以下几点: …...

    2024/3/30 11:57:19
  16. iOS开发~卡顿优化

    应用卡顿是让人头疼的问题,不像闪退一样直观明了,可以直接通过异常信号或调用栈分析得到,常常让人无处下手。好的用户体验需要我们把细节做到位,画面掉帧会导致卡顿感,造成不好的印象。卡顿是如何造成的,下面详细讲述。认识卡顿一些概念FPS:Frames Per Second,表示每秒…...

    2024/5/6 17:39:35
  17. 厉害了!华为将发布国产编程语言,打破国外垄断

    近日,传华为即将发布国产自主编程语言——“仓颉”,软件摆脱美国控制。美国在编程语言方面具有绝对的优势,美国能禁止编程语言或编译器对我国授权吗?唯一能约束一种编程语言的就是专利,但C语言等目前并不受任何专利约束。Bell实验室最早实现了C语言和Unix,但是它们未能通…...

    2024/5/6 20:20:36
  18. Vue常用组件插件

    vue常用组件插件UI组件element- 饿了么出品的Vue2的web UI工具套件Vux- 基于Vue和WeUI的组件库mint-ui- Vue 2的移动UI元素iview- 基于 Vuejs 的开源 UI 组件库Keen-UI- 轻量级的基本UI组件合集vue-material- 通过Vue Material和Vue 2建立精美的app应用muse-ui- 三端样式一致的…...

    2024/5/3 10:14:45
  19. 3 张图带你走近蚂蚁mPaaS音视频通话组件

    简介: 远程问诊、线上开户、车载语音通话……蚂蚁 mPaaS 正在“拥抱新技术,探索新未来”。音视频技术的进步,让线上办公不再是一时权宜之计,也使得线上业务的“无接触”开展成为可能。近日,蚂蚁集团推出的移动开发平台mPaaS上线了音视频通话组件,除了满足各类型企业的远程…...

    2024/3/31 0:53:29
  20. Unity 基础 之 实现简单监听晃动(摇一摇)手机设备震动手机设备的事件的功能

    Unity 基础 之 实现简单监听晃动(摇一摇)手机设备震动手机设备的事件的功能目录Unity 基础 之 实现简单监听晃动(摇一摇)手机设备震动手机设备的事件的功能一、简单介绍二、知识点三、实现原理四、注意事项五、实现步骤六、关键代码一、简单介绍Unity中的一些基础知识点。本…...

    2024/3/31 0:38:43

最新文章

  1. 人工智能概述与入门基础简述

    人工智能&#xff08;AI&#xff09;是计算机科学的一个分支&#xff0c;它致力于创建能够执行通常需要人类智能的任务的机器。这篇科普文章将全面介绍人工智能的基本概念、发展历程、主要技术、实际应用以及如何入门这一领域。 一、人工智能的定义与发展历程 人工智能的概念…...

    2024/5/7 0:49:45
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/5/6 9:38:23
  3. C# 抽象类、接口

    &#xff08;1&#xff09;、抽象类和抽象方法的定义和实现&#xff1a;abstract override abstract class Vehicle{ public abstract void Run(); } 继承抽象类并且实现抽象方法 class RaceCar : Vehicle{ public override void Run(){ } } &#xff08;2&#xff09;、接口的…...

    2024/5/6 11:49:43
  4. OpenAI 宣布, ChatGPT 网页端无需注册就能立即使用(2024年4月1日)

    今天&#xff0c;OpenAI宣布&#xff0c;为了让更多人轻松体验人工智能的强大功能&#xff0c;现在无需注册账户即可立即使用 ChatGPT。这一变化是他们使命的核心部分&#xff0c;即让像 ChatGPT 这样的工具广泛可用&#xff0c;让世界各地的人们都能享受到 AI 带来的好处。 网…...

    2024/5/5 19:55:36
  5. 416. 分割等和子集问题(动态规划)

    题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义&#xff1a;dp[i][j]表示当背包容量为j&#xff0c;用前i个物品是否正好可以将背包填满&#xff…...

    2024/5/6 18:23:10
  6. 【Java】ExcelWriter自适应宽度工具类(支持中文)

    工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...

    2024/5/6 18:40:38
  7. Spring cloud负载均衡@LoadBalanced LoadBalancerClient

    LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon&#xff0c;直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件&#xff0c;我们讨论Spring负载均衡以Spring Cloud2020之后版本为主&#xff0c;学习Spring Cloud LoadBalance&#xff0c;暂不讨论Ribbon…...

    2024/5/6 23:37:19
  8. TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

    一、背景需求分析 在工业产业园、化工园或生产制造园区中&#xff0c;周界防范意义重大&#xff0c;对园区的安全起到重要的作用。常规的安防方式是采用人员巡查&#xff0c;人力投入成本大而且效率低。周界一旦被破坏或入侵&#xff0c;会影响园区人员和资产安全&#xff0c;…...

    2024/5/6 7:24:07
  9. VB.net WebBrowser网页元素抓取分析方法

    在用WebBrowser编程实现网页操作自动化时&#xff0c;常要分析网页Html&#xff0c;例如网页在加载数据时&#xff0c;常会显示“系统处理中&#xff0c;请稍候..”&#xff0c;我们需要在数据加载完成后才能继续下一步操作&#xff0c;如何抓取这个信息的网页html元素变化&…...

    2024/5/7 0:32:52
  10. 【Objective-C】Objective-C汇总

    方法定义 参考&#xff1a;https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...

    2024/5/6 6:01:13
  11. 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】

    &#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格…...

    2024/5/6 7:24:06
  12. 【ES6.0】- 扩展运算符(...)

    【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数&#xff0…...

    2024/5/6 1:08:53
  13. 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?

    文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕&#xff0c;各大品牌纷纷晒出优异的成绩单&#xff0c;摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称&#xff0c;在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁&#xff0c;多个平台数据都表现出极度异常…...

    2024/5/6 20:04:22
  14. Go语言常用命令详解(二)

    文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令&#xff0c;这些命令可以帮助您在Go开发中进行编译、测试、运行和…...

    2024/5/7 0:32:51
  15. 用欧拉路径判断图同构推出reverse合法性:1116T4

    http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b&#xff0c;我们在 a i a_i ai​ 和 a i 1 a_{i1} ai1​ 之间连边&#xff0c; b b b 同理&#xff0c;则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然&#xff0…...

    2024/5/6 7:24:04
  16. 【NGINX--1】基础知识

    1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息&#xff0c;并安装一些有助于配置官方 NGINX 软件包仓库的软件包&#xff1a; apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...

    2024/5/6 7:24:04
  17. Hive默认分割符、存储格式与数据压缩

    目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限&#xff08;ROW FORMAT&#xff09;配置标准HQL为&#xff1a; ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...

    2024/5/6 19:38:16
  18. 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

    文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中&#xff0c;传感器和控制器产生大量周…...

    2024/5/6 7:24:03
  19. --max-old-space-size=8192报错

    vue项目运行时&#xff0c;如果经常运行慢&#xff0c;崩溃停止服务&#xff0c;报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中&#xff0c;通过JavaScript使用内存时只能使用部分内存&#xff08;64位系统&…...

    2024/5/7 0:32:49
  20. 基于深度学习的恶意软件检测

    恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞&#xff0c;例如可以被劫持的合法软件&#xff08;例如浏览器或 Web 应用程序插件&#xff09;中的错误。 恶意软件渗透可能会造成灾难性的后果&#xff0c;包括数据被盗、勒索或网…...

    2024/5/6 21:25:34
  21. JS原型对象prototype

    让我简单的为大家介绍一下原型对象prototype吧&#xff01; 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定&#xff0c;每一个构造函数都有一个 prototype 属性&#xff0c;指向另一个对象&#xff0c;所以我们也称为原型对象…...

    2024/5/6 7:24:02
  22. C++中只能有一个实例的单例类

    C中只能有一个实例的单例类 前面讨论的 President 类很不错&#xff0c;但存在一个缺陷&#xff1a;无法禁止通过实例化多个对象来创建多名总统&#xff1a; President One, Two, Three; 由于复制构造函数是私有的&#xff0c;其中每个对象都是不可复制的&#xff0c;但您的目…...

    2024/5/6 7:24:01
  23. python django 小程序图书借阅源码

    开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索图书&#xff0c;轮播图&#xff0…...

    2024/5/7 0:32:47
  24. 电子学会C/C++编程等级考试2022年03月(一级)真题解析

    C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...

    2024/5/6 16:50:57
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57