【音视频】编解码相关概念总结
NALU RTP PS流
三者总体关系
NALU在RTP中的应用:视频流的RTP传输通常将NALU作为基本的单元进行传输。每个RTP包携带一个或多个NALU,这些NALU包含了视频编码数据。RTP协议通过其头部信息(如时间戳、序列号等)帮助接收端重新排列和解码这些NALU
PS流和NALU的转化:PS流本质上是一个容器,它可以封装多个NALU。在将PS流通过网络传输时,通常会将其分解成一个个NALU,然后通过RTP传输。这意味着PS流在网络传输中的表现通常是通过RTP承载NALU来实现的(注意,一般在GB28181平台上,都是先将Nalu封装成PS流后,然后再通过RTP包进行发送)
RTP封装PS流:尽管PS流通常是MPEG-2的容器格式,但它也可以用来封装视频数据和音频数据。当使用RTP进行流传输时,PS流通常会被切分成RTP包进行发送。RTP负责将数据流化并以网络友好的方式进行传输,而PS流则可能作为RTP数据的内容进行封装
NALU
可以吧Nalu想象成视频编码数据中信封,编码器就是将编码后的视频数据封装成一个一个的Nalu,然后通过网络进行传输
NALU是视频编码(特别是H.264/H.265)中网络抽象层的单位。NALU是视频编码后生成的数据块,用于将编码数据从编码器传输到网络层(如RTP、RTSP等)。每个NALU包含一个完整的编码数据单元,可以独立解码(例如一个图像帧的部分)
主要功能:NALU中包含了视频编码的具体信息,比如图像帧的宏块、序列参数集、片段参数集等。NALU通常是H.264或H.265编码数据的基本传输单位
网络抽象层(NAL)作用分析
视频编码标准(也就类似H264 265)一般分为两个主要层次
- 视频编码层(VCL):VCL主要就是负责视频内容的压缩编码,例如预测、变换、量化、熵编码等核心编码算法都发生在这个层面。 VCL 产生的输出就是 编码后的视频数据,也就是我们常说的 视频码流
- 网络抽象层(NAL):负责 将 VCL 层产生的编码数据适配到各种不同的网络传输环境。 不同的网络传输协议(如 RTP, RTSP, MPEG-2 TS, HTTP 等)对数据的格式和传输方式有不同的要求。 NAL 的作用就是将 VCL 产生的原始码流 封装成符合特定网络协议要求的格式,以便在各种网络中可靠地传输
Nalu的结构
简单来说NALU就是由两个部分组成,分别是NALU头部信息以及NALU负载。头部信息主要包含了NALU类型等新,负载就是实际的编码数据
NALU主要功能以及编码数据类型
NALU 的核心功能就是 封装和组织编码后的视频数据,使其可以作为网络传输的基本单元
- 视频编码层NALU,该类NALU包含实际的视频编码内容,是构成视频流的主体部分
- 编码片段:常见的NALU类型,其中包含了图像帧的编码数。在真实的传输中,一个图像帧可能会被分割成多个silece nalu进行传输
- IDR图像:特殊的图像帧, 解码器可以独立解码IDR图像,不需要考虑之前的帧。IDR图像一般都是用于视频流的随机访问和错误恢复
- 非视频编码层的NALU,该NALU包含了解码器正常工作所需要的辅助信息,但是没有实际的视频帧数据
-
序列参数集 (SPS - Sequence Parameter Set): 包含了 序列级别 的解码参数,例如 视频的 profile、level、分辨率、帧率 等信息。 SPS 对于解码整个视频序列至关重要,通常在视频流的开始处发送一次,或者在视频参数发生变化时更新。
-
图像参数集 (PPS - Picture Parameter Set): 包含了 图像级别 的解码参数,例如 熵编码模式、slice 分割方式 等信息。 PPS 针对每个图像帧或一组图像帧有效,可以频繁更新。
-
补充增强信息 (SEI - Supplemental Enhancement Information): 包含了 与解码过程本身无关的辅助信息,例如 定时信息、显示信息、用户自定义数据 等。 SEI 信息对于解码器不是必需的,但可以用于增强视频播放体验或实现特定功能。
-
RTP
RTP类似于一条高速公路,专门用于快速、准时运送实时性极高的数据
RTP是一种用于实时数据传输的协议,尤其适用于音视频流的传输。它设计用于在网络中传输实时数据(如音频、视频),提供时间戳、序列号和控制信息,帮助接收方重新排序丢失的数据包
主要功能
在视频流传输中,RTP用于将视频数据(如NALU)封装并传输到接收方。RTP保证了数据的实时性和顺序,可以处理丢包、延迟等问题。每个RTP包通常包含一个或多个NALU,RTP包头提供时间戳和序列号等信息,帮助接收方恢复视频数据的时序
RTP协议特点
RTP 的设计目标是 实时性优先,而不是完全可靠性。 这意味着 RTP 尽力保证数据的及时送达和播放的流畅性,即使在网络条件不佳的情况下,可能会牺牲一些数据的完整性(例如,允许少量数据包丢失)
对于实时音视频应用(例如视频会议、在线直播),延迟 (Latency) 是一个非常关键的指标。 如果数据传输延迟过高,会导致音视频播放卡顿、画面和声音不同步等问题,严重影响用户体验。 RTP 的设计就充分考虑了实时性的需求,力求 最小化延迟
RTP的关键功能
-
时间戳 (Timestamping): RTP 包头中包含 时间戳字段。 时间戳记录了 RTP 数据包中第一个字节的采样时刻。 这个时间戳对于接收端 恢复音视频数据的时序 至关重要,主要用于:
-
同步播放: 接收端可以使用时间戳来 同步音频和视频流,确保音视频同步播放。
-
抖动处理: 网络传输中,数据包到达接收端的时间间隔可能会不均匀,产生抖动。 接收端可以使用时间戳来 平滑抖动,保证播放的流畅性。
-
-
序列号 (Sequence Numbering): RTP 包头中包含 序列号字段。 序列号用于 标识 RTP 数据包的发送顺序。 接收端可以使用序列号来:
-
数据包重排序: 在 IP 网络中,数据包可能不按发送顺序到达接收端。 序列号可以帮助接收端 将乱序的数据包重新排序,恢复原始的数据顺序。
-
检测数据包丢失: 通过检查序列号的连续性,接收端可以 检测到数据包的丢失,并采取相应的措施(例如,请求重传,或者在实时性要求较高的情况下,直接忽略丢失的数据包)。
-
-
控制信息 (Control Information) - RTCP: RTP 协议通常与 RTCP(RTP 控制协议 - RTP Control Protocol) 一起使用。 RTCP 协议与 RTP 协议 并行工作,但不传输实际的音视频数据,而是 传输控制信息,用于:
-
服务质量 (QoS) 反馈: RTCP 允许接收端向发送端 反馈网络状况和接收质量,例如 丢包率、延迟、抖动 等信息。 发送端可以根据 RTCP 反馈信息 动态调整编码参数或传输策略,以适应网络变化,优化服务质量。
-
会话管理: RTCP 可以用于 会话参与者的身份标识和管理,例如报告参与者信息、进行会话控制等。
-
RTP在视频流中的作用分析
NALU 封装: RTP 通常用于 封装视频编码后的 NALU (网络抽象层单元)。 每个 RTP 包的 负载 (Payload) 部分通常包含一个或多个 NALU。 这样,NALU 就被封装在 RTP 包中,可以通过网络进行传输
实时性和顺序保证 (尽力而为): RTP 协议 尽力保证数据的实时性和顺序,但它 不是一个完全可靠的协议。 RTP 协议本身 不提供重传机制 来保证数据包的可靠送达。 RTP 的重点在于 及时传输数据,即使在网络拥塞或不稳定的情况下,也尽量保证视频流的 连续性和流畅性,而不是追求 100% 的数据可靠性。 在网络条件较差时,可能会出现 丢包 或 延迟 等问题,但 RTP 的时间戳和序列号机制可以帮助接收端 最大限度地恢复视频数据的时序和完整性
RTP包头信息, RTP 包头中包含的关键信息(如 时间戳 和 序列号)对于接收端 恢复视频数据的时序 至关重要。 接收端可以利用这些信息进行同步播放、抖动缓冲等
PS流
PS流(Program Stream)是MPEG-2视频标准的一部分,通常用于封装和传输视频、音频、字幕等多媒体数据。它是一种容器格式,用于将多个媒体流(如视频流和音频流)组合成一个程序(program),以便于存储和传输。主要目的是将 视频、音频、字幕 等多种不同的媒体流 “打包” 成一个单一的 “节目” (Program),以便于 存储和传输。
主要功能
多媒体流复用,其可以就爱那个多个独立的媒体流(例如视频流、音频流、字符流以及其他辅助数据)组合成一个单一的、连续的数据流。该过程就类似于将不同的解码片段组合成一个完整节目
PS流在网络传输中会转换为RTP流(重点)
虽然 PS 流非常适合文件存储和物理介质传输,但它 不太适合直接用于网络传输,特别是 互联网等 IP 网络环境 中的 实时流媒体传输
-
面向文件,非面向数据包: PS 流是一种 连续的字节流格式,它没有被设计成易于分割成 网络数据包 的结构。 将其直接通过 IP 网络传输,需要进行额外的分包和重组,效率较低。
-
缺乏实时传输特性: PS 流 本身不具备 RTP 协议那样的时间戳、序列号和控制信息等实时传输特性。 在网络丢包或抖动的情况下,PS 流的抗丢包能力和时序恢复能力较弱,难以保证实时播放的流畅性。
PS流封装RTP包(重点)
在 网络流媒体应用 中,为了更好地适应 IP 网络的特点,并实现 低延迟、高效率、抗丢包 的实时传输,PS 流通常会被转换为 RTP 流
-
解封装 PS 流: 首先,将 PS 流解封装,提取出其中的 视频流 (例如 MPEG-2 视频码流) 和 音频流 等基本媒体流。
-
NALU 封装 (对于 H.264/H.265 视频): 如果视频流是 H.264 或 H.265 编码的,则将其 进一步解析为 NALU (网络抽象层单元)。 NALU 是更小的、更适合网络传输的编码数据单元。
-
RTP 封装: 将 NALU (或原始视频/音频数据) 封装到 RTP 包 中。 每个 RTP 包头会添加 时间戳、序列号 等 RTP 特有的信息。
-
通过 UDP/IP 网络传输: 将 RTP 包通过 UDP (用户数据报协议) 或 IP (互联网协议) 网络进行传输。 UDP 协议具有较低的延迟和较高的效率,更适合实时流媒体应用
I帧、P帧、B帧
基本概念
- I帧(关键帧):独立的帧,可以单独解码,无需参考其他帧。
- P帧(预测帧):依赖之前的I帧或P帧,通过预测编码减少数据量。
- B帧(双向预测帧):通过前后帧的双向预测来压缩数据,通常比P帧更加高效
I帧
I帧是视频编码中的关键帧,它是完全自包含的帧,可以独立解码,无需依赖其他帧。I帧是视频编码中的基本单元,通常作为一个完整的图像进行存储(参考电影24帧中关键帧理解)
主要特点总结
- I帧通过对每个像素点进行编码来表示图像,压缩方式较为简单,通常使用离散余弦变换(DCT)
- 因为I帧不依赖其他帧,它能够恢复图像的完整信息,所以解码时不需要任何额外的数据
- I帧通常占用较大的文件大小,因为它包含了完整的图像信息,而不像P帧和B帧那样依赖其他帧的数据来减少冗余
主要用途
- I帧通常用于视频流的切换点、视频文件的开始或其他需要快速恢复的地方。
- 在视频播放过程中,I帧可以作为参考帧来帮助解码后续的P帧和B帧。
P帧
P帧是通过参考之前的I帧或P帧进行编码的,它包含了与前面帧的差异信息。P帧只存储与前一帧的变化部分(例如运动向量),因此能大大减少数据量
主要特点
- P帧依赖于前面的I帧或P帧。它通过运动补偿和差异编码的方法,只记录与参考帧的不同之处。
- P帧的编码方式相较于I帧要高效一些,但比B帧要少些。它通常较小,并且需要通过前面的帧来解码。
- 通过对比当前帧和参考帧的不同,P帧减少了冗余信息,压缩效率较高。
主要用途
- P帧用于减少视频中的冗余信息,通过参考前面的帧来压缩数据。视频流中I帧和P帧的交替使用,使得视频编码更加高效。
- 在视频流播放过程中,P帧通常依赖于前面的I帧或P帧来恢复图像内容。
B帧
B帧是通过参考前后两帧(I帧或P帧)来预测当前帧的信息。B帧通过双向运动估计来实现比P帧更高效的压缩,能够进一步减少数据量
主要特点
- B帧与P帧的不同之处在于,它不仅依赖于前面一帧的数据,还可以参考后续的帧。它使用双向预测来求解当前帧的内容,因此能够达到更高的压缩率。
- 因为B帧需要同时依赖前后的帧,所以解码时的复杂度会更高,且B帧不能单独解码。
- B帧的数据量最小,因为它依赖于前后两帧的运动估计。
主要用途
- B帧是视频编码中压缩效率最高的帧类型,适用于大多数的非实时视频流和大文件的编码。
- 因为B帧需要参考前后帧,它通常被用于视频编码的中间部分,能够有效地提高编码效率。
编码器与解码器
基本概念
- 编码器(Encoder):负责将原始音视频数据转换为压缩格式(例如H.264、HEVC等)。
- 解码器(Decoder):负责将压缩后的数据还原为原始音视频流。
编码器
编码器的主要作用是将原始的音视频信号(如未压缩的音频或视频)转换成压缩的格式(如H.264, HEVC, AAC等)。这个过程叫做“编码”或“压缩”,它减少了数据的大小,从而便于存储和传输
工作原理总结
-
帧分割:首先,视频或音频数据会被分割成单独的帧。视频通常以图像帧为单位进行分割,而音频则通常以时间为单位进行分割(例如采样率为44.1kHz的音频会以每秒44100个采样点进行处理)。
-
变换和量化:对每一帧进行数学变换(例如DCT—离散余弦变换,或离散傅里叶变换等),将图像或音频信号转换为频域数据。然后,进行量化操作,将信号值限制在一定范围内,从而丧失一些精度,减少数据量。
-
预测和差分:对于视频编码,编码器会基于当前帧与前一帧的差异(运动估计)来进行编码。例如,视频编码中的P帧和B帧通过预测前后帧的差异来达到更高的压缩比。
-
编码:通过特定的算法对信号进行编码。例如,H.264使用的CABAC(Context-based Adaptive Binary Arithmetic Coding)或者CAVLC(Context Adaptive Variable Length Coding)进行压缩。音频编码则使用如AAC中的MDCT(Modified Discrete Cosine Transform)等变换和编码方法。
-
输出压缩数据:最终编码器将经过压缩处理的音视频数据输出为某种格式的压缩码流,常见的编码格式有H.264、HEVC(H.265)、VP9、AAC、MP3等。
解码器
解码器的作用是将压缩的音视频数据转换回原始的音视频信号。它是编码器的反向操作,目标是恢复出尽可能接近原始数据的内容。解码器通常用于播放压缩视频文件、音频文件或流媒体内容
工作原理总结
-
接收压缩数据:解码器接收来自存储或网络传输的压缩数据流(例如,H.264、HEVC、AAC等格式的文件或流)。
-
解码:解码器首先对压缩的数据进行解码操作,这个过程包括:
- 运动补偿:在视频解码中,解码器会根据编码过程中计算出的运动矢量和参考帧恢复视频帧的内容。
- 逆变换和反量化:解码器将接收到的频域数据通过逆变换(如逆DCT)转回时域数据,并通过反量化过程恢复丢失的一部分精度。
- 预测还原:对于P帧和B帧,解码器根据前后帧的参考信息恢复图像数据。
-
图像或音频输出:经过解码的数据将转换为可播放的音频信号或视频帧。例如,视频信号可以恢复为帧序列,音频信号则恢复为一系列声音波形。
-
显示或播放:对于视频解码,解码器将输出的帧传递给显示设备进行呈现;对于音频解码,输出的音频数据传递给音响设备进行播放。
码流
经过压缩和编码的音视频数据流。它包含了编码后的视频信息和音频信息。
视频码流
视频码流通常是由一系列编码后的帧(I帧、P帧、B帧)组成,它们按照一定的顺序(例如,GOP——图像组)排列。视频码流的结构包括以下几个主要部分
-
帧数据:包括压缩后的视频帧数据(例如H.264编码中的NAL单元),表示视频每一帧的内容。每一帧可以是I帧(关键帧)、P帧(预测帧)或B帧(双向预测帧)。
-
NAL单元(Network Abstraction Layer Units):在H.264/HEVC等编码标准中,视频码流被分割成多个NAL单元。每个NAL单元包含一个或多个编码后的视频数据,负责存储视频帧的压缩信息。NAL单元是视频码流的基本组成单元。
-
头部信息:包括一些控制信息,如编码参数、分辨率、帧率、参考帧信息等,这些用于指导解码器如何正确解码视频流。
-
时间戳:码流中通常会有时间戳,用来指示视频帧的展示时间和播放顺序。
-
封装格式:视频码流通常会被封装成容器格式,如 MP4、MKV、AVI 等,这些容器格式将视频流、音频流、字幕流等多个媒体流组合在一起,便于存储和传输。
音频码流
音频码流则是经过音频编码(如 AAC、MP3、Opus 等)处理后产生的二进制数据流。它的结构一般包括
-
帧数据:音频码流包含一系列音频帧(例如,AAC中的音频帧)。每一帧可能包含一段音频的压缩信息。
-
头部信息:包括音频格式、采样率、通道数、比特率等音频的基本属性。
-
时间戳:音频码流同样会包含时间戳,以便音频能够与视频同步播放。
-
封装格式:音频流也常常与其他多媒体数据一起封装在容器文件中,如 MP4、MKV、FLV 等。
视频码流主要类型
- H.264/AVC(Advanced Video Coding):一种广泛使用的视频编码标准,压缩效率较高,广泛应用于网络视频流、蓝光光盘、高清电视等。
- HEVC/H.265(High Efficiency Video Coding):H.264的继任者,提供比H.264更高的压缩效率,广泛用于4K视频压缩。
- VP9:Google推出的视频编码格式,广泛应用于YouTube等流媒体平台。
- AV1:新的开源视频编码标准,提供比HEVC和VP9更高的压缩效率,主要用于高质量视频流和Web视频播放。
音频码流主要类型
- AAC(Advanced Audio Codec):一种高效的音频编码格式,广泛应用于流媒体和广播。
- MP3(MPEG Audio Layer III):早期广泛使用的音频编码格式,压缩效率较低,但依然广泛存在。
- Opus:一种低延迟音频编解码器,特别适用于实时通信(如VoIP)和音频流。
SEI
概念
SEI是视频流中附加的信息,通常用于增强视频质量、实现更高效的编码或者提供额外的传输信息。它通常不会影响解码,但对于解码后的显示或者处理有帮助。
视频编码中的作用
- 显示与呈现:包括视频播放中的显示特性、颜色空间信息、色度调整等,用于增强视频的显示效果。
- 后期处理:提供用于后期视频处理的参数,例如去噪、锐化、增强对比度等。
- 传输优化:在网络传输过程中,通过SEI提供一些动态调整参数或网络条件信息,从而优化传输质量。
- 编码优化:在编码阶段,SEI可以传输一些额外的辅助信息,帮助解码器或显示设备更好地适应编码特性,改善视频质量。
与Nalu的关系
在H.264和HEVC等编码标准中,SEI通常以**NALU(Network Abstraction Layer Units)**的形式存在。NALU是视频码流的基本单位,用来包装各种编码信息,而SEI则是被包装在某些类型的NALU中作为附加信息进行传输
注意,SEI在国标平台上传输,也是需要先封装成PS流,然后再打成RTP包进行发送
相关文章:
【音视频】编解码相关概念总结
NALU RTP PS流 三者总体关系 NALU在RTP中的应用:视频流的RTP传输通常将NALU作为基本的单元进行传输。每个RTP包携带一个或多个NALU,这些NALU包含了视频编码数据。RTP协议通过其头部信息(如时间戳、序列号等)帮助接收端重新排列和…...

Python爬虫(四)- Selenium 安装与使用教程
文章目录 前言一、简介及安装1. Selenium 简介2. Selenium 安装 二、Selenium 基本使用1. 导入Selenium2. 启动浏览器3. 打开网页4. 获取页面标题5. 关闭浏览器6. 完整示例代码 三、Selenium WebDriver1. 简介2. 基本操作2.1 启动浏览器2.2 关闭浏览器2.3 打开网页2.4 关闭当前…...

Node.js项目启动流程以及各个模块执行顺序详解
Node.js项目启动流程以及各个模块执行顺序的问题。首先,我需要仔细阅读并理解我搜索到的资料,从中提取关键信息,然后综合这些信息组织成一个结构化的回答。 首先,根据我搜索到的资料都详细描述了Node.js的启动流程,涉及…...

各种类型网络安全竞赛有哪些 网络安全大赛的简称
本文是对入门学习的一些概念了解和一些常规场景记录 1.CTF(capture the flag)是夺旗赛的意思。 是网络安全技术人员之间进行攻防的比赛。 起源1996年DEFCON全球黑客大会,替代之前真实攻击的技术比拼。 (DEFCON极客大会诞生1993,…...
浅谈人工智能与深度学习的应用案例研究
人工智能与深度学习的应用案例研究 人工智能(AI)与深度学习技术正以惊人的速度渗透到社会生活的各个领域,从医疗健康到艺术创作,从金融风控到城市治理,其应用案例不断突破传统边界。以下是近年来具有代表性的六大应用方向及具体案例: 一、医疗健康:精准诊断与药物研发 医…...

vue2版本elementUI的table分页实现多选逻辑
1. 需求 我们需要在表格页上实现多选要求,该表格支持分页逻辑。 2. 认识属性 表格属性 参数说明类型可选值默认值data显示的数据array——row-key行数据的 Key,用来优化 Table 的渲染;在使用 reserve-selection 功能与显示树形数据时&…...

AI数字人技术源码开发分享:革新短视频营销策略
集星幻影的AI数字人分身系统是一款融合了先进人工智能技术的综合性短视频营销解决方案。该系统整合了形象克隆、声音克隆、AI数字人分身生成、智能剪辑及文案创作等功能,旨在为用户打造虚拟人物资产并提供AI驱动的多模态交互服务。以下是该系统的主要功能概述&#…...

实验环境搭建集锦(docker linux ros2+强化学习环境+linux上单片机串口调试)
为了记住一些实验环境配置开的文章,边配置边记,免得之后忘了。 Docker环境搭建 yay -S docker //下载docker docker info //查看docker配置 sudo systemctl start docker //系统配置打开docker sudo systemctl enable docker //系统配置后台开启d…...
sql调优之数据库开发规范
数据库 数据库开发规范 也可用于PostgreSQL以及兼容PG的数据库 通用命名规则 【强制】 本规则适用于所有对象名,包括:库名、表名、列名、函数名、视图名、序列号名、别名等。 【强制】 对象名务必只使用小写字母,下划线,数字&…...

《Effective Objective-C》阅读笔记(上)
目录 高质量iOS之熟悉OC 了解OC语言的起源 在类的头文件中尽量少引入其他头文件 多用字面语法,少用与之等价的方法 字面数值 字面量数组 字面量字典 局限性 多用类型常量,少用#define预处理指令 用枚举表示状态、选项、状态码 高质量iOS之对象…...

ClkLog里程碑:荣获2024上海开源技术应用创新竞赛三等奖
2024年10月,ClkLog团队参加了由上海计算机软件技术开发中心、上海开源信息技术协会联合承办的2024上海数智融合“智慧工匠”选树、“领军先锋”评选活动——开源技术应用创新竞赛。我们不仅成功晋级决赛,还荣获了三等奖!这一成就不仅是对ClkL…...

【数据结构进阶】哈希表
🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:数据结构 目录 前言 一、哈希表的概念 二、哈希函数的实现方法 1. 直接定址法 2. 除留余数法 三、哈希冲突 1. 开放定址法(闭散列࿰…...

STM32内存五区及堆栈空间大小设置(启动文件浅析)
前言 嘿,朋友们!今天咱们来聊聊STM32的内存五区和堆栈空间大小设置。这可是嵌入式开发里的“必修课”,要是没整明白,程序说不定就“翻车”了。别担心,我这就带你一步步搞懂这事儿,让你轻松上手,…...

微信小程序调用火山方舟(字节跳动火山引擎)中的DeepSeek大模型
微信小程序的轻量化特性与DeepSeek大模型的AI能力结合,可快速构建智能问答、内容生成等场景化服务。通过火山方舟平台提供的标准化接口,开发者无需深入算法细节即可调用模型能力。 一、注册火山引擎账号,创建API Key和model(接入…...

(八)Java-Collection
一、Collection接口 1.特点 Collection实现子类可以存放多个元素,每个元素可以是Object; 有些Collection的实现类,可以存放重复的元素,有些不可以; 有些Collection的实现类,有些是有序的(Li…...

从单片机的启动说起一个单片机到点灯发生了什么下——使用GPIO点一个灯
目录 前言 HAL库对GPIO的抽象 核心分析:HAL_GPIO_Init 前言 我们终于到达了熟悉的地方,对GPIO的初始化。经过漫长的铺垫,我们终于历经千辛万苦,来到了这里。关于GPIO的八种模式等更加详细的细节,由于只是点个灯&am…...

C++ | 哈希表
前言 💓 个人主页:普通young man-CSDN博客 ⏩ 文章专栏:C_普通young man的博客-CSDN博客 ⏩ 本人giee: 普通小青年 (pu-tong-young-man) - Gitee.com 若有问题 评论区见📝 🎉欢迎大家点赞👍收藏⭐文章 —…...
leetcode_动态规划/递归 70. 爬楼梯
70. 爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 思路: 考虑: 假设现在已经爬到了某一阶台阶,那是如何到达这里的呢?可能是从前一阶台阶爬上来的&am…...

基于Rook的Ceph云原生存储部署与实践指南(上)
#作者:任少近 文章目录 1 Ceph环境准备2 rook部署ceph群集2.1 Rook 帮助地址2.2 安装ceph2.3 获取csi镜像2.4 Master参加到osd2.5 设置默认存储 3 Rook部署云原生RBD块存储3.1 部署storageclass资源3.2 部署WordPress使用RBD3.3 WordPress访问 4 Rook部署云原生RGW…...
C++ Qt常见面试题(4):Qt事件过滤器
在 Qt 中,事件过滤器(Event Filter)提供了一种机制,可以拦截并处理对象的事件(如鼠标事件、键盘事件等),在事件到达目标对象之前对其进行预处理。事件过滤器通常用于以下场景: 捕获和处理特定的事件(如鼠标点击、按键等);对事件进行筛选或修改;实现全局的事件监听功…...

XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...