教程:FFmpeg结合GPU实现720p至4K视频转换

将一个 720p 的视频放大编码到 4K,这样的视频处理在很多业务场景中都会用到。很多视频社交、短视频、视频点播等应用,都会需要通过服务器来处理大量的视频编辑需求。

本文我们会探讨一下做这样的视频处理,最低的 GPU 指标应该是多少。利用开源的 FFmpeg 放大视频的原理和基本步骤是怎样的。然后,我们通过一个简单的示例教程,一步步带领你利用带有 CUDA 支持的 FFmpeg 将一个视频从 720p 分辨率放大并编码到 4K 分辨率。示例教程会适合希望在GPU 服务器上高效处理视频的视频工程师和开发者,步骤会比较详细,刚接触视频编解码的开发者也可以尝试。

达到什么指标的 GPU 适合视频处理?

视频的处理必然离不开 GPU 的加持。但是什么样的 GPU 规格才能满足,或者说最低限度地满足视频处理的需要呢?

最低指标

以下是基于不同分辨率的基准线:

分辨率所需显存CUDA 核心数张量核心数内存带宽RT 核心数
1080p8GB2,000+100+300+ GB/s20+
4K16GB4,000+200+500+ GB/s40+
8K32GB+8,000+400+1+ TB/s80+

你可以基于这些指标,去寻找合适的 GPU。已知 NVIDIA H100 达到了甚至超过了 4K 和 8K 视频处理的这些基准。

使用 FFmpeg 放大视频的原理

放大视频的方法有很多种,最前沿的方法是 AI 技术,但是这需要训练模型,还要不断调优以达到想要的结果。另外,你还可以使用 FFmpeg,这是最简单直接的方法。

使用 ffmpeg 将视频从 720p 放大到 4K 的原理主要涉及图像处理中的尺度变换(scaling)技术。具体来说,ffmpeg 使用内置的滤镜和编解码器来实现这一过程。下面是详细的原理和步骤:

1. 输入文件读取

首先,ffmpeg 读取输入的 720p 视频文件。这个文件包含一系列低分辨率的帧。

2. 尺度变换滤镜

ffmpeg 使用 -vf 参数指定视频滤镜,其中 scale 滤镜用于改变视频的分辨率。例如,-vf "scale=3840:2160" 表示将视频的宽度调整为 3840 像素,高度调整为 2160 像素,即从 720p (1280x720) 放大到 4K (3840x2160)。

3. 插值算法

在尺度变换过程中,scale 滤镜使用插值算法来估计新的像素值。常见的插值算法包括:

  • 最近邻插值(Nearest Neighbor Interpolation):简单地复制最近的像素值。这种方法速度快但结果粗糙,常用于简单的放大操作。
  • 双线性插值(Bilinear Interpolation):通过线性插值算法估计缺失像素的值。这种方法比最近邻插值更平滑,但计算量稍大。
  • 双三次插值(Bicubic Interpolation):通过三次多项式插值算法估计缺失像素的值。这种方法计算量更大,但结果更平滑,细节更好。

4. 编码和输出

放大后的视频帧需要重新编码以生成新的视频文件。ffmpeg 使用 -c:v 参数指定视频编解码器,例如 libx264 用于 H.264 编码。此外,可以通过 -preset 参数指定编码速度和质量的平衡,例如 fast 表示较快的编码速度,-b:v 参数指定目标视频比特率,例如 10M 表示 10 Mbps。

示例教程

为了方便大家了解实际的视频放大过程,我们给大家一份简单实用的上手操作教程。一步步带领你利用带有 CUDA 支持的 FFmpeg 将一个视频从 720p 分辨率放大并编码到 4K 分辨率。

我们在这里选择了 DigitalOcean 的 GPU Droplet 云服务器,注册后有赠送使用额度,可以免费使用。

NVIDIA H100 提供了广泛的 CUDA、张量和 RT 核心,为高分辨率视频处理工作负载提供了必要的资源:

  • 显存(VRAM):NVIDIA H100 配备了 80GB HBM2e 显存,可以处理 4K 和 8K 视频。
  • CUDA 核心:18,432 个 CUDA 核心用于高速处理和编码。
  • 张量核心:640 个张量核心支持增强型任务,例如降噪。
  • RT 核心:128 个 RT 核心用于实时处理和视觉效果。
  • 内存带宽:最高可达 2 TB/s,允许平滑播放和快速数据传输。

对于视频处理而言,这些规格意味着更快的处理速度、高效的缩放以及实时效果渲染。H100 可以处理最密集的视频任务,同时保持最小的延迟和高速处理能力。

准备工作

在开始之前,请确保你具备以下条件:

  • 注册 DigitalOcean 账户,注册后即可有 200$使用额度。
  • 部署并运行 GPU Droplet,我们会在下面介绍步骤,你也可以观看官方的视频教程。
  • 你需要对 Linux 命令行有所了解。

以上就是你需要准备的。我们也会在后面的步骤中一步步带你做。这次我们要处理的视频会从开源项目中获取,所以你不需要额外准备视频文件。

步骤 1 - 设置 GPU Droplet

1、创建新项目 - 你需要从云端控制面板创建一个新项目,并将其与 GPU Droplet 绑定。

2、创建 GPU Droplet - 登录你的 DigitalOcean 账户,创建一个新的 GPU Droplet,并选择 AI/ML Ready 作为操作系统。该操作系统镜像安装了所有必要的 NVIDIA GPU 驱动程序。

3、添加 SSH 密钥进行身份验证 - 添加 SSH 密钥是为了与 GPU Droplet 进行身份验证,通过添加 SSH 密钥,你可以从终端登录到 GPU Droplet。

4、完成并创建 GPU Droplet - 完成上述所有步骤后,完成并创建新的 GPU Droplet。

步骤 2 - 安装依赖项

GPU Droplet 准备好并已部署后,你可以从终端使用 SSH 登录到 GPU Droplet。

ssh root@<your-droplet-ip>

确保你的基于 Ubuntu 的 GPU Droplet 是最新的:

sudo apt update && sudo apt upgrade -y

接下来,请使用以下命令重启 GPU Droplet 并等待其上线。在运行 sudo apt update && sudo apt upgrade -y 后重启通常是为了确保任何更新的系统组件,特别是内核和硬件驱动程序,都被完全加载和应用。

注意:在大多数 Linux 系统上,你可以通过运行以下命令来检查是否需要重启:

[ -f /var/run/reboot-required ] && echo "Reboot is required"

如果在内核和硬件驱动程序更新后需要重启,你将看到上述命令的输出如下:

Reboot is required

现在,让我们使用以下命令验证 NVIDIA 驱动程序和 CUDA 版本:

nvidia-smi

此命令应显示 NVIDIA GPU 的详细信息和驱动程序版本。

Output+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.183.06             Driver Version: 535.183.06   CUDA Version: 12.2     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
|   0  NVIDIA H100 80GB HBM3          Off | 00000000:00:09.0 Off |                    0 |
| N/A   28C    P0              67W / 700W |      0MiB / 81559MiB |      0%      Default |
|                                         |                      |             Disabled |
+-----------------------------------------+----------------------+----------------------+
                                                                                         
+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
|  No running processes found                                                           |
+---------------------------------------------------------------------------------------+

接下来,验证 CUDA 的安装:

nvcc --version

你应该看到有关已安装 CUDA 版本的信息。

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2023 NVIDIA Corporation
Built on Mon_Apr__3_17:16:06_PDT_2023
Cuda compilation tools, release 12.1, V12.1.105
Build cuda_12.1.r12.1/compiler.32688072_0

注意:请从上述输出中确保 nvidia-smi 命令和 nvcc -v 命令的 CUDA 驱动程序版本匹配。如果两个命令的输出之间存在版本不匹配,你必须重新安装两者并再次重启 GPU Droplet。

接下来,你将安装 FFmpeg。FFmpeg 可以利用 GPU 加速视频处理,然后我们就可以缩放视频了。

sudo apt install -y ffmpeg

运行以下命令检查 FFmpeg 是否检测到 CUDA 支持。

ffmpeg -hwaccels

此命令应列出 cuda、vdpau 和 vappi,表明 GPU 加速可用。

ffmpeg version 4.4.2-0ubuntu0.22.04.1 Copyright (c) 2000-2021 the FFmpeg developers
  built with gcc 11 (Ubuntu 11.2.0-19ubuntu1)
  configuration: --prefix=/usr --extra-version=0ubuntu0.22.04.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-pocketsphinx --enable-librsvg --enable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
  libavutil      56. 70.100 / 56. 70.100
  libavcodec     58.134.100 / 58.134.100
  libavformat    58. 76.100 / 58. 76.100
  libavdevice    58. 13.100 / 58. 13.100
  libavfilter     7.110.100 /  7.110.100
  libswscale      5.  9.100 /  5.  9.100
  libswresample   3.  9.100 /  3.  9.100
  libpostproc    55.  9.100 / 55.  9.100
Hardware acceleration methods:
vdpau
cuda
vaapi
qsv
drm
opencl

步骤 3 - 下载样本视频数据以测试

在本教程中,你将使用 Blender 基金会提供的一个样本视频来演示 GPU 加速视频处理。Blender 是一个免费且开源的 3D 创作套件,支持整个 3D 流水线——建模、装配、动画、模拟、渲染等。

使用以下命令下载样本视频:

wget https://download.blender.org/demo/movies/ToS/tears_of_steel_720p.mov

步骤 4 - 使用 FFmpeg 将视频放大至 4K

现在你可以使用已安装的 FFmpeg 和配置好的 GPU 来处理视频了。

ffmpeg 命令的基本语法是:

ffmpeg -i <input_file> -vf "scale=width:height" -c:v <codec_name> -preset <encoding_preset> -b:v <bitrate> <output_file>

各参数的含义如下:

  • input_file:输入视频文件的名称。
  • scale=宽度:高度:缩放滤镜,其中宽度和高度是你希望调整的尺寸。
  • codec_name:用于编码视频的编解码器(例如,libx264 表示 H.264)。
  • encoding_preset:编码的速度与压缩效率预设(例如,fastmediumslow)。
  • bitrate:目标视频比特率(例如,10M 表示 10 Mbps)。
  • output_file:输出文件的名称,包括格式和扩展名。

在这个例子中,你将把视频从 720p 放大到 4K 分辨率。

运行以下 FFmpeg 命令将视频放大至 4K(3840x2160 分辨率):

ffmpeg -i tears_of_steel_720p.mov -vf "scale=3840:2160" -c:v libx264 -preset fast -b:v 10M tears_of_steel_4k.mov

处理完成后,你应该能看到如下输出:

Output #0, mov, to 'tears_of_steel_4k.mov':
  Metadata:
    major_brand     : qt  
    minor_version   : 512
    compatible_brands: qt  
    encoder         : Lavf58.76.100
  Stream #0:0(eng): Video: h264 (avc1 / 0x31637661), yuv420p(tv, progressive), 3840x2160 [SAR 120:89 DAR 640:267], q=2-31, 10000 kb/s, 24 fps, 12288 tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : FFMP
      encoder         : Lavc58.134.100 libx264
    Side data:
      cpb: bitrate max/min/avg: 0/0/10000000 buffer size: 0 vbv_delay: N/A
  Stream #0:1(eng): Audio: aac (LC) (.mov / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]
      encoder         : Lavc58.134.100 aac
frame=17620 fps= 69 q=-1.0 Lsize=  949201kB time=00:12:14.07 bitrate=10592.7kbits/s speed=2.88x    
video:937125kB audio:11532kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.057354%
[libx264 @ 0x564504ee7f40] frame I:223   Avg QP:22.07  size:180259
[libx264 @ 0x564504ee7f40] frame P:5973  Avg QP:25.97  size: 92140
[libx264 @ 0x564504ee7f40] frame B:11424 Avg QP:27.21  size: 32306
[libx264 @ 0x564504ee7f40] consecutive B-frames:  8.2% 14.4%  5.4% 72.0%
[libx264 @ 0x564504ee7f40] mb I  I16..4: 20.9% 75.8%  3.2%
[libx264 @ 0x564504ee7f40] mb P  I16..4:  9.4% 21.2%  1.1%  P16..4: 29.5%  4.3%  1.4%  0.0%  0.0%    skip:33.0%
[libx264 @ 0x564504ee7f40] mb B  I16..4:  0.9%  1.4%  0.1%  B16..8: 25.0%  1.3%  0.2%  direct: 1.8%  skip:69.3%  L0:44.6% L1:53.4% BI: 2.0%
[libx264 @ 0x564504ee7f40] final ratefactor: 25.73
[libx264 @ 0x564504ee7f40] 8x8 transform intra:66.4% inter:91.8%
[libx264 @ 0x564504ee7f40] coded y,uvDC,uvAC intra: 30.5% 41.4% 7.3% inter: 6.3% 10.8% 0.3%
[libx264 @ 0x564504ee7f40] i16 v,h,dc,p: 31% 23%  7% 38%
[libx264 @ 0x564504ee7f40] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 34% 16% 23%  3%  5%  6%  4%  5%  3%
[libx264 @ 0x564504ee7f40] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 37% 17% 10%  4%  8%  9%  6%  6%  4%
[libx264 @ 0x564504ee7f40] i8c dc,h,v,p: 55% 16% 22%  6%
[libx264 @ 0x564504ee7f40] Weighted P-Frames: Y:2.2% UV:1.1%
[libx264 @ 0x564504ee7f40] ref P L0: 62.5% 12.6% 18.5%  6.3%  0.1%
[libx264 @ 0x564504ee7f40] ref B L0: 90.1%  8.2%  1.7%
[libx264 @ 0x564504ee7f40] ref B L1: 96.5%  3.5%
[libx264 @ 0x564504ee7f40] kb/s:10456.65
[aac @ 0x564504f67ec0] Qavg: 259.313

这里是对命令的解释:

  • -i tears_of_steel_720p.mov:指定输入视频文件。
  • -vf "scale=3840:2160":设置缩放滤镜,将视频放大至 4K 分辨率(3840x2160)。
  • -c:v libx264:使用 libx264 编解码器对视频进行编码。
  • -preset fast:指定编码速度与质量之间的平衡(fast 是一个好的平衡点)。
  • -b:v 10M:设置目标视频比特率为 10 Mbps 以保持质量。

若想了解更多关于 FFmpeg 命令的信息,你可以参考FFmpeg官方文档。

步骤 5 - 将处理后的视频下载到本地系统

视频处理完毕后,使用 scp 命令将其从 Droplet 下载到你的本地机器。将 <your_droplet_ip> 替换为你的 Droplet 的 IP 地址。

scp root@<your_droplet_ip>:~/tears_of_steel_4k.mov ~/Downloads/

此命令将 4K 放大的视频文件复制到你本地桌面的 Downloads 文件夹中。

小结

由 NVIDIA H100 GPU 驱动的服务器为视频处理提供了一个高性能的环境。通过 FFmpeg 实现的 GPU 加速缩放和编码,你可以大幅缩短处理时间,实现实时的视频调整和快速视频导出。这种配置非常适合处理高分辨率工作负载的视频工程师和开发人员。

最后,DigitalOcean GPU 云服务是专注 AI 模型训练的云 GPU 服务器租用平台,提供了包括 A5000、A6000、H100 等强大的 GPU 和 IPU 实例,以及透明的定价,可以比其他公共云节省高达70%的计算成本。目前,DigitalOcean GPU Droplet H100 与 H100x8 服务器正在限时优惠,如需了解详情,可联系DigitalOcean 中国区独家战略合作伙伴卓普云。(或加飞机号:Dd0CL)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/911867.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

31.7K+ Star!AgentGPT:一个在浏览器中运行的Agent

AgentGPT 简介 AgentGPT[1] 是一个可以让你在浏览器中组装、配置和部署自主AI代理的项目。你可以为你的自定义AI命名,并让它去实现任何你想象中目标。它将尝试通过思考要执行的任务、执行它们并从结果中学习来达成目标。 项目特点 主要特点 自主AI代理:用户可以自定义AI并赋…

革新汽车装配产线:MR30分布式IO模块引领智能制造新时代

在日新月异的汽车制造行业中&#xff0c;每一分每一秒的效率提升都意味着成本的降低与市场竞争力的增强。随着工业4.0时代的到来&#xff0c;智能化、自动化已成为汽车产线升级转型的关键词。在这场技术革命的浪潮中&#xff0c;MR30分布式IO模块以其高效、灵活、可靠的特点&am…

汽车免拆诊断案例 | 2017款凯迪拉克XT5车组合仪表上的指针均失灵

故障现象 一辆2017款凯迪拉克XT5车&#xff0c;搭载LTG 发动机&#xff0c;累计行驶里程约为17.2万km。车主反映&#xff0c;组合仪表上的发动机转速表、车速表、燃油表及发动机冷却液温度表的指针均不指示&#xff0c;但发动机起动及运转正常&#xff0c;且车辆行驶正常。 故…

LeetCode 热题100之二分

关于二分&#xff0c;之前也写过一篇&#xff0c;参考二分Acwing 1.搜索插入位置 思路分析&#xff1a;典型的 二分查找算法&#xff0c;用于在一个已排序的数组中查找目标值的位置。如果找到了目标值&#xff0c;返回其索引&#xff1b;如果没有找到&#xff0c;则返回目标值…

viewerjs实现以图片中心点进行缩放

最近有个需求&#xff0c;使用到了viewerjs对一个图片进行可缩放预览&#xff0c;但是存在一个问题&#xff0c;通过滚轮缩放图片时会导致图片移动到视窗外面。 翻了一下GitHub上的源码&#xff0c;viewerjs滚轮&#xff08;触摸板双指&#xff09;缩放功能是监听了wheel事件&a…

OpenAI大事记;GPT到ChatGPT参数量进化

目录 OpenAI大事记 GPT到ChatGPT参数量进化 OpenAI大事记 GPT到ChatGPT参数量进化 ChatGPT是从初代 GPT逐渐演变而来的。在进化的过程中,GPT系列模型的参数数量呈指数级增长,从初代GPT的1.17亿个参数,到GPT-2的15 亿个参数,再到 GPT-3的1750 亿个参数。模型越来越大,训练…

通过包控制->获取包重新获取之后,需求类型列表不对

龙勤思(2017年11月27日)&#xff1a; 这个类型列表&#xff0c;我在把需求包提交到svn&#xff0c;再新建一个eap&#xff0c;通过包控制->获取包重新获取之后&#xff0c;就变成默认的如下列表了。我从你的原始的eap导出参考数据&#xff0c;再导入到新建的eap&#xff0c…

HbuildderX运行到手机或模拟器的Android App基座识别不到设备 mac

寻找模拟器 背景&#xff1a; 运行的是h5&#xff0c;模拟器是网易MuMu。 首先检查一下是否配置dab环境&#xff0c;adb version 配置一下hbuilderX的adb&#xff1a; 将命令输出的路径配置到hbuilderx里面去&#xff0c;然后重启下HbuilderX。 开始安装基座…一直安装不…

C++builder中的人工智能(15):C++高斯误差线性单元(GELU)

在这篇文章中&#xff0c;我们将探索高斯误差线性单元&#xff08;GELU&#xff1a;Gaussian Error Linear Unit&#xff09;是什么&#xff0c;它是如何在人工神经网络&#xff08;ANN&#xff09;中工作的&#xff0c;以及GELU可以应用于哪些AI技术。通过学习C中的高斯误差线…

Android 下内联汇编,Android Studio 汇编开发

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 内联汇编 Android 内联汇编非常适用于 ARM 架构的性能优化和底层操作&#xff0c;通常用于加密、解密、特定指令优化等领域。 1. 基础语法 内联汇编在 C/C …

【go从零单排】泛型(Generics)、链表

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 在Go语言中&#xff0c;泛型&#xff08;Generics&#xff09;允许你编写可以处理…

vue项目删除无用的依赖

1.安装依赖检查工具 npm i depcheck2.查看无用的依赖 depcheck3.手动删除pageage.json中的无用的依赖&#xff08;如果有sass和sass-loader不要删&#xff0c;会引起项目报错&#xff09; 4.全部删除完成之后&#xff0c;删除package-lock.json文件&#xff0c;删除node_mod…

「Qt Widget中文示例指南」如何创建一个窗口标志?(一)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 窗口标志要么是类型…

移植 AWTK 到 纯血鸿蒙 (HarmonyOS NEXT) 系统 (9) - 编译现有的AWTK应用程序

AWTK 应用程序开发完成后&#xff0c;在配置文件中添加 harmonyos 的选项&#xff0c;通过create_project.py脚本即可生成 DevEco Studio的工程。 安装开发环境 DevEco Studio HarmonyOS 的开发工具。 Python 运行环境。 git 源码管理工具。 下载 awtk 和 awtk-harmonyos…

C++ 参数传递 笔记

目录 1、输入参数的传递方式-选择传值还是传引用&#xff1f; 处理用户信息 处理坐标 处理配置 处理ID 2、对于需要修改的参数,使用非const引用传递 有趣的例外&#xff1a;警惕表象的迷惑 需要警惕的陷阱 “糟糕”的update方法&#xff1a; “完美”的set_name与set…

【Eclipse系列】eclipse安装与常规配置(含插件)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、下载与安装 二、常规设置 1.1.设置工作空间(workspace) 1.2.设置字体和字体大小 ​编辑 1.3.设置编码 1.4.去除验证(validation) 1.5.去除单词验证(spelli…

内网对抗-信息收集篇SPN扫描DC定位角色区域定性服务探针安全防护凭据获取

知识点&#xff1a; 1、信息收集篇-网络架构-出网&角色&服务&成员 2、信息收集篇-安全防护-杀毒&防火墙&流量监控 3、信息收集篇-密码凭据-系统&工具&网站&网络域渗透的信息收集&#xff1a; 在攻防演练中&#xff0c;当完成边界突破后进入内…

C语言 | Leetcode C语言题解之第540题有序数组中的单一元素

题目&#xff1a; 题解&#xff1a; int singleNonDuplicate(int* nums, int numsSize) {int low 0, high numsSize - 1;while (low < high) {int mid (high - low) / 2 low;mid - mid & 1;if (nums[mid] nums[mid 1]) {low mid 2;} else {high mid;}}return …

【开发】关于Java中String与Integer的小小知识点(使用等号对比引用对象)

一个很简单的小知识点 我们都知道&#xff0c;如果使用对比包装类型或对象&#xff0c;那么比较的都是两者之间的地址&#xff08;指针或句柄&#xff09;&#xff0c;而非对象本身&#xff0c;那么且看下方的代码。 public class A {public static void main(String[] args)…

纯前端实现在线预览excel文件(插件: LuckyExcel、Luckysheet)

概述 在实际开发中&#xff0c;遇到需要在线预览各种文件的需求&#xff0c;最近遇到在线预览excel文件的需求&#xff0c;在此记录一下&#xff01;本文主要功能实现&#xff0c;用于插件 LuckyExcel &#xff0c;Luckysheet&#xff01;废话不多说&#xff0c;上代码&#xf…