FFmpeg提取视频参数,以及剪辑视频,拼接视频,合并视频,抽帧等

FFmpeg提取视频参数,以及剪辑视频,拼接视频,合并视频,抽帧等

  • 视频封面图获取
    • 视频

视频封面图获取


#ifndef _BUFFER_CONTAINER_H_
#define _BUFFER_CONTAINER_H_
#include <Memory>template <typename T>
class BufferContainer
{
public:/*** @brief Construct a new Buffer Container object 构造函数赋值拷贝内存** @param t1* @param length*/BufferContainer(){m_buffer = nullptr;m_length = 0;}/*** @brief Construct a new Buffer Container object 构造函数赋值拷贝内存** @param t1* @param length*/BufferContainer(const T &t1, int length){if (t1 && length > 0){m_buffer = new T[length];memset(m_buffer,0,length* sizeof(T));m_length = length;memcpy(m_buffer, &t1, length * sizeof(T));}}void setData(T*pData,int length){if(pData&&m_buffer){delete [] m_buffer;m_buffer=nullptr;}if(length>0&&m_length>0){m_length=0;}m_buffer=new T[length];memset(m_buffer,0,length* sizeof(T));m_length = length;memcpy(m_buffer, pData, length * sizeof(T));}/*** @brief Construct a new Buffer Container object 深拷贝构造函数** @param other*/BufferContainer(const BufferContainer &other){if (other.m_buffer && other.m_length > 0){m_buffer = new T[other.m_length];memset(m_buffer,0,other.m_length* sizeof(T));m_length = other.m_length;memcpy(m_buffer, other.m_buffer, other.m_length * sizeof(T));}}/*** @brief Destroy the Buffer Container object  析构函数**/~BufferContainer(){if (m_buffer){delete[] m_buffer;m_buffer = nullptr;m_length = 0;}}/*** @brief  赋值操作符重载** @param other* @return BufferContainer&*/BufferContainer &operator=(const BufferContainer &other){
//        if (this != other){delete[] m_buffer;m_buffer = nullptr;m_length = 0;if (other.m_buffer){m_buffer = new T[other.m_length];memset(m_buffer,0,other.m_length* sizeof(T));m_length = other.m_length;memcpy(m_buffer, other.m_buffer, sizeof(T) * other.m_length);}}return *this;}/*** @brief 返回数据指针** @return T**/T *data(){return m_buffer;}/*** @brief 返回数据长度** @return int*/int length(){return m_length;}private:T *m_buffer = nullptr;int m_length = 0;
};#endif //_BUFFER_CONTAINER_H_

BufferContainer<unsigned char> VideoEditerBase::thumbnail(const std::string& filePath)
{av_register_all();BufferContainer<unsigned char> result;AVFormatContext* fmtContext = nullptr;if (avformat_open_input(&fmtContext, filePath.c_str(), nullptr, nullptr) < 0) {return result;}if (avformat_find_stream_info(fmtContext, nullptr) < 0) {avformat_close_input(&fmtContext);return result;}int nStreamIndex = -1;AVCodecParameters* codecParameters = nullptr;for (int i = 0; i < fmtContext->nb_streams; i++) {if (fmtContext->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {nStreamIndex = i;codecParameters = fmtContext->streams[i]->codecpar;break;}}if (nStreamIndex == -1) {avformat_close_input(&fmtContext);return result;}AVCodec* codec = avcodec_find_decoder(codecParameters->codec_id);if (!codec) {avformat_close_input(&fmtContext);return result;}AVCodecContext* codecContext = avcodec_alloc_context3(codec);if (!codecContext) {// ���������������ʧ��avformat_close_input(&fmtContext);return result;}if (avcodec_parameters_to_context(codecContext, codecParameters) < 0) {// ���ƽ�����������������������ʧ��avcodec_free_context(&codecContext);avformat_close_input(&fmtContext);return result;}if (avcodec_open2(codecContext, codec, nullptr) < 0) {// �򿪽�����ʧ��avcodec_free_context(&codecContext);avformat_close_input(&fmtContext);return result;}AVPacket packet;av_init_packet(&packet);packet.data = nullptr;packet.size = 0;//    bool getFlag=true;int frameFinished = 0;AVFrame* frame = av_frame_alloc();while (av_read_frame(fmtContext, &packet) >= 0) {if (packet.stream_index != nStreamIndex) {continue;}int ret = avcodec_decode_video2(codecContext, frame, &frameFinished, &packet);if (!frameFinished) {continue;}if (frame) {int ret = avcodec_send_packet(codecContext, &packet);if (ret >= 0) {ret = avcodec_receive_frame(codecContext, frame);if (ret >= 0) {// ����һ֡����Ϊ����ͼ��if (frame->key_frame) {AVFrame* rgbFrame = av_frame_alloc();if (rgbFrame) {rgbFrame->format = AV_PIX_FMT_RGB24;rgbFrame->width = frame->width;rgbFrame->height = frame->height;int bufferSize = av_image_get_buffer_size(AV_PIX_FMT_RGB24, frame->width, frame->height, 1);uint8_t* buffer = new uint8_t[bufferSize];av_image_fill_arrays(rgbFrame->data, rgbFrame->linesize, buffer, AV_PIX_FMT_RGB24, frame->width, frame->height, 1);SwsContext* swsContext = sws_getContext(frame->width, frame->height, codecContext->pix_fmt,frame->width, frame->height, AV_PIX_FMT_RGB24, SWS_BICUBIC, nullptr, nullptr, nullptr);if (swsContext) {sws_scale(swsContext, frame->data, frame->linesize, 0, frame->height, rgbFrame->data, rgbFrame->linesize);sws_freeContext(swsContext);// �������ͼ���ļ�int outputBufferSize = rgbFrame->width * rgbFrame->height * 3;unsigned char* outputBuffer = new unsigned char[outputBufferSize];for (int i = 0; i < rgbFrame->height; i++) {memcpy(outputBuffer + i * rgbFrame->width * 3, rgbFrame->data[0] + i * rgbFrame->linesize[0], rgbFrame->width * 3);}//                                static int index=0;//                                QImage(outputBuffer, rgbFrame->width, rgbFrame->height, QImage::Format_RGB888).copy().save(QString("E:/workspace/build-VideoCodec-Desktop_Qt_5_7_1_MSVC2015_64bit-Debug/debug/%1.jpg").arg(index++));result.setData(outputBuffer, outputBufferSize);if (outputBuffer) {delete[] outputBuffer;outputBuffer = nullptr;}}if (buffer) {delete[] buffer;buffer = nullptr;}av_frame_free(&rgbFrame);}}}}}av_packet_unref(&packet);break;}av_frame_free(&frame);avcodec_free_context(&codecContext);avformat_close_input(&fmtContext);return result;}

视频

#include "videoeditermp4.h"
#include <QDebug>
extern "C" {
#include "libavformat/avformat.h"
#include "libavcodec/avcodec.h"
#include "libavutil/imgutils.h"
#include "libavutil/opt.h"
#include "libswresample/swresample.h"
#include "libswscale/swscale.h"
}
VideoEditerMp4::VideoEditerMp4()
{}
VideoEditerMp4::~VideoEditerMp4() {stop();
}
void VideoEditerMp4::startClip(std::string input, std::string output, int64_t st, int64_t et)
{if(!m_vecInputPaths.empty()){m_vecInputPaths.clear();}//    stop();m_vecInputPaths.push_back(input);m_outputPath = output;m_startTime = st;m_endTime = et;m_pThread = new std::thread(&VideoEditerMp4::runClip, this);m_pThread->detach();
}void VideoEditerMp4::startMerge(std::vector<std::string>inputs, std::string output)
{if (!m_vecInputPaths.empty()) {m_vecInputPaths.clear();}//    stop();m_vecInputPaths=inputs;m_outputPath = output;m_pThread = new std::thread(&VideoEditerMp4::runMerge, this);m_pThread->detach();
}void VideoEditerMp4::runClip()
{stateCallBack(RUNNING);if (m_vecInputPaths.empty() || m_outputPath.empty()) {stateCallBack(FAIL);return;}AVFormatContext* fmtContext = avformat_alloc_context();if (avformat_open_input(&fmtContext,m_vecInputPaths.front().c_str() , nullptr, nullptr) < 0) {//fprintf(stderr, "�޷��򿪵�һ�������ļ�\n");stateCallBack(FAIL);return ;}if (avformat_find_stream_info(fmtContext, nullptr) < 0) {//fprintf(stderr, "�޷��ҵ���һ�������ļ�������Ϣ\n");avformat_close_input(&fmtContext);stateCallBack(FAIL);return ;}int videoStreamIndex = -1;for (int i = 0; i < fmtContext->nb_streams; i++) {if (fmtContext->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {videoStreamIndex = i;break;}}int audioStreamIndex = -1;for (int i = 0; i < fmtContext->nb_streams; i++) {if (fmtContext->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {audioStreamIndex = i;break;}}AVFormatContext* output_format_ctx = nullptr;if (avformat_alloc_output_context2(&output_format_ctx, nullptr, nullptr, m_outputPath.c_str())){avformat_close_input(&fmtContext);stateCallBack(FAIL);return;}// ���������ļ�����for (int i = 0; i < fmtContext->nb_streams; i++) {AVStream* stream = avformat_new_stream(output_format_ctx, nullptr);if (!stream) {avformat_close_input(&fmtContext);avformat_close_input(&output_format_ctx);stateCallBack(FAIL);return;}//        stream->time_base=fmtContext->streams[videoStreamIndex]->time_base;//        stream->duration=(m_endTime-m_startTime);if (avcodec_copy_context(stream->codec, fmtContext->streams[i]->codec)<0) {avformat_close_input(&fmtContext);avformat_close_input(&output_format_ctx);stateCallBack(FAIL);return;}if (avcodec_parameters_copy(stream->codecpar, fmtContext->streams[i]->codecpar) < 0) {avformat_close_input(&fmtContext);avformat_close_input(&output_format_ctx);stateCallBack(FAIL);return;}}// ������ļ�if (!(output_format_ctx->oformat->flags & AVFMT_NOFILE)) {if (avio_open(&output_format_ctx->pb, m_outputPath.c_str(), AVIO_FLAG_WRITE) < 0) {//            fprintf(stderr, "�޷�������ļ�\n");avformat_close_input(&fmtContext);avformat_close_input(&output_format_ctx);stateCallBack(FAIL);return ;}}// д���ļ�ͷif (avformat_write_header(output_format_ctx, nullptr) < 0) {//fprintf(stderr, "�޷�д������ļ�ͷ\n");avformat_close_input(&fmtContext);avformat_close_input(&output_format_ctx);stateCallBack(FAIL);return ;}int64_t videoIndex = 0;int64_t audioIndex = 0;AVRational  timeBase=fmtContext->streams[videoStreamIndex]->time_base;AVPacket packet;while (true){//����Ƿ�ֹͣif (m_bStop) {break;}if (av_read_frame(fmtContext, &packet) < 0) {break;}if (packet.stream_index == audioStreamIndex) {if (packet.pts*av_q2d(timeBase)>= m_startTime && packet.pts*av_q2d(timeBase)<= m_endTime) {if (audioIndex % m_interval == 0) {if(audioIndex==0){packet.pts = av_rescale_q(0, timeBase, output_format_ctx->streams[videoStreamIndex]->time_base);packet.dts = av_rescale_q(0, timeBase,  output_format_ctx->streams[videoStreamIndex]->time_base);}else{packet.pts = av_rescale_q(packet.pts-m_startTime/av_q2d(timeBase), timeBase, output_format_ctx->streams[videoStreamIndex]->time_base);packet.dts = av_rescale_q(packet.dts -m_startTime/av_q2d(timeBase), timeBase,  output_format_ctx->streams[videoStreamIndex]->time_base);}packet.duration = av_rescale_q(packet.duration, timeBase,  output_format_ctx->streams[videoStreamIndex]->time_base);av_write_frame(output_format_ctx, &packet);audioIndex++;continue;av_packet_unref(&packet);}audioIndex++;}}if (packet.stream_index == videoStreamIndex) {if (packet.pts*av_q2d(timeBase)>= m_startTime && packet.pts*av_q2d(timeBase)<= m_endTime) {qDebug()<<"============>sec:"<<packet.pts*av_q2d(timeBase)<<"<==============";if (videoIndex % m_interval == 0) {//                    packet.pts = packet.pts-m_startTime/av_q2d(timeBase);//                    packet.dts = packet.pts;packet.pts = av_rescale_q(packet.pts-m_startTime/av_q2d(timeBase), timeBase, output_format_ctx->streams[videoStreamIndex]->time_base);packet.dts = av_rescale_q(packet.dts -m_startTime/av_q2d(timeBase), timeBase,  output_format_ctx->streams[videoStreamIndex]->time_base);packet.duration = av_rescale_q(packet.duration, timeBase,  output_format_ctx->streams[videoStreamIndex]->time_base);av_write_frame(output_format_ctx, &packet);videoIndex++;av_packet_unref(&packet);continue;}videoIndex++;}}av_packet_unref(&packet);// ����Ƿ���ͣ{std::unique_lock<std::mutex> lock(m_mutex);cv.wait(lock, [this]{if (m_bPaused) {stateCallBack(PAUSE);}return !m_bPaused; });}}// д���ļ�βav_write_trailer(output_format_ctx);// �ر��ļ�avformat_close_input(&fmtContext);avio_close(output_format_ctx->pb);avformat_free_context(output_format_ctx);if (m_bStop) {stateCallBack(STOP);return;}stateCallBack(FINISH);
}void VideoEditerMp4::runMerge()
{stateCallBack(RUNNING);if (m_vecInputPaths.empty() || m_outputPath.empty()) {stateCallBack(FAIL);return;}AVFormatContext* fmtContext = avformat_alloc_context();if (avformat_open_input(&fmtContext,m_vecInputPaths.front().c_str() , nullptr, nullptr) < 0) {//fprintf(stderr, "�޷��򿪵�һ�������ļ�\n");stateCallBack(FAIL);return ;}if (avformat_find_stream_info(fmtContext, nullptr) < 0) {//fprintf(stderr, "�޷��ҵ���һ�������ļ�������Ϣ\n");avformat_close_input(&fmtContext);stateCallBack(FAIL);return ;}int videoStreamIndex = -1;for (int i = 0; i < fmtContext->nb_streams; i++) {if (fmtContext->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {videoStreamIndex = i;break;}}int audioStreamIndex = -1;for (int i = 0; i < fmtContext->nb_streams; i++) {if (fmtContext->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {audioStreamIndex = i;break;}}AVFormatContext* output_format_ctx = nullptr;if (avformat_alloc_output_context2(&output_format_ctx, nullptr, nullptr, m_outputPath.c_str())){avformat_close_input(&fmtContext);stateCallBack(FAIL);return;}// ���������ļ�����for (int i = 0; i < fmtContext->nb_streams; i++) {AVStream* stream = avformat_new_stream(output_format_ctx, nullptr);if (!stream) {avformat_close_input(&fmtContext);avformat_close_input(&output_format_ctx);stateCallBack(FAIL);return;}//        stream->time_base=fmtContext->streams[videoStreamIndex]->time_base;//        stream->duration=(m_endTime-m_startTime);if (avcodec_copy_context(stream->codec, fmtContext->streams[i]->codec)<0) {avformat_close_input(&fmtContext);avformat_close_input(&output_format_ctx);stateCallBack(FAIL);return;}if (avcodec_parameters_copy(stream->codecpar, fmtContext->streams[i]->codecpar) < 0) {avformat_close_input(&fmtContext);avformat_close_input(&output_format_ctx);stateCallBack(FAIL);return;}}// ������ļ�if (!(output_format_ctx->oformat->flags & AVFMT_NOFILE)) {if (avio_open(&output_format_ctx->pb, m_outputPath.c_str(), AVIO_FLAG_WRITE) < 0) {//            fprintf(stderr, "�޷�������ļ�\n");avformat_close_input(&fmtContext);avformat_close_input(&output_format_ctx);stateCallBack(FAIL);return ;}}// д���ļ�ͷif (avformat_write_header(output_format_ctx, nullptr) < 0) {//fprintf(stderr, "�޷�д������ļ�ͷ\n");avformat_close_input(&fmtContext);avformat_close_input(&output_format_ctx);stateCallBack(FAIL);return ;}int64_t videoIndex = 0;int64_t audioIndex = 0;AVRational  timeBase=fmtContext->streams[videoStreamIndex]->time_base;int64_t currentPts=0;AVPacket packet;for(int k=0;k<m_vecInputPaths.size();k++){//����Ƿ�ֹͣif (m_bStop) {break;}avformat_close_input(&fmtContext);if (avformat_open_input(&fmtContext,m_vecInputPaths.at(k).c_str() , nullptr, nullptr) < 0) {//fprintf(stderr, "�޷��򿪵�һ�������ļ�\n");stateCallBack(FAIL);return ;}if (avformat_find_stream_info(fmtContext, nullptr) < 0) {//fprintf(stderr, "�޷��ҵ���һ�������ļ�������Ϣ\n");avformat_close_input(&fmtContext);stateCallBack(FAIL);return ;}int videoStreamIndex = -1;for (int i = 0; i < fmtContext->nb_streams; i++) {if (fmtContext->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {videoStreamIndex = i;break;}}int audioStreamIndex = -1;for (int i = 0; i < fmtContext->nb_streams; i++) {if (fmtContext->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {audioStreamIndex = i;break;}}if(k!=0){currentPts+=(fmtContext->streams[videoStreamIndex]->duration/1000)/av_q2d(timeBase);}while (true){//����Ƿ�ֹͣif (m_bStop) {break;}if (av_read_frame(fmtContext, &packet) < 0) {break;}if (packet.stream_index == audioStreamIndex) {//if (packet.pts*av_q2d(timeBase)>= m_startTime && packet.pts*av_q2d(timeBase)<= m_endTime) {if (audioIndex % m_interval == 0) {if(audioIndex==0){packet.pts = av_rescale_q(0, timeBase, output_format_ctx->streams[videoStreamIndex]->time_base);packet.dts = av_rescale_q(0, timeBase,  output_format_ctx->streams[videoStreamIndex]->time_base);}else{packet.pts = av_rescale_q(packet.pts+currentPts, timeBase, output_format_ctx->streams[videoStreamIndex]->time_base);packet.dts = av_rescale_q(packet.dts+currentPts, timeBase,  output_format_ctx->streams[videoStreamIndex]->time_base);}packet.duration = av_rescale_q(packet.duration, timeBase,  output_format_ctx->streams[videoStreamIndex]->time_base);av_write_frame(output_format_ctx, &packet);audioIndex++;continue;av_packet_unref(&packet);}audioIndex++;//}}if (packet.stream_index == videoStreamIndex) {//if (packet.pts*av_q2d(timeBase)>= m_startTime && packet.pts*av_q2d(timeBase)<= m_endTime) {qDebug()<<"============>sec:"<<packet.pts*av_q2d(timeBase)<<"<==============";if (videoIndex % m_interval == 0) {//                    packet.pts = packet.pts-m_startTime/av_q2d(timeBase);//                    packet.dts = packet.pts;if(videoIndex==0){packet.pts = av_rescale_q(0, timeBase, output_format_ctx->streams[videoStreamIndex]->time_base);packet.dts = av_rescale_q(0, timeBase,  output_format_ctx->streams[videoStreamIndex]->time_base);}else{packet.pts = av_rescale_q(packet.pts+currentPts, timeBase, output_format_ctx->streams[videoStreamIndex]->time_base);packet.dts = av_rescale_q(packet.dts+currentPts, timeBase,  output_format_ctx->streams[videoStreamIndex]->time_base);}packet.duration = av_rescale_q(packet.duration, timeBase,  output_format_ctx->streams[videoStreamIndex]->time_base);av_write_frame(output_format_ctx, &packet);videoIndex++;av_packet_unref(&packet);continue;}videoIndex++;//}}av_packet_unref(&packet);// ����Ƿ���ͣ{std::unique_lock<std::mutex> lock(m_mutex);cv.wait(lock, [this]{if (m_bPaused) {stateCallBack(PAUSE);}return !m_bPaused; });}}}// д���ļ�βav_write_trailer(output_format_ctx);// �ر��ļ�avformat_close_input(&fmtContext);avio_close(output_format_ctx->pb);avformat_free_context(output_format_ctx);if (m_bStop) {stateCallBack(STOP);return;}stateCallBack(FINISH);
}

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

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

相关文章

【力扣】1089.复写零

原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 给你一个长度固定的整数数组 arr &#xff0c;请你将该数组中出现的每个零都复写一遍&#xff0c;并将其余的元素向右平移。 注意&#xff1a;请不…

深度探索Edge浏览器

深度探索Edge浏览器 随着网络技术的不断发展和人们对浏览体验要求的提高&#xff0c;浏览器作为我们日常上网的重要工具&#xff0c;其性能、安全性和易用性都成为了用户关注的重点。近年来&#xff0c;微软推出的Edge浏览器凭借其卓越的性能和独特的功能&#xff0c;逐渐成为…

探讨 vs2019 c++ 里函数指针与函数类型在使用上的语法区别

&#xff08;1&#xff09;咱们可以用 decltype &#xff08;&#xff09; 来判断函数的类型。但以这个类型定义有用的可指向已存在函数的变量&#xff0c;却行不通。测试如下&#xff1a; 如果把上面的注释去掉会报错&#xff1a; 所以函数类型只有语法意义。但在使用上没有函…

【C语言】/*操作符(下)*/

目录 一、操作符的分类 二、二进制和进制转换 2.1 进制 2.2 进制之间的转换 三、原码、反码、补码 四、单目操作符 五、逗号表达式 六、下标引用操作符[] 七、函数调用操作符() 八、结构体成员访问操作符 8.1 直接访问操作符(.) 8.2 间接访问操作符(->) 九、操作符…

openGauss学习笔记-280 openGauss性能调优-实际调优案例09-修改启动参数解决TPCC大幅度波动

文章目录 openGauss学习笔记-280 openGauss性能调优-实际调优案例09-修改启动参数解决TPCC大幅度波动280.1 现象描述280.2 优化分析openGauss学习笔记-280 openGauss性能调优-实际调优案例09-修改启动参数解决TPCC大幅度波动 280.1 现象描述 openGauss数据库在4路鲲鹏服务器单…

修改el-checkbox样式

一定要在最外层&#xff1b; //未选中框/deep/ .el-checkbox__inner{border-color: #0862a3;}//选中框/deep/ .el-checkbox__input.is-checked .el-checkbox__inner{background-color: #0862a3;border-color: #0862a3;}//未选中框时右侧文字/deep/ .el-checkbox__label{}//选中…

git 推送github 选https遇到登录 openSSH问题

使用https需要使用github令牌token作为密码&#xff0c; 使用SSH不需要登录。 还有一个问题&#xff1a; 创建github仓库后没有quick setup页面解决办法 千万不要点击任何多的操作&#xff01;&#xff01;&#xff01;输入仓库名&#xff0c;直接create&#xff01;&#x…

return语句

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 return语句 一、return语句后面跟表达式二、return无返回三、return返回的值和函数返回类型不一致四、return语句执行后,后方仍然存在代码五、存在分支语句&#xff0c;需考虑…

c++二分查找

左闭右闭 left 0; right numsize - 1; while(left<right) {middle (leftright)/2;if(nums[middle]>target){right middle-1;}else if(nums[middle]<target){left middle 1;}else return middle; } return -1; 左闭右开 left 0;right numsize; while(left&l…

去哪里找高清视频素材?推荐几个短视频素材免费网站

在数字时代&#xff0c;视频内容的质量直接影响观众的吸引力和留存率。尤其是高清、4K视频素材和可商用素材&#xff0c;它们在提升视觉质量和叙事深度方面起到了至关重要的作用。以下是一些国内外的顶级视频素材网站&#xff0c;它们提供的资源将为您的创作提供极大的支持和灵…

spring 创建bean的过程

spring 创建bean的过程 生成BeanDefinition – > 合并BeanDefinition --> 创建单例Bean对象(非懒加载) --> 依赖注入(属性赋值) --> 初始化前(PostConstruct)–>初始化(InitializingBean)–>初始化后(AOP)–>bean AbstractAutowireCapableBeanFactory.d…

LeetCode/NowCoder-链表经典算法OJ练习1

目录 说在前面 题目一&#xff1a;移除链表元素 题目二&#xff1a;反转链表 题目三&#xff1a;合并两个有序链表 题目四&#xff1a;链表的中间节点 SUMUP结尾 说在前面 dear朋友们大家好&#xff01;&#x1f496;&#x1f496;&#x1f496;数据结构的学习离不开刷题…

接口测试的流程

1.拿到接口api文档(通过抓包工具获取)&#xff0c;熟悉接口业务&#xff0c;接口地址&#xff0c;鉴权方式&#xff0c;入参码。 2.编写接口用例以及评审, 思路: 正例:输入正常入参&#xff0c;接口能够成功返回数据 反例: 鉴权反例: 鉴权码…

机器人系统仿真

0、何为仿真 通过计算机对实体机器人系统进行模拟的技术。 1、为何仿真 低成本&#xff1a; 机器人实体一般价格昂贵&#xff0c;为降低机器人学习、调试的成本&#xff1b;高效&#xff1a; 搭建的环境更为多样且灵活&#xff0c;可以提高测试效率以及测试覆盖率&#xff1b…

三大消息传递机制区别与联系

目录 总结放开头 1、定义区别&#xff1a; EventBus Broadcast Receiver Notification 2、使用区别: EventBus Broadcast Receiver Notification 3、补充通知渠道&#xff1a; 通知渠道重要程度 总结放开头 BroadCast Receiver:属于安卓全局监听机制&#xff0c;接收…

【算法】最短路问题 bfs 到 dijkstra

1976、到达目的地的方案数 你在一个城市里&#xff0c;城市由 n 个路口组成&#xff0c;路口编号为 0 到 n - 1 &#xff0c;某些路口之间有 双向 道路。输入保证你可以从任意路口出发到达其他任意路口&#xff0c;且任意两个路口之间最多有一条路。 给你一个整数 n 和二维整…

五一 大项目--docker-compose编排lnmp完成wordpress

Docker 中的 Nginx 服务为什么要启用 HTTPS 一安装容器 1 安装docker-20.10.17 2 安装所需的依赖 sudo yum install -y yum-utils device-mapper-persistent-data lvm23 添加Docker官方仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos…

Linux-线程概念

1. 线程概念 线程&#xff1a;轻量级进程&#xff0c;在进程内部执行&#xff0c;是OS调度的基本单位&#xff1b;进程内部线程共用同一个地址空间&#xff0c;同一个页表&#xff0c;以及内存中的代码和数据&#xff0c;这些资源对于线程来说都是共享的资源 进程&#xff1a;…

RabbitMQ (windows) 安装

大家好我是苏麟 , 今天安装一下 RabbitMQ . 官网 : RabbitMQ: One broker to queue them all | RabbitMQ 1.点击 Getting Started 2. 点击 Docs 3.点击 Install And Upgrade 4.点击 installation via Chocolatory 5. 直接下载安装包 RabbitMQ 下好了先放在一遍 RabbitMQ 需要 E…

思科基础命令(对标华为的HCIA知识)

设备的基本模式&#xff08;四种&#xff09; Router> ⽤户模式 可以对设备进⾏简单的查看 Router>enable Router# 特权模式 可以进⾏所有的查看以及简单的配置 r1#configure terminal r1(config)# 全局配置模式&#xff0c;可以对设备进⾏所有的操作 r1(config)#line co…