当前位置: 首页 > news >正文

(十四)C++自制植物大战僵尸游戏windows平台视频播放实现

植物大战僵尸游戏开发教程专栏地址icon-default.png?t=N7T8http://t.csdnimg.cn/8UFMs


VLC库

在Cocos2d-x游戏开发框架中,没有实现windows平台视频播放的功能,需要自定义实现。在本项目中使用vlc库实现windows平台的视频播放功能。

vlc官网:网址

下载完成后,找到所下载文件的sdk目录 ,里面有实现视频播放的库文件。将头文件和库文件配置到项目中,然后使用其播放视频。


代码文件位置 

代码文件的位置在Class\Based文件夹中。


VideoPlayer.h 

在实现的头文件中引入vlc库的头文件。

#include "Based/vlc/vlc.h"

将用到的库文件进行声明。 

#pragma comment (lib, "libvlc.lib")
#pragma comment (lib, "libvlccore.lib")

定义VideoPlayer类实现视频播放,继承Sprite。

class VideoPlayer : public Sprite
{
public:~VideoPlayer();static VideoPlayer* instance(void);bool init(void);void play(const char* path);void play();void stop(void);void pause(void);void draw(Renderer* renderer, const Mat4& transform, uint32_t flags);void changeVideoState();void setPrecent(const float precent);float getPrecent();void setVolume(int volume);int getVolume() const;void setVideoTime(const libvlc_time_t time);libvlc_time_t getVideoTime() const;protected:VideoPlayer();private:libvlc_instance_t* vlc;libvlc_media_player_t* vlc_player;libvlc_media_list_player_t* vlc_list_player;libvlc_media_list_t* vlc_list;libvlc_media_t* vlc_media;libvlc_time_t video_length;unsigned int width;unsigned int height;static VideoPlayer* _instance;
};

以下是VideoPlayer类的成员函数和成员变量:

  • 成员函数:

    • 析构函数 ~VideoPlayer():用于销毁VideoPlayer对象。
    • 静态成员函数 instance():返回VideoPlayer类的单例对象。
    • init():初始化视频播放器。
    • play(const char* path):播放指定路径的视频。
    • play():播放当前视频。
    • stop():停止视频播放。
    • pause():暂停视频播放。
    • draw(Renderer* renderer, const Mat4& transform, uint32_t flags):绘制函数,用于渲染视频画面。
    • changeVideoState():改变视频状态。
    • setPrecent(const float precent):设置视频播放进度。
    • getPrecent():获取当前视频播放进度。
    • setVolume(int volume):设置音量大小。
    • getVolume() const:获取当前音量大小。
    • setVideoTime(const libvlc_time_t time):设置视频播放时间。
    • getVideoTime() const:获取当前视频播放时间。
  • 成员变量:

    • vlc:libvlc实例。
    • vlc_player:libvlc媒体播放器。
    • vlc_list_player:libvlc媒体列表播放器。
    • vlc_list:libvlc媒体列表。
    • vlc_media:libvlc媒体。
    • video_length:视频长度。
    • width:视频宽度。
    • height:视频高度。
    • 静态成员变量 _instanceVideoPlayer类的单例对象。

VideoPlayer.cpp 

构造函数

VideoPlayer::VideoPlayer() :vlc(0), vlc_player(0), video_length(-1)
{init();
}

在构造函数中,初始化了VideoPlayer类的成员变量。具体来说:

  • vlcvlc_playervideo_length被初始化为0或-1。

  • 调用init()函数进行初始化。

构造函数的主要目的是设置初始状态和准备视频播放器的环境。由于构造函数调用了init()函数,在init()函数中进行了与视频播放器相关的初始化操作。


析构函数 

VideoPlayer::~VideoPlayer()
{CCSprite::~CCSprite();free(videobuf);libvlc_media_player_stop(vlc_player);libvlc_media_player_release(vlc_player);libvlc_release(vlc);
}

析构函数用于在对象销毁时执行清理操作。具体来说:

  • 调用基类CCSprite的析构函数CCSprite::~CCSprite(),以释放基类的资源。

  • 使用free()函数释放videobuf的内存。

  • 调用libvlc_media_player_stop()函数停止视频播放。

  • 调用libvlc_media_player_release()函数释放视频播放器相关的资源。

  • 调用libvlc_release()函数释放libvlc实例的资源。

这些操作用于确保在销毁VideoPlayer对象时,相关的资源得到正确释放,避免内存泄漏和资源泄漏。


instance函数

VideoPlayer* VideoPlayer::instance()
{if (_instance == nullptr)_instance = new VideoPlayer();return _instance;
}

这个函数实现了单例模式,用于获取VideoPlayer类的唯一实例。

  • 首先,它检查静态成员变量_instance是否为空指针。
  • 如果_instance为空指针,则创建一个新的VideoPlayer对象,并将其赋值给_instance
  • 最后,返回_instance指针。

这样,每次调用instance()函数时,只会返回同一个VideoPlayer对象的指针,确保只有一个VideoPlayer实例存在。


init函数 

bool VideoPlayer::init(void)
{vlc = libvlc_new(0, nullptr);vlc_player = libvlc_media_player_new(vlc);Size size = Director::getInstance()->getWinSize();width = size.width;height = size.height;videobuf = (char*)malloc((width * height) << 2);memset(videobuf, 0, (width * height) << 2);libvlc_video_set_callbacks(vlc_player, lock, unlock, display, nullptr);libvlc_video_set_format(vlc_player, "RGBA", width, height, width << 2);Texture2D* texture = new Texture2D();texture->initWithData(videobuf, sizeof(videobuf), Texture2D::PixelFormat::RGBA8888, width, height, size);return initWithTexture(texture);
}

该函数用于初始化视频播放器。具体来说:

  • 调用libvlc_new()函数创建一个新的libvlc实例,并将其赋值给成员变量vlc

  • 使用libvlc_media_player_new()函数创建一个新的libvlc_media_player,并将其赋值给成员变量vlc_player

  • 获取窗口的大小,并将宽度和高度存储在成员变量widthheight中。

  • 使用malloc()函数分配内存给videobuf,大小为(width * height) << 2字节(即每个像素占4字节)。

  • 使用memset()函数将videobuf的内存清零。

  • 使用libvlc_video_set_callbacks()函数设置视频回调函数lockunlockdisplay,以及传递nullptr作为用户数据。

  • 使用libvlc_video_set_format()函数设置视频格式为RGBA,宽度和高度为widthheight,行字节数为width << 2

  • 使用Texture2D类创建一个新的纹理对象texture,并使用initWithData()函数初始化纹理数据,包括videobuf的数据、像素格式为RGBA8888、宽度和高度为widthheight

  • 最后,调用基类initWithTexture()函数初始化VideoPlayer对象的纹理,并返回初始化结果。

该函数的作用是设置视频播放器的初始化状态,包括创建libvlc实例、创建libvlc_media_player、设置视频回调函数、设置视频格式,并初始化纹理对象。


play(path)函数 

void VideoPlayer::play(const char* path)
{vlc_list = libvlc_media_list_new(vlc);vlc_media = libvlc_media_new_path(vlc, path);libvlc_media_list_add_media(vlc_list, vlc_media);vlc_list_player = libvlc_media_list_player_new(vlc);libvlc_media_list_player_set_media_list(vlc_list_player, vlc_list);libvlc_media_list_player_set_media_player(vlc_list_player, vlc_player);libvlc_media_list_player_set_playback_mode(vlc_list_player, libvlc_playback_mode_loop);libvlc_media_list_player_play(vlc_list_player);
}

该函数用于播放指定路径的视频。具体来说:

  • 使用libvlc_media_list_new()函数创建一个新的libvlc_media_list对象,并将其赋值给成员变量vlc_list

  • 使用libvlc_media_new_path()函数根据提供的路径创建一个新的libvlc_media对象,并将其赋值给成员变量vlc_media

  • 使用libvlc_media_list_add_media()函数将vlc_media添加到vlc_list中。

  • 使用libvlc_media_list_player_new()函数创建一个新的libvlc_media_list_player对象,并将其赋值给成员变量vlc_list_player

  • 使用libvlc_media_list_player_set_media_list()函数将vlc_list设置为vlc_list_player的媒体列表。

  • 使用libvlc_media_list_player_set_media_player()函数将vlc_player设置为vlc_list_player的媒体播放器。

  • 使用libvlc_media_list_player_set_playback_mode()函数设置vlc_list_player的播放模式为循环播放模式。

  • 使用libvlc_media_list_player_play()函数开始播放vlc_list_player中的媒体。

该函数的作用是设置视频播放器的相关参数,并开始播放指定路径的视频。它使用了libvlc库中的函数来实现视频播放的功能。


play()、stop()、pause()函数

void VideoPlayer::play()
{libvlc_media_player_play(vlc_player);
}void VideoPlayer::stop(void)
{libvlc_media_player_stop(vlc_player);
}void VideoPlayer::pause(void)
{libvlc_media_player_pause(vlc_player);
}

这些函数用于控制视频播放的操作。具体来说:

  • play()函数调用libvlc_media_player_play()函数,开始播放当前视频。

  • stop()函数调用libvlc_media_player_stop()函数,停止当前视频的播放。

  • pause()函数调用libvlc_media_player_pause()函数,暂停当前视频的播放。

这些函数使用libvlc库中的函数来控制视频播放器的播放、停止和暂停操作。


draw函数 

void VideoPlayer::draw(Renderer* renderer, const Mat4& transform, uint32_t flags)
{CC_PROFILER_START_CATEGORY(kCCProfilerCategorySprite, "CCSprite - draw");CC_NODE_DRAW_SETUP();GL::blendFunc(_blendFunc.src, _blendFunc.dst);if (_texture != NULL){GL::bindTexture2D(_texture->getName());glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, (uint8_t*)videobuf);}else{GL::bindTexture2D(static_cast<GLuint>(0));}//// Attributes//GL::enableVertexAttribs(GL::VERTEX_ATTRIB_FLAG_POS_COLOR_TEX);#define kQuadSize sizeof(_quad.bl)long offset = (long)&_quad;// vertexint diff = offsetof(ccV3F_C4B_T2F, vertices);glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 3, GL_FLOAT, GL_FALSE, kQuadSize, (void*)(offset + diff));// texCoodsdiff = offsetof(ccV3F_C4B_T2F, texCoords);glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_TEX_COORD, 2, GL_FLOAT, GL_FALSE, kQuadSize, (void*)(offset + diff));// colordiff = offsetof(ccV3F_C4B_T2F, colors);glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, kQuadSize, (void*)(offset + diff));glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);CHECK_GL_ERROR_DEBUG();CC_INCREMENT_GL_DRAWS(1);CC_PROFILER_STOP_CATEGORY(kCCProfilerCategorySprite, "CCSprite - draw");
}

该函数用于绘制视频帧。具体来说:

  • 使用CC_PROFILER_START_CATEGORY()函数开始性能分析。

  • 使用CC_NODE_DRAW_SETUP()函数设置绘制环境。

  • 使用GL::blendFunc()函数设置混合函数。

  • 如果纹理_texture不为空,则绑定纹理并使用glTexImage2D()函数将视频帧数据写入纹理。

  • 如果纹理_texture为空,则绑定一个空的纹理。

  • 使用GL::enableVertexAttribs()函数启用顶点属性。

  • 计算顶点属性的偏移量,并使用glVertexAttribPointer()函数设置顶点属性的指针。

  • 使用glDrawArrays()函数绘制四边形。

  • 使用CHECK_GL_ERROR_DEBUG()函数检查OpenGL错误。

  • 使用CC_INCREMENT_GL_DRAWS()函数增加绘制计数。

  • 使用CC_PROFILER_STOP_CATEGORY()函数停止性能分析。

该函数的作用是在OpenGL上下文中绘制视频帧。它使用了OpenGL的函数和引擎中的辅助函数来实现绘制操作。


changeVideoState函数 

void VideoPlayer::changeVideoState()
{switch (libvlc_media_get_state(vlc_media)){case libvlc_state_t::libvlc_Playing: pause(); break;case libvlc_state_t::libvlc_Paused:  play();  break;default: break;}
}

该函数用于切换视频的播放状态。具体来说:

  • 使用libvlc_media_get_state()函数获取当前视频的状态。

  • 根据视频的状态进行切换操作:

    • 如果视频正在播放(libvlc_Playing状态),则调用pause()函数暂停视频。
    • 如果视频已暂停(libvlc_Paused状态),则调用play()函数继续播放视频。
    • 对于其他状态,不执行任何操作。

该函数根据当前视频的状态来切换播放状态,从而实现暂停和继续播放的功能。它使用了libvlc库中的函数和VideoPlayer类中的相应函数来控制视频的播放和暂停。


 setVideoTime、getVideoTime函数

void VideoPlayer::setVideoTime(const libvlc_time_t time)
{libvlc_media_player_set_time(vlc_player, time);
}libvlc_time_t VideoPlayer::getVideoTime() const
{return libvlc_media_player_get_time(vlc_player);
}

这些函数用于设置和获取视频的播放时间。具体来说:

  • setVideoTime()函数调用libvlc_media_player_set_time()函数,将指定的时间time设置为视频播放的时间。

  • getVideoTime()函数调用libvlc_media_player_get_time()函数,返回当前视频的播放时间。

这些函数使用了libvlc库中的函数来设置和获取视频播放器的时间信息。setVideoTime()函数用于设置视频的播放时间,而getVideoTime()函数用于获取当前视频的播放时间。


setPrecent、 getPrecent函数

void VideoPlayer::setPrecent(const float precent)
{video_length < 0 ? video_length = libvlc_media_get_duration(vlc_media) : video_length;libvlc_media_player_set_time(vlc_player, static_cast<libvlc_time_t>(video_length * precent));
}float VideoPlayer::getPrecent()
{auto videoCurrentTime = libvlc_media_player_get_time(vlc_player);video_length < 0 ? video_length = libvlc_media_get_duration(vlc_media) : video_length;if (videoCurrentTime != -1 && video_length != -1){return videoCurrentTime * 1.0f / video_length * 100;}return -1;
}

这些函数用于设置和获取视频的播放进度百分比。具体来说:

  • setPrecent()函数根据当前视频的总时长(video_length)和传入的百分比(precent)计算出对应的时间,然后调用libvlc_media_player_set_time()函数将视频的播放时间设置为计算得到的时间。

  • getPrecent()函数获取当前视频的播放时间(videoCurrentTime)和总时长(video_length),然后根据这两个值计算出播放进度的百分比。如果视频的播放时间和总时长都有效,则返回计算得到的进度百分比;否则返回-1。

这些函数使用了libvlc库中的函数来获取视频的总时长和当前播放时间,并通过计算得到播放进度的百分比。setPrecent()函数用于设置视频的播放进度,而getPrecent()函数用于获取当前的播放进度百分比。


setVolume、getVolume 函数

void VideoPlayer::setVolume(int volume)
{if (volume < 0) volume = 0;if (volume > 100)volume = 100;libvlc_audio_set_volume(vlc_player, volume);
}int VideoPlayer::getVolume() const
{return libvlc_audio_get_volume(vlc_player);
}

这些函数用于设置和获取视频的音量。具体来说:

  • setVolume()函数用于设置视频的音量。它首先对音量进行范围检查,确保音量值在0到100之间。然后,使用libvlc_audio_set_volume()函数将音量设置为指定的值。

  • getVolume()函数用于获取当前视频的音量。它调用libvlc_audio_get_volume()函数来获取当前音量值,并将其返回。

这些函数使用了libvlc库中的函数来设置和获取视频播放器的音量信息。setVolume()函数用于设置视频的音量,而getVolume()函数用于获取当前视频的音量。

相关文章:

(十四)C++自制植物大战僵尸游戏windows平台视频播放实现

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/8UFMs VLC库 在Cocos2d-x游戏开发框架中&#xff0c;没有实现windows平台视频播放的功能&#xff0c;需要自定义实现。在本项目中使用vlc库实现windows平台的视频播放功能。 vlc官网&#xff1a;网址 下载完成后&#x…...

深入理解GCC/G++在CentOS上的应用

文章目录 深入理解GCC/G在CentOS上的应用编译C和C源文件C语言编译C语言编译 编译过程的详解预处理编译汇编链接 链接动态库和静态库静态库和动态库安装静态库 结论 深入理解GCC/G在CentOS上的应用 在前文的基础上&#xff0c;我们已经了解了CentOS的基本特性和如何在其上安装及…...

C语言【复合类型(自定义类型)】

一、结构体 结构体(struct)可以理解为用户自定义的特殊的复合的“数据类型”&#xff1b; 1. 结构体变量的定义和初始化 定义结构体变量的方式&#xff1a; 先声明结构体类型再定义变量名 在声明类型的同时定义变量 // 结构体类型的定义 struct stu {char name[50];int age;…...

【python】初识爬虫

Python爬虫介绍 目录 一、概述二、Python爬虫的基本构成爬虫引擎解析器数据存储三、Python爬虫的主要技术请求与响应URL管理页面解析数据存储四、Python爬虫的应用场景数据采集搜索引擎竞品分析价格监控五、Python爬虫的开发流程六、常用的库...

提高小红书底层逻辑认知+短视频思路打爆笔记+纯带货笔记起号(8节课)

课程内容&#xff1a; 小红书如何0押金开通店铺 .mp4 店铺基础搭建.mp4 小红营的流量从哪里来? 如何用养号发现优质的对标笔记?养号的真正意义是什么?.mp4 什么叫垂类标签? 账号如何打上正确的标签 .mp4 前期笔记是否挂车?不同类型的笔记审核标准是什么?.mp4 如何用…...

力扣:219. 存在重复元素 II

力扣&#xff1a;219. 存在重复元素 II 给你一个整数数组 nums 和一个整数 k &#xff0c;判断数组中是否存在两个 不同的索引 i 和 j &#xff0c;满足 nums[i] nums[j] 且 abs(i - j) < k 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 …...

程序安装 - 笔记

1 程序IOServer,依赖自己开发libs7.so.如何安装程序 要安装依赖于自己开发的 libs7.so 的程序 IOServer,你需要执行以下步骤: 编译 IOServer 程序:确保 IOServer 程序的源代码处于可用状态,并且已经编译成可执行文件。这可能需要执行诸如 make 或者其他编译命令,具体取决…...

文心一言 vs. GPT-4: 全面比较

1. 训练数据和预训练 文心一言 训练数据&#xff1a;文心一言是由中国研究人员开发的中文语言模型。它主要在大量古典中文文学作品上进行训练&#xff0c;包括诗歌、散文和历史文本。这些文学作品涵盖了丰富的中文语言和文化&#xff0c;使得文心一言在传统文化方面具有独特优…...

图书管理系统概述

自友图书馆管理系统解决方案适用于中小学、大中专院校以及企事业单位中小型图书馆的自动化管理需求&#xff0c;其功能覆盖了图书馆自动化集成管理业务流程所包括的所有环节。《图书馆管理系统》首先应该按照我国图书馆行业通用CNMARC格式及《中图法第四版》行业标准开发而成,支…...

中国老铁路增开对国际旅客列车开行

4月13日&#xff0c;中老铁路国际旅客列车开行一周年之际&#xff0c;中老两国铁路部门在中国西双版纳至老挝琅勃拉邦两大著名旅游城市间增开1对国际旅客列车&#xff0c;旅客乘火车可实现两地间当日往返。标题&#xff1a;古道新程——中国老铁路增开国际旅客列车 在这个日新月…...

搭建个人智能家居 4 -WS2812B-RGB灯

搭建个人智能家居 4 - WS2812B-RGB灯 前言说明ESPHomeHomeAssistant 前言 上一篇文章我们已经完成了第一个外设的添加&#xff08;一个LED灯&#xff09;&#xff0c;今天接着来“壮大”这个系统&#xff0c;添加第二个外设“RGB灯”。 环境搭建可以回顾前面的文章。前文回顾&…...

C++类与对象(中)②

目录 1.赋值运算符重载 1.1运算符重载 1.2赋值运算符重载 1.2.1赋值运算符重载格式 1.2.2赋值运算符只能重载成成员函数不能重载成全局函数 1.2.3同拷贝函数一样&#xff0c;如果类是形如日期类这样变量全是内置类型的&#xff0c;赋值运算符就必须自己实现&#xff0c;…...

Qt——xml文件生成DBus接口

1. 如何根据xml文件生成Dbus接口 要使用 XML 文件生成 D-Bus 接口&#xff0c;你可以按照以下步骤操作&#xff1a; 步骤 1: 准备 XML 文件 确保你的 XML 文件遵循 D-Bus 的接口描述规范。这通常包括定义接口、方法、信号和属性。一个基本的例子如下&#xff1a; <!DOCTYPE…...

初识SpringMVC(SpringMVC学习笔记一)

1 、还是熟悉的配方&#xff0c;先创建一个父Maven项目&#xff08;忘记怎么创建项目了就去前面翻笔记&#xff09;&#xff0c;导入通用的配置依赖 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instan…...

FreeRTOS任务管理

1. 任务状态理论讲解 定时器职中断周期此处的1000Hz表示的是没次间隔1毫秒就记一次数&#xff08;在FreeConfig.h&#xff09;文件中进行配置 #define configTICK_RATE_HZ ( ( TickType_t ) 1000 ) 判断是否需要任务切换在FreeRTOS里面每次间隔1毫秒切换一次&#xff08;程序…...

Qwen1.5大语言模型微调实践

在人工智能领域&#xff0c;大语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;的兴起和广泛应用&#xff0c;为自然语言处理&#xff08;NLP&#xff09;带来了前所未有的变革。Qwen1.5大语言模型作为其中的佼佼者&#xff0c;不仅拥有强大的语言生成和理…...

购物车实现

目录 1.购物车常见的实现方式 2.购物车数据结构介绍 3.实例分析 1.controller层 2.service层 1.购物车常见的实现方式 方式一&#xff1a;存储到数据库 性能存在瓶颈方式二&#xff1a;前端本地存储 localstorage在浏览器中存储 key/value 对&#xff0c;没有过期时间。s…...

HTML5漫画风格个人介绍源码

源码介绍 HTML5漫画风格个人介绍源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 效果截图 源码下载 HTML5漫画风格…...

工业数学模型——高炉煤气发生量预测(三)

1、工业场景 冶金过程中生产的各种煤气&#xff0c;例如高炉煤气、焦炉煤气、转炉煤气等。作为重要的副产品和二次能源&#xff0c;保证它们的梯级利用和减少放散是煤气能源平衡调控的一项紧迫任务&#xff0c;准确的预测煤气的发生量是实现煤气系统在线最优调控的前提。 2、…...

pnpm - Failed to resolve loader: cache-loader. You may need to install it.

起因 工作原因需要研究 vue-grid-layout 的源码&#xff0c;于是下载到本地。因为我习惯使用 pnpm&#xff0c;所以直接用 pnpm i 安装依赖&#xff0c;npm run serve 启动失败。折腾了一番没成功。 看到源码里有 yarn.lock&#xff0c;于是重新用 yarn install 安装依赖&…...

CSS transition和animation的用法和区别

Transition和Animation在CSS中都是用于实现元素状态变化的效果&#xff0c;但它们在用法和特性上存在明显的区别。 Transition transition是过度属性&#xff0c;主要强调的是元素状态的过渡效果。 它通常用于在元素的状态发生变化时&#xff0c;平滑地过渡到一个新的状态。…...

书籍推荐(附上每本书的看点)

1、《FPGA深度解析》&#xff0c;这本书的FIFO部分我觉得讲得很好; 2、《verilog数字系统设计教程》&#xff0c;夏宇闻老师的蓝皮书&#xff0c;这本书里包含很多考试知识点; 3、《SOC设计方法和实现》郭炜老师写的&#xff0c;我觉得他的低功耗设计讲得很好; 《高级FPGA设计结…...

LLM理解v1

答疑 什么是知识库&#xff1f; LLM&#xff08;Large Language Models&#xff0c;大型语言模型&#xff09;如GPT系列&#xff0c;通常是基于海量的文本数据进行训练的。它们通过分析和理解这些数据来生成回答、撰写文章、解决问题等。当我们提到LLM的“本地知识库”时&…...

ubuntu 22.04 -- cmake安装

安装方式一&#xff1a;源码安装 1、下载安装包 官网下载&#xff1a;下载链接&#xff1a;Download CMake 也可以使用命令行下载 wget https://github.com/Kitware/CMake/releases/download/v3.26.5/cmake-3.26.5.tar.gz2、解压并安装 # 1、解压 tar -zxvf cmake-3.26.5.…...

字符串算法题(第二十四天)

344. 反转字符串 题目 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须**原地修改输入数组**、使用 O(1) 的额外空间解决这一问题。 示例 1&#xff1a; 输入&#xff1…...

【Linux】应用层协议序列化和反序列化

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;C【智能指针】 前言 在正式代码开始前&#xff0c;会有一些前提知识引入 目录 &#x1f449;&#x1f3fb;序列…...

使用Canal同步MySQL 8到ES中小白配置教程

&#x1f680; 使用Canal同步MySQL 8到ES中小白配置教程 &#x1f680; 文章目录 &#x1f680; 使用Canal同步MySQL 8到ES中小白配置教程 &#x1f680;**摘要****引言****正文**&#x1f4d8; 第1章&#xff1a;初识Canal1.1 Canal概述1.2 工作原理解析 &#x1f4d8; 第2章&…...

关于部署ELK和EFLK的相关知识

文章目录 一、ELK日志分析系统1、ELK简介1.2 ElasticSearch1.3 Logstash1.4 Kibana&#xff08;展示数据可视化界面&#xff09;1.5 Filebeat 2、使用ELK的原因3、完整日志系统的基本特征4、ELK的工作原理 二、部署ELK日志分析系统1、服务器配置2、关闭防火墙3、ELK ElasticSea…...

实验室信息系统源码 saas模式java+.Net Core版开发的云LIS系统全套源码可二次开发有演示

实验室信息系统源码 saas模式java.Net Core版开发的云LIS系统全套源码可二次开发有演示 一、技术框架 技术架构&#xff1a;Asp.NET CORE 3.1 MVC SQLserver Redis等 开发语言&#xff1a;C# 6.0、JavaScript 前端框架&#xff1a;JQuery、EasyUI、Bootstrap 后端框架&am…...

PCB---Design Entry cis 绘图 导出

修改纸张大小&#xff1a; 画图前准备&#xff1a;导入 画图&#xff1a; 习惯&#xff1a; 电源朝上 地朝下 配置pbc_footprint编号&#xff1a; 都配置好编号就可以导出了 导出&#xff1a;...

vue 一键更换主题颜色

这里提供简单的实现步骤&#xff0c;具体看自己怎么加到项目中 我展示的是vue2 vue3同理 在 App.vue 添加 入口处直接修改 #app { // 定义的全局修改颜色变量--themeColor:#008cff; } // 组件某些背景颜色需要跟着一起改变&#xff0c;其他也是同理 /deep/ .ant-btn-primar…...

WebKit内核游览器

WebKit内核游览器 基础概念游览器引擎Chromium 浏览器架构Webkit 资源加载这里就不得不提到http超文本传输协议这个概念了&#xff1a; 游览器多线程HTML 解析总结 基础概念 百度百科介绍 WebKit 是一个开源的浏览器引擎&#xff0c;与之相对应的引擎有Gecko&#xff08;Mozil…...

Qt 拖放功能详解:理论与实践并举的深度指南

拖放&#xff08;Drag and Drop&#xff09;作为一种直观且高效的用户交互方式&#xff0c;在现代图形用户界面中扮演着重要角色。Qt 框架提供了完善的拖放支持&#xff0c;允许开发者在应用程序中轻松实现这一功能。本篇博文将详细阐述Qt拖放机制的工作原理&#xff0c;结合详…...

Springboot+Vue项目-基于Java+MySQL的企业客户管理系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…...

【Linux学习】Linux指令(四)

文章标题 &#x1f680;zip/unzip指令&#xff1a;&#x1f680;tar指令&#xff08;重要&#xff09;&#xff1a;&#x1f680;uname –r指令&#xff1a;&#x1f680;关机指令&#x1f680;几个常用操作 &#x1f680;zip/unzip指令&#xff1a; zip 与 unzip的安装 yum i…...

阿里云服务器 使用Certbot申请免费 HTTPS 证书及自动续期

前言 Certbot是一款免费且开源的自动化安全证书管理工具&#xff0c;由电子前沿基金会&#xff08;EFF&#xff09;开发和维护&#xff0c;是在Linux、Apache和Nginx服务器上配置和管理SSL/TLS证书的一种机制。Certbot可以自动完成域名的认证并安装证书。 一、 安装软件 1.1…...

统一SQL-number/decimal/dec/numeric转换

统一SQL介绍 https://www.light-pg.com/docs/LTSQL/current/index.html 源和目标 源数据库&#xff1a;Oracle 目标数据库&#xff1a;Postgresql&#xff0c;TDSQL-MySQL&#xff0c;达梦8&#xff0c;LightDB-Oracle 操作目标 通过统一SQL&#xff0c;将Oracle中的numb…...

软件测试入门学习笔记

系统测试流程规范 一.研发模型 1.瀑布模型 从可行性研究&#xff08;或系统分析&#xff09;开始&#xff0c;需求 2.增量迭代模型 3.敏捷开发模型 二.质量模型...

31. 下一个排列

题目描述 整数数组的一个排列 就是将其所有成员以序列或线性顺序排列。 例如&#xff0c;arr [1,2,3] &#xff0c;以下这些都可以视作 arr 的排列&#xff1a;[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。 整数数组的下一个排列是指其整数的下一个字典序更大的排列。更正式地&…...

Android笔记: mkdirs不生效失败

Manifest已经配置权限,代码中也动态获取权限,mkdirs一直返回false File.mkdirs()方法创建文件夹失败 1、动态申请读写权限 <!--SDCard写权限--> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!--SDCard读权…...

需要添加的硬币的最小数量(Lc2952)——贪心+构造

给你一个下标从 0 开始的整数数组 coins&#xff0c;表示可用的硬币的面值&#xff0c;以及一个整数 target 。 如果存在某个 coins 的子序列总和为 x&#xff0c;那么整数 x 就是一个 可取得的金额 。 返回需要添加到数组中的 任意面值 硬币的 最小数量 &#xff0c;使范围 …...

军工保密资质介绍及申请要求

军工保密资质介绍 军工保密资质是指国家对从事军工研发、生产、销售等活动的企事业单位进行的一种资质认证。该资质的核心目标是保护国家军事机密和军事技术秘密&#xff0c;确保国家安全和国防利益。军工保密资质的认证标准非常严格&#xff0c;涉及企业的安全管理、技术保密…...

ES6的编程风格

ES6 提出了两个新的声明变量的命令&#xff1a;let和const。其中&#xff0c;let完全可以取代var&#xff0c;因为两者语义相同&#xff0c;而且let没有副作用。 var命令存在变量提升效用&#xff0c;let命令没有这个问题 if (true) {console.log(x); // ReferenceErrorlet x…...

springboot 载入自定义的yml文件转DTO

json解析的pom引入 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-json</artifactId><version>5.8.20</version></dependency>resources目录下的my-data.yml project:data:- name: service-genbase-package:…...

webpack-(plugin,本地服务器,路径别名,安装vue)

安装vue npm i vue-loader -D npm i vue 编写一个vue文件&#xff1a; 在index.html中设置 一个id为app的div 将vue文件挂载到app中 vue比较特殊&#xff0c;除了使用loader外&#xff0c;还使用了plugin const path require("path"); const { VueLoaderPlugin …...

http请求头导致了dial tcp:lookup xxxx on 10.43.0.10:53 no sunch host

事实证明人有的时候也不能太偷懒&#xff0c;太偷懒容易给自己埋坑。 问题的背景&#xff1a; web端调用服务A&#xff0c;服务A异步调用服务B。服务A有四个场景需要调用服务B&#xff0c;所以&#xff0c;服务A中封装了一个公用的方法&#xff0c;唯一的区别是&#xff0c;场…...

想要设计放大电路,必须掌握哪些?

放大电路是电子系统中的核心组成部分&#xff0c;其设计好坏将直接影响到整个系统的性能&#xff0c;对电子工程师来说&#xff0c;在设计放大电路时&#xff0c;必须掌握且关注多方面&#xff0c;以此确保电路的稳定性和放大效果&#xff0c;那么需要注意哪些&#xff1f; 1、…...

每天五分钟计算机视觉:基于卷积操作完成滑动窗口的图片分类?

本文重点 我们前面学习了使用不同大小的滑动窗口来滑动图片,然后切分成许多小的图片,然后依次应用到我们已经训练好的图像分类模型中,但是这种方式效率太低了,本节课程我们学习一种新的方式,来看一下如何并行识别这些剪切的图片。 原始结构 首先我们先来看一下,如何把…...

UI设计/交互设计/视觉设计项目汇报/作品集Figma/PPT模板

作为UI设计/交互设计/视觉设计师&#xff0c;创建作品集对于向潜在客户或雇主展示您的技能、创造力和风格至关重要。以下分步指南可帮助您创建令人印象深刻的作品集&#xff1a; 选择您的最佳作品&#xff1a;选择您最强大且最相关的设计项目&#xff0c;将其纳入您的作品集。…...

25、Lua 学习笔记之三(高阶话题)

Lua 学习笔记之三 高阶话题迭代实例代码有关迭代的描述 协作线程实例代码有关协作线程的描述 高阶话题 迭代 实例代码 --迭代 local function enum(array)local index 1return function()local ret array[index]index index 1return retend endlocal function foreach(a…...

记PLSQL链接Oracle数据库

一、环境 Windows环境安装plsql工具 Oracle部署在服务器上面。 由于我之前在本地Windows安装了一个Oracle数据库&#xff0c;结果导致之前已经在连接的PLSQL链接不上。 二、操作 PLSQL工具正常安装&#xff0c;主要就是一些Oracle的一些配置&#xff0c;和oracle客户端。 o…...

自定义类加载器如何避免双亲委派模型

自定义类加载器要避免双亲委派模型&#xff0c;通常意味着你需要直接重写 loadClass 方法而不是仅重写 findClass 方法。loadClass 方法是 Java 类加载机制中实现双亲委派模型的关键部分。 要绕过双亲委派模型&#xff0c;你可以在自定义类加载器的 loadClass 方法中直接调用 …...

skimage图像处理(五)

多数量图像处理&#xff08;批量化处理&#xff09; 多数量图片内读取指定图片 首先导入skimage.io模块并将其简称为io&#xff0c;导入skimage库中的data_dir模块&#xff0c;用于获取示例图像的目录路径 import skimage.io as io from skimage import data_dir 构建…...

ChatGPT 4o 使用案例之一

2024年GPT迎来重大更新&#xff0c;OpenAI发布GPT-4o GPT-4o&#xff08;“o”代表“全能”&#xff09; 它可以接受任意组合的文本、音频和图像作为输入&#xff0c;并生成任意组合的文本、音频和图像输出。它可以在 232 毫秒内响应音频输入&#xff0c;平均为 320 毫秒&…...

Git使用(4):分支管理

一、新建分支 首先选择Git -> Branches... 然后选择 New Branch&#xff0c;输入新分支名称&#xff0c;例如dev。 可以看到右下角显示已经切换到新建的dev分支了。 push到远程仓库&#xff0c;可以看到新添加的分支。 二、切换分支与合并分支 为了演示合并分支&#xff0c…...

Python——IO编程

IO在计算机中指Input/Output&#xff0c;也就是输入和输出。由于程序和运行时数据是在内存中驻留&#xff0c;由CPU这个超快的计算核心来执行&#xff0c;涉及到数据交换的地方&#xff0c;通常是磁盘、网络等&#xff0c;就需要IO接口。 比如你打开浏览器&#xff0c;访问新浪…...