音视频入门基础:H.264专题(6)——FFmpeg源码:从H.264码流中提取NALU Header、EBSP、RBSP和SODB
=================================================================
音视频入门基础:H.264专题系列文章:
音视频入门基础:H.264专题(1)——H.264官方文档下载
音视频入门基础:H.264专题(2)——使用FFmpeg命令生成H.264裸流文件
音视频入门基础:H.264专题(3)——EBSP, RBSP和SODB
音视频入门基础:H.264专题(4)——NALU Header:forbidden_zero_bit、nal_ref_idc、nal_unit_type简介
音视频入门基础:H.264专题(5)——FFmpeg源码中 解析NALU Header的函数分析
音视频入门基础:H.264专题(6)——FFmpeg源码:从H.264码流中提取NALU Header、EBSP、RBSP和SODB
音视频入门基础:H.264专题(7)——FFmpeg源码中 指数哥伦布编码的解码实现
音视频入门基础:H.264专题(8)——H.264官方文档的描述符
=================================================================
一、引言
FFmpeg源码中 通过ff_h2645_packet_split这个函数将一个个NALU的NALU Header、EBSP、RBSP和SODB从H.264/H.265码流中提取出来,本文以H.264为例对该函数进行讲解。
二、ff_h2645_packet_split函数的声明
ff_h2645_packet_split函数声明在FFmpeg源码(本文演示用的FFmpeg源码版本为5.0.3)的头文件libavcodec/h2645_parse.h中:
/*** Split an input packet into NAL units.** If data == raw_data holds true for a NAL unit of the returned pkt, then* said NAL unit does not contain any emulation_prevention_three_byte and* the data is contained in the input buffer pointed to by buf.* Otherwise, the unescaped data is part of the rbsp_buffer described by the* packet's H2645RBSP.** If the packet's rbsp_buffer_ref is not NULL, the underlying AVBuffer must* own rbsp_buffer. If not and rbsp_buffer is not NULL, use_ref must be 0.* If use_ref is set, rbsp_buffer will be reference-counted and owned by* the underlying AVBuffer of rbsp_buffer_ref.*/
int ff_h2645_packet_split(H2645Packet *pkt, const uint8_t *buf, int length,void *logctx, int is_nalff, int nal_length_size,enum AVCodecID codec_id, int small_padding, int use_ref);
该函数的作用是:将形参buf指向的H.264码流中的一个个NALU提取出来,解析NALU Header,分别将每个NALU的NALU Header中的属性,EBSP、RBSP和SODB存贮到形参pkt指向的内存中。
形参pkt:输出型参数。为H2645Packet *类型。
H2645Packet结构体声明在libavcodec/h2645_parse.h中:
/* an input packet split into unescaped NAL units */
typedef struct H2645Packet {H2645NAL *nals;H2645RBSP rbsp;int nb_nals;int nals_allocated;unsigned nal_buffer_size;
} H2645Packet;
执行ff_h2645_packet_split函数后,指针pkt->nals会指向一个H2645NAL类型的数组。该数组的每个元素都会存放从H.264码流中提取出来的NALU信息。比如pkt->nals[0]存放从H.264码流中提取出来的第一个NALU的信息,pkt->nals[1]存放提取出来的第二个NALU的信息,以此类推。
H2645NAL结构体声明在libavcodec/h2645_parse.h:
typedef struct H2645NAL {const uint8_t *data;int size;/*** Size, in bits, of just the data, excluding the stop bit and any trailing* padding. I.e. what HEVC calls SODB.*/int size_bits;int raw_size;const uint8_t *raw_data;GetBitContext gb;/*** NAL unit type*/int type;/*** H.264 only, nal_ref_idc*/int ref_idc;/*** HEVC only, nuh_temporal_id_plus_1 - 1*/int temporal_id;/** HEVC only, identifier of layer to which nal unit belongs*/int nuh_layer_id;int skipped_bytes;int skipped_bytes_pos_size;int *skipped_bytes_pos;
} H2645NAL;
我们记pkt->nals指向的数组的某个元素的下标为“subscript”(数组的下标都是从0开始,所以pkt->nals[subscript]表示它是第“subscript+1”个元素),则执行函数ff_h2645_packet_split后:
pkt->nals[subscript]->data变为:指向某个缓冲区的指针。该缓冲区存放 从H.264码流中提取出来的第“subscript+1”个NALU的“NALU Header + RBSP”。
pkt->nals[subscript]->size变为:pkt->nals[subscript]->data指向的缓冲区的大小,单位为字节。
pkt->nals[subscript]->size_bits变为:该NALU “NALU Header + SODB的位数”,单位为bit(1个字节等于8位)。
pkt->nals[subscript]->raw_data变为:指向某个缓冲区的指针。该缓冲区存放提取出来的第“subscript+1”个NALU的“NALU Header + EBSP”。
pkt->nals[subscript]->raw_size变为:pkt->nals[subscript]->raw_data指向的缓冲区的大小,单位为字节。
pkt->nals[subscript]->type变为:该NALU“NALU Header中的nal_unit_type”。
pkt->nals[subscript]->ref_idc变为:该NALU“NALU Header中的nal_ref_idc”。
pkt->nals[subscript]->gb.buffer的值等于:pkt->nals[subscript]->data。
pkt->nals[subscript]->gb.buffer_end变为:指向该NALU的RBSP的最后一个字节。
pkt->nals[subscript]->gb.index变为:8。表示读取完了该NALU的第一个字节(NALU Header,8位)
pkt->nals[subscript]->gb.size_in_bit的值等于:pkt->nals[subscript]->size_bits。
pkt->nals[subscript]->gb.size_in_bits_plus8的值等于:pkt->nals[subscript]->gb.size_in_bit + 8。
pkt->nb_nals为:这段H.264码流中NALU的个数。
形参buf:输入型参数。指向缓冲区的指针,该缓冲区存放“包含startcode的H.264码流”。
形参length:输入型参数。形参buf指向的缓冲区的长度,单位为字节。
形参logctx:输入型参数。用来输出日志,可忽略。
形参is_nalff:输入型参数。值一般为0,可忽略。
形参nal_length_size:输入型参数。值一般为0,可忽略。
codec_id:输入型参数。解码器的id。对于H.264码流,其值就是“AV_CODEC_ID_H264”。
small_padding:输入型参数。值一般为0或1,可忽略。
use_ref:输入型参数。值一般为0,可忽略。
返回值:提取NALU Header、EBSP、RBSP和SODB成功返回0。返回非0值表示失败。
三、ff_h2645_packet_split函数的定义
ff_h2645_packet_split函数定义在libavcodec/h2645_parse.c中:
int ff_h2645_packet_split(H2645Packet *pkt, const uint8_t *buf, int length,void *logctx, int is_nalff, int nal_length_size,enum AVCodecID codec_id, int small_padding, int use_ref)
{GetByteContext bc;int consumed, ret = 0;int next_avc = is_nalff ? 0 : length;int64_t padding = small_padding ? 0 : MAX_MBPAIR_SIZE;bytestream2_init(&bc, buf, length);alloc_rbsp_buffer(&pkt->rbsp, length + padding, use_ref);if (!pkt->rbsp.rbsp_buffer)return AVERROR(ENOMEM);pkt->rbsp.rbsp_buffer_size = 0;pkt->nb_nals = 0;while (bytestream2_get_bytes_left(&bc) >= 4) {H2645NAL *nal;int extract_length = 0;int skip_trailing_zeros = 1;if (bytestream2_tell(&bc) == next_avc) {int i = 0;extract_length = get_nalsize(nal_length_size,bc.buffer, bytestream2_get_bytes_left(&bc), &i, logctx);if (extract_length < 0)return extract_length;bytestream2_skip(&bc, nal_length_size);next_avc = bytestream2_tell(&bc) + extract_length;} else {int buf_index;if (bytestream2_tell(&bc) > next_avc)av_log(logctx, AV_LOG_WARNING, "Exceeded next NALFF position, re-syncing.\n");/* search start code */buf_index = find_next_start_code(bc.buffer, buf + next_avc);bytestream2_skip(&bc, buf_index);if (!bytestream2_get_bytes_left(&bc)) {if (pkt->nb_nals > 0) {// No more start codes: we discarded some irrelevant// bytes at the end of the packet.return 0;} else {av_log(logctx, AV_LOG_ERROR, "No start code is found.\n");return AVERROR_INVALIDDATA;}}extract_length = FFMIN(bytestream2_get_bytes_left(&bc), next_avc - bytestream2_tell(&bc));if (bytestream2_tell(&bc) >= next_avc) {/* skip to the start of the next NAL */bytestream2_skip(&bc, next_avc - bytestream2_tell(&bc));continue;}}if (pkt->nals_allocated < pkt->nb_nals + 1) {int new_size = pkt->nals_allocated + 1;void *tmp;if (new_size >= INT_MAX / sizeof(*pkt->nals))return AVERROR(ENOMEM);tmp = av_fast_realloc(pkt->nals, &pkt->nal_buffer_size, new_size * sizeof(*pkt->nals));if (!tmp)return AVERROR(ENOMEM);pkt->nals = tmp;memset(pkt->nals + pkt->nals_allocated, 0, sizeof(*pkt->nals));nal = &pkt->nals[pkt->nb_nals];nal->skipped_bytes_pos_size = FFMIN(1024, extract_length/3+1); // initial buffer sizenal->skipped_bytes_pos = av_malloc_array(nal->skipped_bytes_pos_size, sizeof(*nal->skipped_bytes_pos));if (!nal->skipped_bytes_pos)return AVERROR(ENOMEM);pkt->nals_allocated = new_size;}nal = &pkt->nals[pkt->nb_nals];consumed = ff_h2645_extract_rbsp(bc.buffer, extract_length, &pkt->rbsp, nal, small_padding);if (consumed < 0)return consumed;if (is_nalff && (extract_length != consumed) && extract_length)av_log(logctx, AV_LOG_DEBUG,"NALFF: Consumed only %d bytes instead of %d\n",consumed, extract_length);bytestream2_skip(&bc, consumed);/* see commit 3566042a0 */if (bytestream2_get_bytes_left(&bc) >= 4 &&bytestream2_peek_be32(&bc) == 0x000001E0)skip_trailing_zeros = 0;nal->size_bits = get_bit_length(nal, skip_trailing_zeros);if (nal->size <= 0 || nal->size_bits <= 0)continue;ret = init_get_bits(&nal->gb, nal->data, nal->size_bits);if (ret < 0)return ret;/* Reset type in case it contains a stale value from a previously parsed NAL */nal->type = 0;if (codec_id == AV_CODEC_ID_HEVC)ret = hevc_parse_nal_header(nal, logctx);elseret = h264_parse_nal_header(nal, logctx);if (ret < 0) {av_log(logctx, AV_LOG_WARNING, "Invalid NAL unit %d, skipping.\n",nal->type);continue;}pkt->nb_nals++;}return 0;
}
四、ff_h2645_packet_split函数的内部实现原理
ff_h2645_packet_split函数中首先通过:
bytestream2_init(&bc, buf, length);
初始化GetByteContext结构体变量bc,让bc.buffer指向“包含起始码的H.264码流”的开头(首地址)。(关于bytestream2_init函数和相关函数的用法可以参考:《FFmpeg字节操作相关的源码:GetByteContext结构体,bytestream2_init、bytestream2_get_bytes_left、bytestream2_tell函数分析》)
然后通过:
while (bytestream2_get_bytes_left(&bc) >= 4){
//...
}
判断如果距离读取完H.264码流还剩超过4个字节,则执行大括号循环体中的内容
如果没读取完这段H.264码流,执行else{//...}里面的内容:
if (bytestream2_tell(&bc) == next_avc) {
//...
}else{
//...
}
然后通过:
/* search start code */
buf_index = find_next_start_code(bc.buffer, buf + next_avc);
bytestream2_skip(&bc, buf_index);
找到这段H.264码流中值为0x000001或0x00000001的起始码的位置,让bc.buffer指向“这段H.264码流去掉第一个起始码后的位置”。
如果此时已经到了这段H.264码流的末尾,并且这段H.264码流中存在其它起始码,返回0。如果到了这段H.264码流的末尾时也没发现它里面包含任何起始码,说明这段H.264码流是无效的,返回AVERROR_INVALIDDATA:
if (!bytestream2_get_bytes_left(&bc)) {if (pkt->nb_nals > 0) {// No more start codes: we discarded some irrelevant// bytes at the end of the packet.return 0;} else {av_log(logctx, AV_LOG_ERROR, "No start code is found.\n");return AVERROR_INVALIDDATA;}
}
继续往下执行,通过:
consumed = ff_h2645_extract_rbsp(bc.buffer, extract_length, &pkt->rbsp, nal, small_padding);
拿到这段H.264码流中的第一个NALU的“NALU Header + RBSP”和“NALU Header + EBSP”。关于ff_h2645_extract_rbsp函数可以参考《FFmpeg源码:ff_h2645_extract_rbsp函数分析》
通过:
bytestream2_skip(&bc, consumed);
让bc.buffer指向 下一个NALU的开始位置。
通过:
nal->size_bits = get_bit_length(nal, skip_trailing_zeros);
拿到NALU Header + SODB的位数,单位为比特。关于get_bit_length可以参考《FFmpeg源码:get_bit_length函数分析》
通过:
ret = h264_parse_nal_header(nal, logctx);
将NALU Header解析出来。关于h264_parse_nal_header函数的用法可以参考《音视频入门基础:H.264专题(5)——FFmpeg源码中 解析NALU Header的函数分析》
该H.264码流中的NALU统计数量加1:
pkt->nb_nals++;
然后继续通过while循环来读取下一个NALU,直到读取完该H.264码流为止:
while (bytestream2_get_bytes_left(&bc) >= 4) {
//...
}
相关文章:
![](https://www.ngui.cc/images/no-images.jpg)
音视频入门基础:H.264专题(6)——FFmpeg源码:从H.264码流中提取NALU Header、EBSP、RBSP和SODB
音视频入门基础:H.264专题系列文章: 音视频入门基础:H.264专题(1)——H.264官方文档下载 音视频入门基础:H.264专题(2)——使用FFmpeg命令生成H.264裸流文件 音视频入门基础&…...
![](https://www.ngui.cc/images/no-images.jpg)
STM32实现按键单击、双击、长按、连按功能,使用状态机,无延时,不阻塞
常见的按键判定程序,如正点原子按键例程,只能判定单击事件,对于双击、长按等的判定逻辑较复杂,且使用main函数循环扫描的方式,容易被阻塞,或按键扫描函数会阻塞其他程序的执行。使用定时器设计状态机可以规…...
![](https://img-blog.csdnimg.cn/direct/a22382c41f5240b5865b6abcf459c02a.png#pic_center)
C#之Delta并联机械手的视觉同步分拣
本文导读 前面两节课程我们介绍了怎么建立Delta并联机械手的正逆解以及如何通过视觉进行匹配定位。本节课程给大家分享如何通过C#语言开发正运动Delta并联机械手传送带同步的视觉分拣。 VPLC711硬件介绍 VPLC711是正运动推出的一款基于x86平台和Windows操作系统的高性能机器…...
![](https://img-blog.csdnimg.cn/direct/f36123e932ab469aaa854e5e3bdafae8.png)
01:Linux的基本命令
Linux的基本命令 1、常识1.1、Linux的隐藏文件1.2、绝对路径与相对路径 2、基本命令2.1、ls2.2、cd2.3、pwd / mkdir / mv / touch / cp / rm / cat / rmdir2.4、ln2.5、man2.6、apt-get 本教程是使用的是Ubuntu14.04版本。 1、常识 1.1、Linux的隐藏文件 在Linux中…...
![](https://img-blog.csdnimg.cn/direct/e0ad1ffe6ebc4526bfbf82c0217a1279.png)
GNSS 载波、测距码和导航电文的关系简介
1、GNSS 载波、测距码和导航电文 在卫星导航系统中,载波、测距码和导航电文是构成GPS信号的三个基本组成部分,它们共同工作以实现精确的卫星定位和导航功能。以下是对这三个组成部分的详细介绍: 1. 载波(Carrier)&…...
![](https://www.ngui.cc/images/no-images.jpg)
deepE 定位系统卡顿问题实战(一) ----------- 锁造成的阻塞问题
deepE介绍 deepE是一个开源的用于端侧(自动驾驶车,机器人)等环境的系统问题与性能分析工具。基于ebpf功能实现 deepE项目地址 欢迎star 测试程序 #include <iostream> #include <thread> #include <mutex>static std::mutex lock;void func1() {int l…...
![](https://img-blog.csdnimg.cn/direct/8549ba382b0e4d569db8a718f891e92c.png)
YOLOv5改进 | 主干网络 | ODConv + ConvNeXt 增强目标特征提取能力
秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 专栏目录: 《YOLOv5入门 …...
![](https://img-blog.csdnimg.cn/direct/ffae711b6c824f47ad585e527ece6800.png)
TIA博途WinCC通过VB脚本从 Excel中读取数据的具体方法介绍
TIA博途WinCC通过VB脚本从 Excel中读取数据的具体方法介绍 添加 一个PLC,设置PLC的IP地址,如下图所示, 添加全局DB块,新建几个变量,如下图所示, 在数据块中添加了 tag1 …… tag6 ,共 6 个浮点数类型的变量,用来接收通过 WinCC 从 Excel 文件中读取的数据。 添加 HMI…...
![](https://www.ngui.cc/images/no-images.jpg)
第5篇 区块链的技术架构:节点、网络和数据结构
区块链技术听起来很高大上,但其实它的核心架构并不难理解。今天我们就用一些简单的例子和有趣的比喻,来聊聊区块链的技术架构:节点、网络和数据结构。 节点:区块链的“细胞” 想象一下,区块链就像是一个大型的组织&a…...
![](https://www.ngui.cc/images/no-images.jpg)
vue长列表,虚拟滚动
1.新建子组件,将数据传递过去(几万条数据的数组,一次性展示多少条,每条数据的行高). <template><div class"vitualScroll"><sub-scroll :dataList"dataList" :rowCount"20" :rowHeight"2…...
![](https://img-blog.csdnimg.cn/20201024113127789.png#pic_center)
【实战场景】记一次UAT jvm故障排查经历
【实战场景】记一次UAT jvm故障排查经历 开篇词:干货篇:1.查看系统资源使用情况2.将十进制进程号转成十六进制3.使用jstack工具监视进程的垃圾回收情况4.输出指定线程的堆内存信息5.观察日志6.本地环境复现 总结篇:我是杰叔叔,一名…...
![](https://img-blog.csdnimg.cn/direct/a72d8f12cb1c4546837ebfd50b125340.png)
线性代数--行列式1
本篇来自对线性代数第一篇的行列式的一个总结。 主要是行列式中有些关键点和注意事项,便于之后的考研复习使用。 首先,对于普通的二阶和三阶行列式,我们可以直接对其进行拆开,展开。 而对于n阶行列式 其行列式的值等于它的任意…...
![](https://www.ngui.cc/images/no-images.jpg)
tensorflow神经网络
训练一个图像识别模型,使用TensorFlow,需要以下步骤。 1. 安装所需的库 首先,确保安装了TensorFlow和其他所需的库。 pip install tensorflow numpy matplotlib2. 数据准备 需要收集和准备训练数据。每个类别应有足够多的样本图像。假设有…...
![](https://img-blog.csdnimg.cn/direct/79ea9df1e0b44e369dabd40810273ae0.png)
Python基础001
Python输出语句 print输出字符串 print("中国四大名著:","西游记|","三国演义|","红楼梦|","水浒传") print(6) print(1 1)Python输入语句 input函数 input() input("我的名字是:") p…...
![](https://img-blog.csdnimg.cn/direct/f9114c5f8089465182e8f2ea42f01361.png)
【udp报文】udp报文未自动分片,报文过长被拦截问题定位
问题现象 某局点出现一个奇怪的现象,客户端给服务端发送消息,服务端仅能收到小部分消息,大部分消息从客户端发出后,服务端都未收到。 问题定位 初步分析 根据现象初步分析,有可能是网络原因导致消息到服务端不可达&a…...
![](https://img-blog.csdnimg.cn/direct/ee71a6fd25ca408686119c4de2cb043c.png)
某网页gpt的JS逆向
原网页网址 (base64) 在线解码 aHR0cHM6Ly9jbGF1ZGUzLmZyZWUyZ3B0Lnh5ei8 逆向效果图 调用代码(复制即用) 把倒数第三行换成下面的base64解码 aHR0cHM6Ly9jbGF1ZGUzLmZyZWUyZ3B0Lnh5ei9hcGkvZ2VuZXJhdGU import hashlib import time import reques…...
![](https://img-blog.csdnimg.cn/direct/aa48e644d3dc4c6fbf9c370fb4dba066.png)
【python脚本】批量检测sql延时注入
文章目录 前言批量检测sql延时注入工作原理脚本演示 前言 SQL延时注入是一种在Web应用程序中利用SQL注入漏洞的技术,当传统的基于错误信息或数据回显的注入方法不可行时,例如当Web应用进行了安全配置,不显示任何错误信息或敏感数据时&#x…...
![](https://www.ngui.cc/images/no-images.jpg)
在C++中如何理解const关键字的不同用法(如const变量、const成员函数、const对象等)
在C中,const关键字是一个非常重要的修饰符,它用于指明变量、函数参数、成员函数或对象的内容是不可变的。理解const的不同用法对于编写高质量、易维护的C代码至关重要。下面详细解释const在几种不同上下文中的用法和含义。 1. const变量 当变量被声明为…...
![](https://img-blog.csdnimg.cn/f95ddae62a4e43a68295601c723f92fb.gif)
JavaSEJava8 时间日期API + 使用心得
文章目录 1. LocalDate2. LocalTime3. LocalDateTime3.1创建 LocalDateTime3.2 LocalDateTime获取方法 4. LocalDateTime转换方法4.1 LocalDateTime增加或者减少时间的方法4.2 LocalDateTime修改方法 5. Period6. Duration7. 格式转换7.1 时间日期转换为字符串7.2 字符串转换为…...
![](https://www.ngui.cc/images/no-images.jpg)
【亲测解决】Python时间问题
微信公众号:leetcode_algos_life,代码随想随记 小红书:412408155 CSDN:https://blog.csdn.net/woai8339?typeblog ,代码随想随记 GitHub: https://github.com/riverind 抖音【暂未开始,计划开始】…...
![](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=img%2Fef1de95618018bf7dcbfb015a970185a.png&pos_id=img-gVRmRgD6-1719848956233)
Linux屏幕驱动开发调试笔记
引言 首先了解下什么是MIPI-DSI: MIPI-DSI是一种应用于显示技术的串行接口,兼容DPI(显示像素接口,Display Pixel Interface)、DBI(显示总线接口,Display Bus Interface)和DCS(显示命令集,Display Command Set)&#…...
![](https://www.ngui.cc/images/no-images.jpg)
Nginx Http缓存的必要性!启发式缓存有什么弊端?
👀 Nginx Http缓存的必要性!启发式缓存有什么弊端? 简介启发式缓存引发的问题nginx缓存配置 简介 我们在使用React或者Vue开发项目中会使用hash、chunkhash、contenthash来给静态资源文件进行命名。这带来的好处便是当我们部署完项目后&…...
![](https://img-blog.csdnimg.cn/direct/e2c543954a454745b45a0d3b4485c5cc.jpeg)
【RT摩拳擦掌】RT云端测试之百度天工物接入构建(设备型)
【RT摩拳擦掌】RT云端测试之百度天工物接入构建(设备型) 一, 文档介绍二, 物接入IOT Hub物影子构建2.1 创建设备型项目2.2 创建物模型2.3 创建物影子 三, MQTT fx客户端连接云端3.1 MQTT fx配置3.2 MQTT fx订阅3.3 MQT…...
![](https://img-blog.csdnimg.cn/direct/2c0ed663a34b4a83af2d5347eebb9e95.png)
Mysql和ES使用汇总
一、mysql和ES在业务上的配合使用 一般使用时使用ES 中存储全文检索的关键字与获取的商品详情的id,通过ES查询获取查询商品的列表中展示的数据,通过展示id 操作去获取展示商品的所有信息。mysql根据id去查询数据库数据是很快的; 为什么ES一般…...
![](https://www.ngui.cc/images/no-images.jpg)
Android中使用performClick触发点击事件
Android中使用performClick触发点击事件 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨在Android开发中如何使用 performClick() 方法来触发点击…...
![](https://www.ngui.cc/images/no-images.jpg)
重生之我要学后端01--后端语言选择和对应框架选择
编程语言 后端开发通常需要掌握至少一种编程语言。以下几种语言在后端开发中非常流行: Java:广泛用于企业级应用程序。Python:因其易学性和强大的库支持(如Django和Flask)而受欢迎。Node.js(JavaScript&a…...
![](https://img-blog.csdnimg.cn/direct/aa4888e56b754e54933fe2157345147b.png)
C语言 | Leetcode C语言题解之第206题反转链表
题目: 题解: struct ListNode* reverseList(struct ListNode* head) {if (head NULL || head->next NULL) {return head;}struct ListNode* newHead reverseList(head->next);head->next->next head;head->next NULL;return newHea…...
![](https://www.ngui.cc/images/no-images.jpg)
Flink Window DEMO 学习
该文档演示了fink windows的操作DEMO 环境准备: kafka本地运行:kafka部署自动生成名字代码:随机名自动生成随机IP代码:随机IPFlink 1.18 测试数据 自动向kafka推送数据 import cn.hutool.core.date.DateUtil; import com.alibab…...
![](https://img-blog.csdnimg.cn/direct/dc13caebec1849d08df697cb7e9c7bdb.png#pic_center)
library source does not match the bytecode for class SpringApplication
library source does not match the bytecode for class SpringApplication 问题描述:springboot源码点进去然后download source后提示标题内容。spring版本5.2.8.RELEASE,springboot版本2.7.18 解决方法:把spring版本改为与boot版本对应的6.…...
![](https://img-blog.csdnimg.cn/direct/0ec32c83239844ff9711341133333fd2.png)
Linux基础指令介绍与详解——原理学习
前言:本节内容标题虽然为指令,但是并不只是讲指令, 更多的是和指令相关的一些原理性的东西。 如果友友只想要查一查某个指令的用法, 很抱歉, 本节不是那种带有字典性质的文章。但是如果友友是想要来学习的,…...
![](https://www.ngui.cc/images/no-images.jpg)
【代码随想录算法训练Day52】LeetCode 647. 回文子串、LeetCode 516.最长回文子串
Day51 动态规划第十三天 LeetCode 647. 回文子串 dp数组的含义:i到j的子串是否是回文的,是的话dp[i][j]1 递推公式:if(s[i]s[j]) i j 一个元素 是回文的 |i-j|1 两个元素 是回文的 j-i>1 判断dp[i1][j-1] 初始化:全部初始化成…...
![](https://img-blog.csdnimg.cn/direct/b11a0037dd9d4f68aa5299df5e68624c.png)
VUE项目安全漏洞扫描和修复
npm audit 1、npm audit是npm 6 新增的一个命令,可以允许开发人员分析复杂的代码并查明特定的漏洞。 2、npm audit名称执行,需要包package.json和package-lock.json文件。它是通过分析 package-lock.json 文件,继而扫描我们的包分析是否包含漏洞的。 …...
![](https://img-blog.csdnimg.cn/direct/f38caa9b58844021a416557dae8a6206.png)
Nginx主配置文件---Nginx.conf
nginx主配置文件的模块介绍 全局块: 全局块是配置文件从开始到 events 块之间的部分,其中指令的作用域是 Nginx 服务器全局。主要指令包括: user:指定可以运行 Nginx 服务的用户和用户组,只能在全局块配置。例如&…...
![](https://www.ngui.cc/images/no-images.jpg)
IOS Swift 从入门到精通:写入 Firestore数据库
文章目录 FirestoreManager 类创建文档更新文档更新 Firestore 权限规则现在,我们想要在 Firestore 中添加或更新文档。如果您还没有,我建议您阅读有关设置 Firebase Auth 和从 Firestore 读取的部分。您必须在应用程序中启用 Firebase,并在项目中启用 Firestore 数据库,才…...
![](https://img-blog.csdnimg.cn/direct/8597ad53dd624ab7a9c19a673dd5652a.png)
维克日记 v0.4.2:开发者友好的数字化笔记工具
维克日记,专为技术开发者和笔记爱好者设计的数字化笔记工具,以其强大的功能和灵活的配置赢得了用户的好评。软件采用Markdown语法,提供实时预览功能,让您的笔记编辑更加高效和直观。维克日记的用户界面简洁而功能齐全,…...
![](https://img-blog.csdnimg.cn/direct/5d4ce96510e642fe99324dc5a42de922.png)
语音房平台交友,语聊APP系统开发线上语音交友平台成熟案例源码出售
随着移动互联网的快速发展,人们对于社交方式的需求也在不断变化,语音房平台交友语助APP作为一种新兴的社交方式,以其独特的语音交流模式和实时互动的特点,受到了越来越多用户的喜爱本文将详细介绍语音房平台交友语聊APP系统的开发…...
![](https://img-blog.csdnimg.cn/direct/99bfdde61aef4fa0818641e712c66772.png#pic_center)
VMamba: Visual State Space Model论文笔记
文章目录 VMamba: Visual State Space Model摘要引言相关工作Preliminaries方法网络结构2D-Selective-Scan for Vision Data(SS2D) VMamba: Visual State Space Model 论文地址: https://arxiv.org/abs/2401.10166 代码地址: https://github.com/MzeroMiko/VMamba 摘要 卷积神…...
![](https://img-blog.csdnimg.cn/img_convert/22d8fcf4ebc9cfc96a39ae12f94757e2.jpeg)
探索哈希函数:数据完整性的守护者
引言 银行在处理数以百万计的交易时,如何确保每一笔交易都没有出错?快递公司如何跟踪成千上万的包裹,确保每个包裹在运输过程中没有丢失或被替换?医院和诊所为庞大的患者提供有效的医疗保健服务,如何确保每个患者的医疗…...
![](https://www.ngui.cc/images/no-images.jpg)
解析Kotlin中的Unit【笔记摘要】
1. Kotlin的Unit 和 Java的void 的区别 // Java public void sayHello() {System.out.println("Hello!") }// Kotlin fun sayHello(): Unit {println("Hello!") }Unit 和 Java 的 void 真正的区别在于,void 是真的表示什么都不返回,…...
![](https://img-blog.csdnimg.cn/direct/2b66a075c0754d26b28095e1dade994a.png)
仿论坛项目--初识Spring Boot
1. 技术准备 技术架构 • Spring Boot • Spring、Spring MVC、MyBatis • Redis、Kafka、Elasticsearch • Spring Security、Spring Actuator 开发环境 • 构建工具:Apache Maven • 集成开发工具:IntelliJ IDEA • 数据库:MySQL、Redi…...
![](https://img-blog.csdnimg.cn/direct/df5c5de2f9034e6d91d1e623dc8bc4f2.png)
Spring boot 更改启动LOGO
在resources目录下创建banner.txt文件,然后编辑对应的图案即可 注释工具 Spring Boot Version: ${spring-boot.version},-.___,---.__ /|\ __,---,___,- \ -.____,- | -.____,- // -., | ~\ /~ | …...
![](https://www.ngui.cc/images/no-images.jpg)
python变成几个小程序
专家系统 需要建立‘capital_data.txt’ 空文件 from tkinter import Tk, simpledialog, messageboxdef read_from_file():with open(capital_data.txt) as file:for line in file:line line.rstrip(\n)country, city line.split(/)the_world[country] citydef write_to_fi…...
![](https://www.ngui.cc/images/no-images.jpg)
nginx配置stream代理
项目中遇到某些服务在内网,需要外网访问的情况,需要配置代理访问。可用nginx搭建代理服务。 TCP代理 通过nginx的stream模块可以直接代理TCP服务,步骤如下: 在/etc/nginx/下新建proxy文件夹,用于存放代理配置。此处…...
![](https://img-blog.csdnimg.cn/direct/4c0e76564d994feabef0b7a30ebcf2ad.png)
【瑞吉外卖 | day01】项目介绍+后台登录退出功能
文章目录 瑞吉外卖 — day011. 所需知识2. 软件开发整体介绍2.1 软件开发流程2.2 角色分工2.3 软件环境 3. 瑞吉外卖项目介绍3.1 项目介绍3.2 产品原型展示3.3 技术选型3.4 功能架构3.5 角色 4. 开发环境搭建4.1 数据库环境搭建4.2 Maven项目构建 5. 后台系统登录功能5.1 创建需…...
![](https://img-blog.csdnimg.cn/direct/a30cfb7e272b4789875e025567d48d06.png)
关于批量采集1688商品主图及链接的方式:软件采集/1688官方API接口数据采集
关于批量采集,我们通常用到的是软件 采集,或者通过1688官方API数据采集的形式:用户输入一组1688商品ID,一行一个,流程会自动逐个打开对应的1688商品详情页,采集主图的所有链接。 结果保存为表格的一行&…...
![](https://www.ngui.cc/images/no-images.jpg)
Shell 获取Hive表的location 信息
用shell 获取建表语句: hive -e "show create table ods_job.ods_job_tb"得到结果: CREATE TABLE ods_job.ods_job_tb(id bigint COMMENT id, auto int COMMENT job开启/关闭:0-关闭;1-开启, ....timeout_kill string…...
![](https://www.ngui.cc/images/no-images.jpg)
从零搭建教育管理系统:Java + Vue.js 教学-02
第三步:创建实体类和 Mapper 接口 现在我们已经设计好了数据库表,接下来使用 MyBatis-Plus 将这些表映射到 Java 对象,以便在代码中轻松地进行操作。 1. 创建实体类 在 src/main/java/<your_package>/entity 目录下 (如果没有该目录,请手动创建),创建与数据库表对应…...
![](https://img-blog.csdnimg.cn/direct/bb6cdae1aa8242babc10a080ed2d03a3.png#pic_center)
VSCode + GDB + J-Link 单片机程序调试实践
VSCode GDB J-Link 单片机程序调试实践 本文介绍如何创建VSCode的调试配置,如何控制调试过程,如何查看修改各种变量。 安装调试插件 在 VSCode 扩展窗口搜索安装 Cortex-Debug插件 创建调试配置 在 Run and Debug 窗口点击 create a launch.json …...
![](https://img-blog.csdnimg.cn/direct/e11bdd8ebc2047fe942df918130eb728.png#pic_center)
grpc学习golang版( 五、多proto文件示例 )
系列文章目录 第一章 grpc基本概念与安装 第二章 grpc入门示例 第三章 proto文件数据类型 第四章 多服务示例 第五章 多proto文件示例 第六章 服务器流式传输 第七章 客户端流式传输 第八章 双向流示例 文章目录 一、前言二、定义proto文件2.1 公共proto文件2.2 语音唤醒proto文…...
![](https://www.ngui.cc/images/no-images.jpg)
LeetCode 106 从中序与后序遍历序列构造二叉树
根据中序遍历和后序遍历的性质,还原二叉树,详细见注释 TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {//空,直接返回nullif(inorder.size() 0) return nullptr;//一个,返回一个nod…...
![](https://i-blog.csdnimg.cn/direct/962058e224a1417f8bd6c7caa273a465.png)
【qt】如何通过域名获得IP地址?
域名是什么呢?像www.baidu.com的baidu.com就是域名. 域名相当于是网站的门牌号. 域名可以通过 DNS 解析将其转换为对应的 IP 地址. 用我们获取IP地址的方式就可以,但是现在没有可以用另一种方法. 槽函数的实现: void MainWindow::lookupHost(const QHostInfo &hostInf…...
![](https://www.ngui.cc/images/no-images.jpg)
Linux下的Vim编辑器
一、绪论 1.1 Linux Vim的概述 1.2 Vim在Linux操作系统中的重要性 二、Linux Vim基础知识 2.1 Vim的起源和发展历史 2.2 Vim编辑器的安装与配置 2.3 Vim的基本操作命令 一、绪论 1.1 Linux Vim的概述 vi ( visual editor )编辑器通常被简称为vi,它是Linux和Unix系统上最…...
![](https://i-blog.csdnimg.cn/direct/bac865defb854fdf9f5612985aa484f5.jpeg)
快递物流运输中的锁控系统优缺点探讨
一、物流运输中锁控系统的重要性 1.1 保障货物安全 在物流运输过程中,货物安全是物流公司最为关注的问题之一。传统机械锁虽然在一定程度上提供了安全保障,但其缺点逐渐暴露,成为物流运输中的一个痛点。 易被破解:传统机械锁通…...
![](https://www.ngui.cc/images/no-images.jpg)
ffmpeg 获取视频时长的命令及其输出
要获取视频的时长,可以使用FFmpeg的-i参数,后跟视频文件的路径。下面是获取视频时长的命令示例: ffmpeg -i input.mp4输出示例: Input #0, mov,mp4,m4a,3gp,3g2,mj2, from input.mp4:Metadata:major_brand : mp42minor_vers…...
![](https://img-blog.csdnimg.cn/direct/92f52ae061e24f4a9c4038277c813ca6.png)
茗鹤 | 如何借助APS高级计划排程系统提高汽车整车制造的效率
在我们做了详尽的市场调研及头部汽车制造企业排程需求沟通后,我们发现尽管企业有很多的业务系统做支撑,在计划排程领域,所有的汽车制造总装厂仍旧使用人工“Excel”做排产规划,其中少部分也会借助MRP、第三方辅助排产工具。鉴于我…...
![](https://img-blog.csdnimg.cn/direct/838b9f20f01c41a5a2bdb67e1dd823f7.png)
机器学习(三)
机器学习 4.回归和聚类算法4.1 线性回归4.1.1 线性回归的原理4.1.2 线性回归的损失和优化原理 4.2 欠拟合与过拟合4.2.1 定义4.2.2 原因以及解决方法4.2.3 正则化 4.3 线性回归改进-岭回归4.3.1 带L2正则化的线性回归-岭回归4.3.2 API 4.4 分类算法-逻辑回归与二分类4.4.1 定义…...
![](https://www.ngui.cc/images/no-images.jpg)
岚图借势东风整合产能,全新SUV上市就要交付!
,岚图旗下的全新纯电SUV将在东风日产云峰工厂生产。该工厂此前主要生产纯电动车型Ariya。据了解,岚图这款纯电SUV车型定位家用,将搭载109kWh高能量密度电池包,最大续航里程901km。根据此前工信部披露的产品公告,这款新车或命名为岚图知音。此次,东风日产给岚图新车“代工…...
![](https://www.ngui.cc/images/no-images.jpg)
入境游复苏拉动旅游消费,免税、餐饮、酒店等行业迎来利好
随着疫情防控常态化,中国入境旅游市场正逐步回暖,跨境游消费呈现复苏态势。有分析预测,入境游景气复苏将与消费内生增长动力恢复形成合力,对服务消费相关的多业态产生正向辐射效应。免税、餐饮、酒店作为旅游消费三大支柱行业,有望受益于入境游复苏带来的红利。免税行业迎…...
![](https://www.ngui.cc/images/no-images.jpg)
新车凯美瑞买什么配置性价比最高,全新第九代:B级车市场新标杆
全新凯美瑞买什么配置性价比最高**广汽丰田第九代凯美瑞:B级车市场的璀璨明星**3月30日,广汽丰田第九代凯美瑞震撼上市,以其卓越的智能电混技术、智能座舱、智驾安全及无与伦比的驾乘质感,重新定义了中高级轿车市场的标杆。这款车型不仅价格亲民,介于17.18万元至20.68万元之…...
![](https://img-blog.csdnimg.cn/img_convert/0b1ee40fa1836028a9388a399a602a4f.webp?x-oss-process=image/format,png)
非量表题如何进行信效度分析
效度是指设计的题确实在测量某个东西,一般问卷中使用到。如果是量表类的数据,其一般是用因子分析这种方法去验证效度水平,其可通过因子分析探究各测量量表的内部结构情况,分析因子分析得到的内部结构与自己预期的内部结构进行对比…...
![](https://img-blog.csdnimg.cn/direct/30f0ad7f0e4e43c388fba07027cfc845.png)
【busybox记录】【shell指令】unlink
目录 内容来源: 【GUN】【unlink】指令介绍 【busybox】【unlink】指令介绍 【linux】【unlink】指令介绍 使用示例: 删除文件 - 默认 常用组合指令: 指令不常用/组合用法还需继续挖掘: 内容来源: GUN &#x…...
![](https://img-blog.csdnimg.cn/direct/8f66698579a64df1b08ae3276277d3da.png)
TH方程学习(1)
一、背景介绍 根据CW方程的学习,CW方程的限制条件为圆轨道,不考虑摄动,二者距离相对较小。TH方程则可以将物体间的相对运动推广到椭圆轨道的二体运动模型,本部分将结合STK的仿真功能,联合考察TH方程的有用性ÿ…...