视频技术基础知识

news/2024/3/29 6:38:38/文章来源:https://blog.csdn.net/qq_21033663/article/details/129001351

一、视频图像基础

  1. 像素:图像的基本单元,即一个带有颜色的小块
  2. 分辨率:图像的大小或尺寸,用像素个数来表示。原始图像分辨率越高,图像就越清晰
  3. 位深:存储每位像素需要的二进制位数;位深越大,能够表示的颜色值就越多,色彩越丰富真实
  4. 跨距(Stride):图像存储时内存中每行像素所占用的空间。需要正确的设置,否则会出现花屏
  5. 帧率:1秒中内图像的数量,单位FPS
  6. 码率:视频在1s内的数据量的大小。一般码率越高,视频清晰度越高,存储时占用内存空间就越大,传输时使用流量越多,但还需要结合压缩算法和压缩速度综合考虑

二、图像颜色空间

  1. 颜色空间分类
    RGB:指图像的每一个像素都是分别存储R、G、B三个值,且三个值依次排列存储。顺序不一定是R-B-G,RGB三个颜色有相关性,采集和渲染的时候是RBG
    YUV:图像将亮度信息 Y 与色彩信息 U、V 分离开来。Y 表示亮度,是图像的总体轮廓,称之为 Y 分量。U、V 表示色度,主要描绘图像的色彩等信息,分别称为 U 分量和 V 分量
  2. YUV分类
    YUV 4:4:4,每一个 Y 对应一组 UV
    YUV 4:2:2,每两个 Y 共用一组 UV
    YUV 4:2:0,每四个 Y 共用一组 UV
  3. YUV存储方式
    Planar:先连续存储所有像素点的Y,然后接着存储所有像素点的U/V,之后再存储所有像素点的V/U
    Packed:先存储完所有像素的Y,然后U、V连续的交错存储
    Tips:U和V在一张图片中顺序固定,不同图片U和V谁在前不一定
  4. YUV类型和存储类型关系
    在这里插入图片描述
    I444:YUV顺序
    YV24:YVU顺序
    NV16:先存储完 Y,之后 U、V 连续交错存储
    NV61:先存储完 Y,之后 V、U 连续交错存储
    YU16(I422):YUV顺序
    YV16:YVU顺序
    NV12:先存储完 Y,之后 U、V 连续交错存储
    NV21:先存储完 Y,之后 V、U 连续交错存储
    YU12(I420):YUV顺序
    YV12:YVU顺序
  5. Color Range
    Full Range:R、G、B取值范围都是0~255
    Limited Range:R、G、B取值范围是16~235
  6. RBG与YUV互转规范
    BT709:高清的标准
    BT601:标清的标准
  7. RBG与YUV转换公式
    在这里插入图片描述

三、缩放算法

  1. 图像的缩放算法:插值算法、AI 超分算法
  2. 插值算法:使用周围已有的像素值通过一定的加权运算得到“插值像素值”,包括:最近邻插值算法(Nearest)、双线性插值算法(Bilinear)、双三次插值算法(BiCubic)
  3. 缩放的基本原理:图像的缩放就是将原图像的已有像素经过加权运算得到目标图像的目标像素。主要包括两个部分:一个是像素位置映射过程;一个是映射位置像素的插值过程。
  4. 像素位置映射过程:假设原图像的分辨率是w0xh0,我们需要缩放到w1xh1。那我们只需要将目标图像中的像素位置(x,y)映射到原图像的(xw0/w1,yh0/h1),再插值得到这个像素值就可以了,这个插值得到的像素值就是目标图像像素点(x,y)的像素值
  5. 映射像素的插值过程:
    在这里插入图片描述

四、编码原理

  1. 宏块:对于每一帧图像,划分成一个个块来进行编码。例如:16x16(H264、VP8),32x32(H265、VP9),64x64(H265、VP9、AV1),128x128(AV1)
  2. 图像的数据冗余
    空间冗余:相邻的块很多时候都有比较明显的相似性
    时间冗余:前后两帧图像的变化是比较小的,相似性很高
    视觉冗余:人的眼睛对于图像中高频信息的敏感度是小于低频信息的
    信息熵冗余:文件压缩
  3. 编码原理
    1)帧内预测:为了提高熵编码的压缩率,先将当前编码块的相邻块像素经过帧内预测算法得到帧内预测块,再用当前编码块减去帧内预测块得到残差块,从而去掉空间冗余
    2)帧间预测:类似于帧内预测,在已经编码完成的帧中,先通过运动搜索得到帧间预测块,再与编码块相减得到残差块,从而去除时间冗余
      a)参考帧:预测块所在的已经编码的图像
      b)运动矢量:预测块在参考帧中的坐标值(x0, y0)与编码块在编码帧中的坐标值(x1, y1)的差值(x0 - x1, y0 - y1)
      c)运动搜索:在参考帧中去寻找预测块的过程
    3)DCT 变换(离散余弦变换)和量化:将残差块变换到频域,分离高频和低频信息。由于高频信息数量多但大小相对较小,又人眼对高频信息相对不敏感,我们利用这个特点,使用 QStep 对 DCT 系数进行量化,将大部分高频信息量化为 0,达到去除视觉冗余的目的
      a)量化步长QStep:DCT变换块的系数都同时除以一个值,QStep越大得到量化后的系数就会越小,一般用量化参数QP(和QStep有对应映射表)
      b)编码时:QStep 乘以量化后的系数得到变换系数,有损编码
      c)QP 值越大,损失就越大,从而画面的清晰度就会越低,0的概率越大,压缩率越高
    4)熵编码(以行程编码为例):视频编码中真正实现“压缩”的步骤,主要去除信息熵冗余。在出现连续多个 0 像素的时候压缩率会更高
  4. 编码标准系列
    H264->H265
    VP8->VP9->AV1
    在这里插入图片描述
  5. 技术选型
    清晰度:AV1>H265>H264
    专利费:AV1免费、H264收费、H265费用极高
    压缩率:AV1>H265>H264
    耗时:H264<H265<AV1
    硬件支持:H264>H265>AV1
  6. 使用场景
    屏幕编码:使用AV1, AV1原生标准就支持屏幕编码的优化
    浏览器:VP9或AV1,浏览器原生不支持H265
    机器性能:性能差机器使用H264、VP8,中高等机器可以考虑H265
    性价比较高:H264

五、H264编码

  1. 帧类型
    在这里插入图片描述
    IDR帧:立即刷新帧,特殊的I帧。IDR 帧之后的帧不能再参考 IDR 帧之前的帧,截断了编码错误的传递。大多数情况下还是直接使用 IDR 帧,不适用普通的I帧
    I的压缩率是7(跟JPG差不多),P是20,B可以达到50
  2. GOP(图像组):包含一个 IDR 帧到下一个 IDR 帧的前一帧中的所有帧。关键帧间隔,IDR帧之间的间隔,越大压缩率越高,但丢关键帧时可能导致花屏和卡顿,一般 RTC 和直播场景可以稍微大一些,而点播场景一般小一些
  3. Slice:图像内的层次结构就是一帧图像可以划分成一个或多个 Slice,而一个 Slice 包含多个宏块,且一个宏块又可以划分成多个不同尺寸的子块
    注:帧都是以 Slice 的方式在码流中呈现
  4. H264 码流格式
    1) Annexb 格式:使用起始码“00 00 00 01”或“00 00 01”来表示一个编码数据的开始,图像编码中和起始码撞车的数据会被替换成默认的字节串,解码时需要逆转换。套娃?
    在这里插入图片描述
    2)MP4 格式:在图像编码数据的开始使用了 4 个字节作为长度标识
    在这里插入图片描述
  5. H264参数集:
    1)SPS(基础图像信息):主要包含图像的宽、高、YUV 格式和位深等基本信息
    2)PPS(基础编码参数):主要包含熵编码类型、基础 QP 和最大参考帧数量等基本编码信息
  6. H264码流:主要是由 SPS、PPS、I Slice、P Slice和B Slice 组成,且每一个都封装在NALU(网络抽象层单元)中
    在这里插入图片描述
    7、常见问题
    1)多Slice时如何判断哪几个Slice是同一帧的?
    在Slice Header开始的地方有一个first_mb_in_slice的字段,表示当前Slice的第一个宏块MB在当前编码图像中的序号,0表示新帧中的第一个slice
    2)如何从 SPS 中获取图像的宽高(分辨率)?
    在SPS中有几个字段用来表示分辨率的大小。我们可以解码出这几个字段并通过一定的规则计算得到分辨率的大小
    3)如何计算得到QP值?
    根据PPS初始基础QP、Slice QP偏移量、宏块QP偏移量

六、帧内预测(空间冗余)

  1. 帧内预测:通过利用已经编码的相邻像素的值来预测待编码的像素值,最后达到减少空间冗余的目的
  2. 在H264标准里面,块分为宏块和子块
    1)宏块大小是16x16,其中亮度块为16x16,色度块为8x8
    2)帧内预测中亮度块和色度块是分开独立进行预测的
    3)16x16 的亮度块可以继续划分成16个4x4的子块
  3. 4x4亮度块的帧内预测模式:8种方向模式和一种DC模式,方向模式指的是预测是有方向角度的
    1)Vertical 模式:指当前编码亮度块的每一列的像素值,都是复制上边已经编码块的最下面那一行的对应位置的像素值,同一列像素值都一样
    在这里插入图片描述
    在这里插入图片描述
    2)Horizontal 模式:指当前编码亮度块的每一行的像素值,都是复制左边已经编码块的最右边那一列的对应位置的像素值,同一行像素值都一样
    在这里插入图片描述
    在这里插入图片描述
    3)DC 模式:指当前编码亮度块的每一个像素值,是上边已经编码块的最下面那一行和左边已编码块右边最后一列的所有像素值的平均值,块中每一个像素值都是一样的
    在这里插入图片描述
    在这里插入图片描述
    4)Diagonal Down-Left 模式:上边块和右上块的像素通过插值得到。如果上边块和右上块不存在则该模式无效
    在这里插入图片描述
    在这里插入图片描述
    5)Diagonal Down-Right 模式:需要通过上边块、左边块和左上角对角的像素通过插值得到。如果这三个有一个不存在则该模式无效
    在这里插入图片描述
    在这里插入图片描述
    6)Vertical-Right 模式:需要通过上边块、左边块以及左上角对角的像素插值得到的。必须要这三个都有效才能使用,否则该模式无效
    在这里插入图片描述
    在这里插入图片描述
    7)Horizontal-Down 模式:需要通过上边块、左边块以及左上角对角的像素插值得到。必须要这三个都有效才能使用,否则该模式无效
    在这里插入图片描述
    在这里插入图片描述
    8)Vertical-Left 模式:通过上边块和右上块最下面一行的像素通过插值得到。如果这两种块不存在则该模式不可用
    在这里插入图片描述
    在这里插入图片描述
    9)Horizontal-Up 模式:通过左边块的像素通过插值得到的。如果左边块不存在,则该模式不可用
    在这里插入图片描述
    在这里插入图片描述
  4. 16x16亮度块的帧内预测模式
    1)Vertical模式:同4x4
    2)Horizontal模式:同4x4
    3)DC 模式:同4x4
    4)Plane模式:Plane预测块的每一个像素值,都是将上边已编码块的最下面那一行,和左边已编码块右边最后一列的像素值经过下面公式计算得到的
    在这里插入图片描述
  5. 8x8色度块的帧内预测模式
    1)Vertical模式:同16x16
    2)Horizontal模式:同16x16
    3)DC 模式:同16x16
    4)Plane模式:同16x16
  6. 预测模式的选择方法:主要有计算残差块绝对值之和、将残差块做 Hadamard 变换之后再求和、率失真优化等几种方案来得到 cost,然后我们取 cost 最小的模式作为帧内预测模式
    率失真优化的思想:我们一般会在失真和码流大小之间平衡,通过调整QP值,尽量找到在一定码率下,失真最小的模式作为最优的预测模式

七、帧间预测(时间冗余)

  1. 帧间预测相比于帧内预测:参考的已编码块在其他图像中;有单参考和多参考,即参考一个图像或者多个图像;前向参考帧 P帧,双向参考帧 B帧(B帧先分别得到两个预测块,加权平均得到最终的预测块)
  2. 帧间预测块大小:亮度 16x16, 16x8, 8x16, 8x8(又可分为8x4, 4x8, 4x4),YUV 4:2:0 中色度块宽高是亮度块的一半(1/4)
  3. 在已经编码的帧里面找到一个块来作为预测块,这个已经编码的帧称之为参考帧
    注:通常P 帧中的所有块都参考同一个参考帧,并且一般会选择当前编码帧的前一帧来作为参考帧
  4. 运动矢量:表示编码帧中编码块和参考帧中的预测块之间的位置的差值。把运动矢量编码到码流当中
  5. 运动搜索:在参考帧中找到与当前编码块差值最小(即残差块的像素绝对值之和SAD 最小)的预测块
    1)全搜索算法:所有像素块全部遍历一遍,一般不用
    2)钻石搜索算法:又称为菱形搜索算法,以一个菱形的模式去寻找最优预测块,计算中心点和4个角的SAD,如果中心点SAD最小则返回,否则将中心点挪到SAD最小的角对应的点重复前面的过程。如果需要编码速度快,一般选择钻石搜索
    3)六边形搜索算法:以一个六边形的模式去寻找最优预测块,计算中心点和6个角的SAD,如果中心点SAD最小则取中心点、该中心点菱形的4个顶点和正方形4个顶点中SAD最小的点,否则将中心点挪到SAD最小的角对应的点重复前面的过程。要求编码质量高,同时对速度要求不高的时候,可以选择六边形搜索
    注:
    1)钻石搜索算法和六边形搜索算法得到的预测块不一定是全局最优预测块
    2)搜索算法中每一个搜索的点都是搜索块的左上角像素点,以最佳匹配点为左上角像素的块就是预测块,并且预测块左上角像素在参考帧中的坐标(x1, y1)与编码块在当前编码帧中的坐标(x0, y0)的差值(x1 - x0, y1 - y0)就是运动矢量
    3)我们一般会通过相邻已经编码块的运动矢量来预测当前块的运动矢量。这个预测的运动矢量也经常用做搜索的起点
  6. 亚像素插值:用插值的方式将半像素和 1/4 像素算出来,也当作一个像素。我们先通过整像素插值得到半像素,然后再通过半像素和整像素插值得到 1/4 像素。插值得到的图像跟原始的图像的对应像素点的像素值并不是完全一样的
  7. 亚像素运动搜索:计算整像素运动矢量->半像素和1/4像素插值->以整像素最佳匹配点菱形搜索半像素SAD->以半像素最佳匹配点菱形搜索1/4像素SAD->计算运动矢量
    在这里插入图片描述
  8. 用周围相邻块的运动矢量预测一个预测运动矢量,称为 MVP,将当前运动矢量与 MVP 的残差称之为 MVD,MVD编码到码流中,MVP+MVD 就是运动矢量了
  9. SKIP模式:运动矢量就是 MVP,也就是说 MVD 为 (0,0),同时残差块经过变换量化后系数也都是等于 0。缩效率特别高,图像中的静止部分或者是图像中的背景部分大多数时候都是 SKIP 模式
  10. 帧间模式的选择:其实就是参考帧的选择、运动矢量的确定,以及块大小(也就是块划分的方式)的选择,如果 SKIP 单独拿出来算的话就再加上一个判断是不是 SKIP 模式

八、变换量化(视觉冗余)

  1. 视频编码过程
    在这里插入图片描述
  2. 变换:空域->频域
    1)DCT变换:将图像从空域转换到频域,并将图像的高频和低频信息分离开来。虽然高频信息数据多,但是幅值比较小。这样高频信息在量化的过程中能够比较容易被减少。这样可以比较有效地减少图像的视觉冗余,从而达到压缩的目的。
    注: DCT 变换本身是无损的,同时也是可逆的;通常情况下 DCT 变换是在 4x4 的子块上进行的
    2)Hadamard变换:Hadamard变换可以代替DCT变换将残差块快速转换到频域,以便用来估计一下当前块编码之后的大小。在H264的16x16帧内亮度块和8x8色度块中会被用到,在率失真优化做模式选择的时候使用的更多。
  3. 量化:其实就是一个除法操作,通过除法操作就可以将幅值变小,而高频信息幅值比较小,就比较容易被量化成 0,这样就能够达到压缩的目的。
  4. H264为了减少这种浮点型运算漂移带来的误差:将 DCT 变换改成了整数变换,DCT 变换中的浮点运算和量化过程合并,这样就只有一次浮点运算过程

九、其它

  1. 码控的原理:码控主要是为每一帧图像确定QP值的过程。如果在图像画面确定的情况下,并且QP值确定了的话,那当前图像编码后的大小就大致确定了,从而编码后的码率大小也基本确定了。常用算法有VBR动态码率、CQP恒定QP、CRF恒定码率因子、CBR恒定码率
  2. 卡顿问题:人眼在帧率达到10fps并且均匀播放时就不太能看出来卡顿了,如果两帧之间的播放时间间隔超过了200ms,人眼就可以明显看出卡顿了
    1)帧率不够:提高帧率
    2)机器性能不够,导致前处理或者编码耗时太长:使用GPU做前处理,软件编码设置为快速档
    3)编码器输出码率超过实际网络带宽:对发送码率做严格的限制,防止它超过预估带宽
    4)复杂帧编码后过大或者I帧比较大:可以在编码打包之后、发送之前,加一个平滑发送的模块来平滑地发送视频包(削峰填谷)
  3. 花屏问题:
    1)帧不完整:在解码一帧数据之前一定要保证帧是完整的
    2)参考帧不完整
    3)渲染的时候YUV格式弄错了,表现为图像的大体轮廓是对的,但是颜色是有问题的
    4)解码后渲染前一定要处理好YUV的Stride问题
  4. 音画同步:指在音视频数据播放的时候,播放的画面和声音是需要同步的,是能对得上的
    1)PTS表示的是视频帧的显示时间,DTS表示的是视频帧的解码时间,对于B帧PTS和DTS可能不一样
    2)时间基:时间的单位,1/x 秒
    3)音视频同步的类型:
      a)视频同步到音频:指音频按照自己的节奏播放,不需要调节。是最常用的音视频同步方式
      b)音频同步到视频:指视频按照自己的节奏播放,不需要调节。音频速度变化会导致音调改变,需要做到变速不变调,人耳敏感度高,这种方式是不常用
      c)音频和视频都做调整同步:调节视频和调节音频相互交替进行

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

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

相关文章

华为OD机试 C++ 实现 - 第 N 个排列

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

模电学习7. 三极管特性曲线与静态工作点

模电学习7. 三极管特性曲线与静态工作点一、三极管的伏安特性曲线1. 三极管的伏安特性曲线2. 三极管的静态工作点二、合适的静态工作点选择1. 合适静态工作点条件2. 静态工作点的确定三、使用立创EDA仿真查看静态工作点1. 搭建如下图所示测试电路2. 点击菜单仿真、仿真设置3. 运…

springboot整合springdata jpa全能书

一&#xff1a;spring data jpa介绍 spring data:其实spring data就是spring提供了一个操作数据的框架。而spirng data jpa只是spring data框架下的一个基于jpa标准操作数据的模块。 spring data jpa&#xff1a;基于jpa的标准对数据进行操作。简化操作持久层的代码。只需要编…

【离线数仓-4-数据仓库设计】

离线数仓-4-数据仓库设计离线数仓-4-数据仓库设计1.数据仓库分层规划2.数据仓库构建流程1.数据调研1.业务调研2.需求分析3.总结2.明确数据域3.构建业务总线矩阵&维度模型设计4.明确统计指标1.指标体系相关概念1.原子指标2.派生指标3.衍生指标2.指标体系对于数仓建模的意义5…

儿童全脑九大能力,3-6岁的家长都应该知道

什么是全脑&#xff1f; 人的大脑分左右两个半球&#xff0c;形态虽然相似&#xff0c;功能却各有不同。其中&#xff0c;左脑负责文字、数学、计算、分析、逻辑、顺序、事实和记忆&#xff0c;掌管右侧肢体的感觉和运动&#xff1b;右脑则负责颜色、音乐、想象、韵律、感觉、…

其它 Composition API

1.shallowReactive 与 shallowRef shallowReactive&#xff1a;只处理对象最外层属性的响应式&#xff08;浅响应式&#xff09;。 shallowRef&#xff1a;只处理基本数据类型的响应式, 不进行对象的响应式处理。 什么时候使用? 如果有一个对象数据&#xff0c;结构比较深, …

vue-print-nb使用

下载 pnpm add vue-print-nb --save 全局注册&#xff0c;使用插件的注册方式 或 局部注册自定义指令 import print from vue-print-nb directives: {print } 绑定到点击按钮上 <button v-print"content">Print!</button> 设置配置项-常用 id和popTi…

总结:NodeJS

一、介绍Nodejs就像是Java中的JVM&#xff0c;是js的运行环境。nodejs不是一个js框架&#xff0c;千万不要认为是类似jquery的框架。nodejs的作用和jvm的一样一样的&#xff0c;也是js的运行环境&#xff0c;不管你是什么操作系统&#xff0c;只要安装对应版本的nodejs&#xf…

华为OD机试真题 用 C++ 实现 - 字符串加密 | 多看题,提高通过率

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

angular

1. angular获取不到DOM结点 angular中的ngOnInit钩子函数获取不到DOM节点&#xff1b; 这个钩子函数中&#xff0c;表示组件和指令初始化完成&#xff0c;并不是真正的DOM加载完成&#xff1b; 所以这时候需要利用另外一个钩子函数ngAfterViewInit()&#xff0c;是在视图加载完…

界面组件Kendo UI for Angular——让网格数据信息显示更全面

Kendo UI致力于新的开发&#xff0c;来满足不断变化的需求&#xff0c;通过React框架的Kendo UI JavaScript封装来支持React Javascript框架。Kendo UI for Angular是专用于Angular开发的专业级Angular组件&#xff0c;telerik致力于提供纯粹的高性能Angular UI组件&#xff0c…

Leetcode之消失的数字轮转数组

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录一、消失的数字一、消失的数字 二、旋转数组 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、消失的数字 这题找出消失的一个数字&#…

(二十三)、实现评论功能(3)【uniapp+uinicloud多用户社区博客实战项目(完整开发文档-从零到完整项目)】

1&#xff0c;删除评论的样式和实现逻辑 1.1 添加删除评论的样式 在comment-item组件中&#xff1a; <view class"username">{{giveName(item)}}<text class"iconfont icon-a-43-guanbi" click.stop"delComment"></text><…

【总结】python3启动web服务引发的一系列问题

背景 在某行的实施项目&#xff0c;需要使用python3环境运行某些py脚本。 由于行内交付的机器已自带python3 &#xff0c;没有采取自行安装python3&#xff0c;但是运行python脚本时报没有tornado module。 错误信息 ModuleNotFoundError&#xff1a;No module named ‘torn…

计算机网络第3章(数据链路层)学习笔记

❤ 作者主页&#xff1a;欢迎来到我的技术博客&#x1f60e; ❀ 个人介绍&#xff1a;大家好&#xff0c;本人热衷于Java后端开发&#xff0c;欢迎来交流学习哦&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 如果文章对您有帮助&#xff0c;记得关注、点赞、收藏、…

JVM面试总结

文章目录栈帧中存放的信息&#xff1a;对象的创建过程对象的内存布局&#xff1f;对象的访问定位方式&#xff1f;如何判断对象已死&#xff1f;可以作为GC Root的点&#xff1a;谈一下引用对象再被回收时如何逃脱&#xff1f;回收方法区如何判断常量是否废弃&#xff1f;垃圾回…

Redis的安装部署和配置文件的修改

1、准备安装环境 由于 Redis 是基于 C 语言编写的&#xff0c;因此首先需要安装 Redis 所需要的依赖&#xff1a; yum install -y gcc tcl gcc-c make 2、上传安装文件 将下载好的 redis-6.2.7.tar.gz 安装包上传到虚拟机的任意目录&#xff08;一般推荐上传到 /usr/local/s…

Mysql 索引(三)—— 不同索引的创建方式(主键索引、普通索引、唯一键索引)

了解了主键索引的底层原理&#xff0c;主键索引其实就是根据主键字段建立相关的数据结构&#xff08;B树&#xff09;&#xff0c;此后在使用主键字段作为条件查询时&#xff0c;会直接根据主键查找B树的叶子结点。除了主键索引外&#xff0c;普通索引和唯一键索引也是如此&…

stm32f103封装 入门教学(一)LED程序CubeMX

本文代码使用 HAL 库。 文章目录前言一、LED 原理图二、CubeMX创建工程三、LED 相关函数1. 输出电平函数&#xff1a;2. 延时函数&#xff1a;3. 翻转电平函数&#xff1a;四、详细代码实验现象 &#xff1a;总结代码 源码&#xff1a;前言 从这篇文章开始&#xff0c;我们讲解…

了解Axios及其运用方式

Axios简介 axios框架全称&#xff08;ajax – I/O – system&#xff09;&#xff1a; 基于promise用于浏览器和node.js的http客户端&#xff0c;因此可以使用Promise API 一、axios是干啥的 说到axios我们就不得不说下Ajax。在旧浏览器页面在向服务器请求数据时&#xff0c;…