个人学习总结__打开摄像头、播放网络视频的以及ffmpeg推流

前言

最近入手了一款非常便宜的usb摄像头(买回来感觉画质很低,没有描述的4k,不过也够用于学习了),想着利用它来开启流媒体相关技术的学习。第一步便是打开摄像头,从而才能够对它进行一系列后续操作,诸如实时编解码,推流摄像头采集的数据等等。

本篇文章记录了如何通过QT、libvlc、ffmpeg三种方式来调用usb摄像头,顺带讲述了如何播放http网络视频流。以及如何搭建一个srs流媒体服务器。如代码有逻辑错误或者可优化,欢迎大家指正!希望和大家共同进步。

VS2022 + QT 调用usb摄像头

vs2022如果还没配置QT可参考博客: https://blog.csdn.net/H0893_888/article/details/129772600

第一步: vs2022新建一个Qt Widgets Application
在这里插入图片描述

第二步: 填写项目名称和项目位置,大家随意

第三步: qt向导中进行如下勾选(这里没选全,后续也可再更改)
在这里插入图片描述

主要代码

void Qt_Camera::openCamera(void)
{//获取可用摄像头列表信息QList<QCameraInfo> cameras = QCameraInfo::availableCameras();for(auto camera: cameras){qDebug() << camera;}/* 创建摄像头对象* QCamera *camera = new QCamera;* 这里使用QCameraInfo::availableCameras().at(1)是因为0为电脑自带的摄像头,1为usb摄像头*/QCamera *camera = new QCamera(QCameraInfo::availableCameras().at(1));// 创建摄像头取景器对象QCameraViewfinder *finder = new QCameraViewfinder;// 设置取景器为摄像头的视图camera->setViewfinder(finder);camera->setCaptureMode(QCamera::CaptureVideo);//创建图像捕获对象QCameraImageCapture *imageCapture = new QCameraImageCapture(camera);//设置图片保存路径imageCapture->setCaptureDestination(QCameraImageCapture::CaptureToFile);// 创建布局管理器QVBoxLayout *layout = new QVBoxLayout;layout->addWidget(finder);// 创建拍照按钮QPushButton *captureButton = new QPushButton("Capture");layout->addWidget(captureButton);//信号与槽连接connect(imageCapture, &QCameraImageCapture::imageCaptured, this, &MainWindow::takePhoto);// 连接拍照按钮的点击事件到图像捕获对象的拍照槽函数connect(captureButton, &QPushButton::clicked, [=](){imageCapture->capture();});// 创建主窗口QWidget *window = new QWidget;window->setLayout(layout);window->show();// 启动摄像头camera->start();
}/* 这里的 id 和 image 参数 由 QCameraImageCapture::imageCaptured 这个信号传递过来 */
void Qt_Camera::takePhoto(int id, const QImage &image)
{//使用系统时间来命名图片的名称,时间是唯一的,图片名也是唯一的QDateTime dateTime(QDateTime::currentDateTime());QString time = dateTime.toString("yyyy-MM-dd-hh-mm-ss");//创建图片保存路径名QString filename = QString("D:/%1.jpg").arg(time);//保存一帧数据image.save(filename);//提示获取到了一帧数据QMessageBox::information(this, "提示:", "获取到一帧图片");
}

效果图
在这里插入图片描述

VS2022 + libvlc 调用usb摄像头/网络视频/本地视频

libvlc官网下载: https://download.videolan.org/pub/videolan/vlc/ (32/64位自选)

第一步: 创建空项目
在这里插入图片描述

第二步: 填写项目名称/路径,大家随意

第三步: 新建一个main.cpp

第四步: 拷贝libvlc至项目路径下
在这里插入图片描述

第五步: 拷贝libvlc下的所有内容至项目路径下(plugins、libvlc.dll、libvlccore.dll)
注意: 如果忘记拷贝 plugins 文件夹,无法通过 libvlc_new 得到 libvlc_instance_t* 类型的一个实例。

第六步: 获取usb摄像头名称,libvlc中需要先获得usb摄像头的名称

  • 1 打开电脑中计算机管理
  • 2 点击设备管理器
  • 3 点击照相机,下方即为电脑摄像头设备名称

在这里插入图片描述

main.cpp代码(这里使用C++代码,相对清爽一些)

#include <iostream>#include "vlc/vlc.h"using namespace std;void setMedia(const char* url)
{//判断url是否为空if (!url){cout << "url is nullptr!" << endl;return;}libvlc_instance_t* vlcInstance = libvlc_new(0, nullptr);//判断vlc实例是否为空if (!vlcInstance){cout << "vlcInstance is nullptr!" << endl;return;}//创建媒体//libvlc_media_t *vlcMedia= libvlc_media_new_path(vlcInstance,url); //播放本地视频文件//libvlc_media_t* vlcMedia = libvlc_media_new_location(vlcInstance, "http://sovv.qianpailive.com/a455359ee41b684baaf0e4a094ee34c4/1714302042/b740/20240427/e5eba6250b87047662500bd5a3356465?a=ylu7kvm4yc47&t=1714302042023730569&u=el2KNaf9FEzbwLuS6FKdUaqObdUwp2i5Q7qqeWI3&vid=Vjkz13DanVMG"); //播放网络视频文件libvlc_media_t* vlcMedia = libvlc_media_new_location(vlcInstance, "dshow://DV20 USB CAMERA");   //打开usb摄像头if (!vlcMedia){cout << "vlcMedia is nullptr!" << endl;return;}//创建媒体播放器libvlc_media_player_t* vlcMediaPlayer = libvlc_media_player_new_from_media(vlcMedia);if (!vlcMediaPlayer){cout << "vlcMediaPlayer is nullptr!" << endl;return;}libvlc_media_player_play(vlcMediaPlayer);getchar();//释放媒体播放器if (vlcMediaPlayer){libvlc_media_player_release(vlcMediaPlayer);}//释放媒体if (vlcMedia){libvlc_media_release(vlcMedia);}//释放vlc实例if (vlcInstance){libvlc_release(vlcInstance);}}int main(void)
{setMedia("D:\\3.flv");    //传递播放媒体urlcout << "hello vlc" << endl;getchar();return 0;
}

效果图:

  • 本地视频
    在这里插入图片描述

  • 网络视频
    在这里插入图片描述

  • 摄像头采集一帧画面(感觉不是很清晰)
    在这里插入图片描述

VS2022 + ffmpeg + sdl 摄像头采集数据

不了解 ffmpeg 和 sdl 可参考我的上一篇博客: https://blog.csdn.net/m0_73431159/article/details/138195924

由于上一篇已经讲过 ffmpeg + sdl 在 vs2022 中的环境配置,这里就不再赘述了。
ffmpeg可以直接用命令行查看摄像头设备名
可先使用chcp 65001 临时改变 cmd 窗口编码格式为 utf-8

ffmpeg -list_devices true -f dshow -i dummy

在这里插入图片描述

代码

#pragma warning(disable:4996)#include <stdio.h>extern "C"  // ffmpeg有C语言编写,这里为cpp文件
{
#include "libavformat/avformat.h"
#include "libavcodec/avcodec.h"
#include "libswscale/swscale.h"
#include "libavdevice/avdevice.h"
#include "SDL/SDL.h"
#include "SDL/SDL_thread.h"
}#undef main   // sdl中已有main的相关定义#define REFRESH_EVENT  (SDL_USEREVENT + 1)  // 自定义事件int thread_exit = 0;    //线程循环状态变量int refresh_thread(void* opaque)
{while (thread_exit == 0) {SDL_Event event;event.type = REFRESH_EVENT; // 将事件类型定为REFRESH_EVENTSDL_PushEvent(&event);  // 送入事件队列中SDL_Delay(40);   // 如果是打开摄像头,可注释该行。如果是播放视频,该行表示每秒25帧}return 0;
}**加粗样式**int main(void)
{//-----------ffmpeg------------AVFormatContext* pFormatContext = NULL;     //封装格式上下文AVDictionary* opts = NULL;  // 字典const char* url = "http://sovv.qianpailive.com/6ddf66db8dc4449123e9f93259db899b/1714201703/cf05/20231002/c36e0216c67cdfb009dcd1467ac4075f?a=ylu7kvm4yc47&t=1714201703527245094&u=lEqwQq9pxNSGX4uxOLgaVBmDh9FrvJwoKTdAX6t2&vid=8jLl7AGQLxjA";    //网络视频地址int videoIndex = -1;    //视频流索引号int i = 0;  // 循环变量AVCodecContext* pCodecContext = NULL;   // 编解码上下文AVCodec* pCodec = NULL;     // 编解码器AVPacket* packet = NULL;    // 解码前一帧视频数据AVFrame* pFrame = NULL;     // 解码后一帧数据AVFrame* pFrameYUV = NULL;  // 裁剪后一帧数据struct SwsContext* img_convert_ctx = NULL;  //像素格式转换等//-------------SDL-------------SDL_Surface* screen;    //画布int screen_w = 0, screen_h = 0;SDL_Overlay* bmp;   //涂层叠层SDL_Rect rect;  //绘图区域int ret, got_picture;   SDL_Thread* video_tid;  //线程SDL_Event event;    //事件av_register_all();  // 注册所有组件avformat_network_init();    //网络初始化avdevice_register_all();    //注册所有设备#if 0   //如果想要播放网络流视频,将其置 1j/*  加上一些限制条件 */av_dict_set(&opts, "http_transport", "tcp", 0);av_dict_set(&opts, "max_delay", "500", 0);pFormatContext = avformat_alloc_context();/*  打开网络视频 */if (avformat_open_input(&pFormatContext, url, NULL, &opts) != 0){printf("Can't open input !\n");return -1;}
#elsepFormatContext = avformat_alloc_context();/* DShow是DirectShow的简称,它是一种用于Windows平台的多媒体框架 */pFormatContext->iformat = av_find_input_format("dshow");// pFormatContext->iformat = av_find_input_format("vfwcap");/*  打开摄像头作为输入 */if (avformat_open_input(&pFormatContext, "video=DV20 USB CAMERA", pFormatContext->iformat, NULL) != 0){printf("Can't open input !\n");return -1;}
#endif/*  获取流信息 */if (avformat_find_stream_info(pFormatContext, NULL) < 0){printf("Couldn't find stream information.\n");return -1;}/* 寻找视频流 */for (int i = 0; i < pFormatContext->nb_streams; i++){if (pFormatContext->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO){videoIndex = i;break;}}/*  判断是否找到视频流 */if (videoIndex == -1){printf("Can't find video stream !\n");return -1;}pCodecContext = pFormatContext->streams[videoIndex]->codec; //获取解码器上下文pCodec = avcodec_find_decoder(pCodecContext->codec_id);     //获取解码器/*  判断是否成功获取解码器  */if (pCodec == NULL) {printf("Can't find decoder !\n");return -1;}/*  打开解码器是否成功 */if (avcodec_open2(pCodecContext, pCodec, NULL) < 0){printf("Can't open decoder !\n");return -1;}/*  分配空间  */packet = (AVPacket*)av_malloc(sizeof(AVPacket));pFrame = avcodec_alloc_frame();pFrameYUV = avcodec_alloc_frame();/*  初始化SDL子系统 */if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)) {printf("Could not initialize SDL - %s\n", SDL_GetError());return -1;}/*  获取宽、高  */screen_w = pCodecContext->width;screen_h = pCodecContext->height;/** SDL_SetVideoMode是一个用于设置SDL窗口的宽、高度、位深度和标志的函数。* @return 返回一个指向SDL_Surface结构的针,该结构表示窗口的表面。*/screen = SDL_SetVideoMode(screen_w, screen_h, 0, 0);if (!screen) {printf("SDL: could not set video mode - exiting:%s\n", SDL_GetError());return -1;}/** SDL_CreateYUVOverlay函数: SDL库中用于创建YUV覆盖的函数。YUV覆盖是一种用于在屏幕上显示视频的数据结构。* SDL_YV12_OVERLAY是SDL库中的一个宏定义,用于创建一个YV12格式的图像叠加层(overlay)。* YV12是一种颜色编码格式,常用于视频图像的处理和显示。* YV12格式将图像的亮度(Y)和色度(UV)分开存储,可以有效地压缩图像数据并提高图像质量。*/bmp = SDL_CreateYUVOverlay(pCodecContext->width, pCodecContext->height, SDL_YV12_OVERLAY, screen);rect.x = 0;rect.y = 0;rect.w = screen_w;rect.h = screen_h;/* 图片格式转换 */img_convert_ctx = sws_getContext(pCodecContext->width, pCodecContext->height, pCodecContext->pix_fmt, pCodecContext->width, pCodecContext->height, PIX_FMT_YUV420P, SWS_BICUBIC, NULL, NULL, NULL);/* 创建一个线程 */video_tid = SDL_CreateThread(refresh_thread, NULL);/* SDL_WM_SetCaption函数是SDL库中的一个函数,用于设置显示窗口的标题和图标 */SDL_WM_SetCaption("MyCameraTest", NULL);while(1){//等待事件到来SDL_WaitEvent(&event);/* 判断事件类型是否为REFRESH_EVENT,是则读帧 */if (event.type == REFRESH_EVENT) {//------------------------------if (av_read_frame(pFormatContext, packet) >= 0) {//判断是否为视频帧if (packet->stream_index == videoIndex) {//解码packetret = avcodec_decode_video2(pCodecContext, pFrame, &got_picture, packet);if (ret < 0) {printf("Decode Error.\n");return -1;}//判断是否获得一帧画面if (got_picture){/* SDL_LockYUVOverlay函数用于锁定YUV覆盖层,以便在其上进行像素操作。 */SDL_LockYUVOverlay(bmp);pFrameYUV->data[0] = bmp->pixels[0];pFrameYUV->data[1] = bmp->pixels[2];pFrameYUV->data[2] = bmp->pixels[1];pFrameYUV->linesize[0] = bmp->pitches[0];pFrameYUV->linesize[1] = bmp->pitches[2];pFrameYUV->linesize[2] = bmp->pitches[1];/** sws_scale是一个图像缩放函数,用于将输入图像缩放到指定的输出尺寸。* c:SwsContext结构体指针,包含了图像缩放的相关参数。* srcSlice:输入图像数据的指针数组,每个指针指向一个输入图像平面。* srcStride:输入图像数据的步长数组,每个步长对应一个输入图像平面。* srcSliceY:输入图像的起始行数。* srcSliceH:输入图像的高度。* dst:输出图像数据的指针数组,每个指针指向一个输出图像平面。* dstStride:输出图像数据的步长数组,每个步长对应一个输出图像平面。*/sws_scale(img_convert_ctx, (const uint8_t* const*)pFrame->data, pFrame->linesize, 0, pCodecContext->height, pFrameYUV->data, pFrameYUV->linesize);/** SDL_UnlockYUVOverlay函数: SDL库中用于解锁YUV叠加层的函数。* 它的作用是解锁一个已经锁定的YUV叠加层,以便可以对其进行修改或者渲染操作。* @param overlay 是一个指向SDL_Overlay结构体的指针,它表示要解锁的YUV叠加层。*/SDL_UnlockYUVOverlay(bmp);/** SDL_DisplayYUVOverlay函数: SDL库中用于显示YUV覆盖层的函数。* @param overlay:指向SDL_Overlay结构的指针,表示要显示的YUV覆盖层。* @param dstrect:指向SDL_Rect结构的指针,表示覆盖层在屏幕上的位置和大小。*/SDL_DisplayYUVOverlay(bmp, &rect);}}//free a packetav_free_packet(packet);}else {//Exit Threadthread_exit = 1;break;}}// 事件类型为退出事件则退出循环else if (event.type == SDL_QUIT){thread_exit = 1;break;}}/* 关闭释放相关资源 */sws_freeContext(img_convert_ctx);SDL_Quit();     av_free(pFrameYUV);avcodec_close(pCodecContext);avformat_close_input(&pFormatContext);return 0;
}

效果图:
在这里插入图片描述

搭建srs流媒体服务器

srs官⽹:https://github.com/ossrs/srs
码云的源速度快:https://gitee.com/winlinvip/srs.oschina.git
github的源速度慢:https://github.com/ossrs/srs.git

第⼀步,获取SRS

git clone https://gitee.com/winlinvip/srs.oschina.git
cd srs.oschina
git checkout -b 5.0 remotes/origin/5.0release
cd trunk

第二步,编译SRS

./configure && make

第三步,编写SRS配置⽂件
将以下内容保存为⽂件,譬如 conf/rtmp.conf ,服务器启动时指定该配置⽂件(srs的conf⽂件夹有该⽂件)。

# conf/rtmp.conf
listen        1935;
max_connections   1000;
vhost __defaultVhost__ {
}

第四步,启动srs

./objs/srs -c conf/rtmp.conf

第五步,启动推流编码器
视频推流

ffmpeg -re -i 3.flv -vcodec copy -acodec copy -f flv -y rtmp://192.168.72.128/live/livestream

摄像头推流

ffmpeg -f dshow -i video=“Integrated Camera” -c:v libx264 -preset ultrafast -tune zerolatency -f flv rtmp://192.168.72.128/live/livestream

这里需要根据每个人的实际情况进行填写,如: 3.flv 需替换成您电脑的视频地址
rtmp后面的地址也得改成实际的服务器地址

第六步,观看RTMP流。

  • 可以使用ffplay rtmp://192.168.72.128/live/livestream
  • 可以使用vlc播放器进行拉流播放

注意:如果是在虚拟机上进行测试,记得关闭虚拟机防火墙

第五步,启动推流编码器
视频推流

ffmpeg -re -i 3.flv -vcodec copy -acodec copy -f flv -y rtmp://192.168.72.128/live/livestream

摄像头推流

ffmpeg -f dshow -i video=“Integrated Camera” -c:v libx264 -preset ultrafast -tune zerolatency -f flv rtmp://192.168.72.128/live/livestream

这里需要根据每个人的实际情况进行填写,如: 3.flv 需替换成您电脑的视频地址
rtmp后面的地址也得改成实际的服务器地址

第六步,观看RTMP流。

  • 可以使用ffplay rtmp://192.168.72.128/live/livestream
  • 可以使用vlc播放器进行拉流播放

注意:如果是在虚拟机上进行测试,记得关闭虚拟机防火墙

systemctl stop firewalld

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

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

相关文章

有趣的 CSS 图标整合技术!sprites精灵图,css贴图定位

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃-大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端工具”&#xff0c;可获取 Web 开发工具合…

vue3.0(三) Vite文件目录结构及SFC语法

文章目录 Vite介绍Vite文件目录结构SFC语法SFC 语法定义bug解决 Vite介绍 为什么使用Vite&#xff1f; 表现 与Vite的ESbuild预绑定使其比使用任何其他JS绑定器都快10到100倍。这是因为它有助于提高页面速度并将CommonJS/UMD模块转换为ESM。 基于Vite文件&#xff0c;“预绑定…

深入理解Linux调试工具eBPF和strace、内存泄漏处理、Kubernetes容器调试以及C++协程的崩溃信息收集

在软件开发领域&#xff0c;无论是初级开发者还是资深工程师&#xff0c;都需要面对复杂的调试工作。本文将介绍几个重要的调试工具和技术&#xff0c;并提供实际调试方法的指导&#xff0c;包括Linux环境下的eBPF和strace&#xff0c;内存泄漏问题的处理&#xff0c;Kubernete…

RocketMq详解:一、RocketMQ 介绍及基本概念

文章目录 前言1.RocketMQ简介2.RocketMQ 特点3.核心特性4.应用场景5.RocketMQ 优势6.RocketMQ 四大核心组件6.1 NameServer1.NameServer作用2.NameServer被设计为无状态的原因3.和NameServer和Zookeeper的区别4.NameServer的高可用保障 6.2 Broker1.Broker部署方式2.高可用与负…

[Algorithm][分治 - 归并排序][排序数组][交易逆序对的总数][计算右侧小于当前元素的个数][翻转对]详细讲解

目录 0.原理讲解1.排序数组1.题目链接2.代码实现 2.交易逆序对的总数1.题目链接2.算法原理详解3.代码实现 3.计算右侧小于当前元素的个数1.题目链接2.算法原理详解3.代码实现 4.翻转对1.题目链接2.算法原理详解3.代码实现 0.原理讲解 归并排序的流程充分的体现了**「分⽽治之」…

利用RunnerGo数据大屏强化测试管理与决策

测试平台中的数据大屏在提供实时监控、统计分析、效率提升、制定策略和促进沟通等方面具有重要的意义。它为测试团队提供更全面、更直观的数据支持&#xff0c;有助于提高测试质量和效率&#xff0c;减少风险&#xff0c;并加强团队协作和沟通。 数据大屏也是RunnerGo的核心特…

用python写单链表

目录 链表的数据结构单链表操作头插入尾插入中间插入 删除查找 总结 链表的数据结构 链表是什么呢&#xff0c;来看下 链表&#xff0c;是一种数据结构。相对于数组而言&#xff0c;是不连续的一块内存空间。不仅如此&#xff0c;而且链表有多种&#xff0c;包括&#xff1a;…

Spring Security OAuth2 统一登录

介绍 Spring Security OAuth2 是一个在 Spring Security 框架基础上构建的 OAuth2 授权服务器和资源服务器的扩展库。它提供了一套功能强大的工具和组件&#xff0c;用于实现 OAuth2 协议中的授权流程、令牌管理和访问控制。 Git地址&#xff1a;yunfeng-boot3-sercurity: Sp…

火力发电厂超低排放标准?

目录&#xff1a; 引言火力发电厂超低排放的背景与意义火力发电厂超低排放环保指标解析环保验收要求超低排放的重要性环保验收的流程与要点超低排放技术措施与应用火力发电厂超低排放的监测与评估环保验收中常见问题及解决方案案例分析&#xff1a;成功实现超低排放的火力发电…

uniapp分包,以及通过uni-simple-router进行分包

先说一下uniapp的直接分包方式&#xff0c;很简单&#xff1a; 配置分包信息 打开manifest.json源码视图&#xff0c;添加 “optimization”:{“subPackages”:true} 开启分包优化 我们在根目录下创建一个pagesA文件夹&#xff0c;用来放置需要分包的页面 然后配置路由 运行到…

Unity3d 学习之按钮绑定事件

创建测试脚本 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;public class myTest : MonoBehaviour {// Start is called before the first frame updatepublic Button _codeBindBtn null;void Start(){if (_codeBi…

020Node.js的FS模块使用fs.mkdir创建目录

Node.js的FS模块使用fs.mkdir创建目录 //fs.mkdir 创建目录 /*path 将创建的目录路径mode 目录权限&#xff08;读写权限&#xff09;&#xff0c;默认777callback 回调&#xff0c;传递异常参数err*/ const fsrequire(fs);fs.mkdir(./css,(err)>{if(err){console.log(err)…

03.Kafka 基本使用

Kafka 提供了一系列脚本用于命令行来操作 kafka。 1 Topic 操作 1.1 创建 Topic 创建一个名为 oldersix-topic 的 topic&#xff0c;副本数设置为3&#xff0c;分区数设置为2&#xff1a; bin/kafka-topics.sh \ --create \ --zookeeper 192.168.31.162:2181 \ --replication…

深度学习之基于多模态融合的商品分类方法研究与实现

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 项目简介&#xff1a;深度学习之基于多模态融合的商品分类方法研究与实现 一、项目背景与目标 随着电子商务的快速…

Polyscope,一款简洁的三维可视化工具!

Polyscope是用于三维数据&#xff08;如meshes、point clouds&#xff09;的可视化工具&#xff0c;通过编程或动态GUI完成&#xff1b;支持C和Python编程&#xff1b;追求“一行代码”为数据提供有用的可视界面展示。 下面来简单介绍Polyscope使用。 Polyscope效果 Point Cl…

【深度学习】【Lora训练1】StabelDiffusion,Lora训练过程,秋叶包,Linux,SDXL Lora训练

文章目录 一、环境搭建指南二、个性化安装流程三、启动应用四、打开web五、开始训练 19.27服务器 一、环境搭建指南 打造一个高效且友好的开发环境&#xff1a; 项目源码获取&#xff1a; 通过以下命令轻松克隆项目及所有子模块至您的Linux系统&#xff1a; git clone --recu…

主观赋权法、客观赋权法、组合赋权法、评价指标体系构建

在科研领域&#xff0c;为了对某个研究主题进行深入的探讨和评估&#xff0c;我们往往需要构建一套科学合理的评价体系&#xff0c;并为其中的各项评价指标赋予相应的权重。比如&#xff0c;在评价一项新技术的性能时&#xff0c;我们可能会考虑其创新性、实用性、成本效益等多…

牛客NC242 单词搜索【中等 递归DFS C++/Java/Go/PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/987f2981769048abaf6180ed63266bb2 思路 递归&#xff1a;以word第一个字符为起点&#xff0c;在矩阵中 递归搜索&#xff0c;检查是否存在完整的word路径&#xff0c; 注意恢复现场&#xff0c;又叫回溯&#…

【LAMMPS学习】八、基础知识(5.1)有限尺寸球形和非球形粒子

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

Gin的中间件执行流程与用法

一、背景 我们在使用Gin框架进行Web开发的时候&#xff0c;基本上都会遇到登录拦截的场景。 例如某些接口必须在登录以后才能访问&#xff0c;根据登录用户的信息以及权限&#xff0c;拿到属于自己的数据, 反之&#xff0c;没登录过则直接拒绝访问。 那么我们怎么做到这些登录…