支持语音与视频即时通讯项目杂记(二)

目录

概念:

视频帧(Video Frame)是组成视频的基本单元。它可以被视为一幅静止的图像,它在一定的时间间隔内连续播放,从而形成了流畅的视频。

Changes to Qt Multimedia

New features in Qt 6

Removed features

Changed features

qt6中的正则表达式校验的应用

概念:

视频帧(Video Frame)是组成视频的基本单元。它可以被视为一幅静止的图像,它在一定的时间间隔内连续播放,从而形成了流畅的视频。

视频帧由像素组成,每个像素代表了图像中的一个点的颜色值。视频帧的大小通常以宽度和高度来描述,例如 1920x1080 表示宽度为 1920 像素,高度为 1080 像素。每个像素的颜色值可以通过不同的图像格式来表示,例如 RGB、YUV 等。

视频帧之间的时间间隔称为帧率(Frame Rate),用于衡量每秒播放的视频帧数。常见的帧率有 24fps、30fps、60fps 等。较高的帧率可以提供更流畅的视频播放效果。

理解帧的概念可以类比为一本动画书,每页都是一个静止画面,当您快速翻动这些画面时,就会产生连续的动画效果。同样地,视频帧也是以相似的方式运作,通过连续播放静止的视频帧,我们感知到了动态的视频内容。

在视频处理和编辑中,您可以对视频帧进行各种操作,如剪辑、特效处理、颜色校正等。通过对视频帧的处理,可以实现视频的编辑、修复和增强等功能。

总结起来,视频帧是组成视频的静止图像,通过连续播放这些图像,我们可以观看到流畅的动态视频内容。

QVideoFrame 是 Qt Multimedia 模块中的一个类,用于表示视频帧的数据。它提供了处理和操作视频帧的功能。

下面是 QVideoFrame 的一些常见用途和作用:

  1. 获取视频帧数据:通过 QVideoFrame,您可以获取视频帧的原始数据,包括像素数据、图像格式、图像大小等。这使得您可以进行视频处理、分析和编辑等操作。

  2. 格式转换:QVideoFrame 提供了方法将视频帧转换为不同的图像格式,以便与您的应用程序或其他模块兼容。您可以使用 QVideoFrame::map() 函数将帧数据映射到一个 QImage 或者 QPixmap 对象中,然后进行格式转换。

  3. 视频播放和显示:QVideoFrame 可以与其他 Qt 组件(如 QImageQLabelQGraphicsView 等)进行集成,实现视频的播放和显示。通过将视频帧数据与相应的图像组件结合使用,您可以在用户界面中实时显示视频。

  4. 视频输入输出:通过 QVideoFrame,您可以处理和传输视频帧数据。例如,您可以将视频帧保存为文件,或者从摄像头或其他视频源接收视频帧。

综上所述,QVideoFrame 类提供了对视频帧的访问和处理功能,使您能够灵活地处理视频数据以满足应用程序的需求。

在Qt项目中,.pri文件是一种特殊的文件类型,称为"包含文件"(Include File),主要用于将共享的构建设置和规则抽象成一个可复用的模块,方便在其他项目中重复使用。.pri文件可以包含编译器选项、头文件路径、库依赖关系以及其他自定义构建规则等信息。

要创建一个.pri文件,您可以按照以下步骤操作:

  1. 打开Qt Creator,并且打开您要将.pri文件添加到的项目。

  2. 在项目视图中,右键单击您想要创建.pri文件的文件夹,选择"新建文件"(New File)。

  3. 在弹出的对话框中,选择"其他"(Other)-> "Pro 文件"(Pro File),然后点击下一步。

  4. 输入文件名并选择保存位置,例如:"myproject.pri",然后点击下一步。

  5. 在下一个对话框中,确认文件属性并且选择添加需要的模块或者库,并且可以在此处定义全局变量、宏定义、编译器选项等设置。然后点击完成来创建文件。

  6. 在您的项目文件(例如.pro文件)中包含该.pri文件:在您的项目文件中加入如下语句:

    include(myproject.pri)
    

这样就可以在您的项目中使用.pri文件中定义的构建规则和设置了。需要注意的是,.pri文件中定义的变量或宏在引入该文件的项目中是全局可见的。因此,如果您有多个.pri文件,建议将它们放在独立文件夹中,以便管理和维护。

官网中说明:

Changes to Qt Multimedia

Qt 6 is a result of the conscious effort to make the framework more efficient and easy to use.

We try to maintain binary and source compatibility for all the public APIs in each release. But some changes were inevitable in an effort to make Qt a better framework.

The module has been refactored significantly and has changed classification, from essential to add-on. The Qt Multimedia module in Qt 6 replaces the Qt Multimedia module from Qt 5.x. Existing code that uses Qt Multimedia from Qt 5 can be ported with limited effort.

New features in Qt 6

There are a number of new features in Qt Multimedia:

  • QMediaCaptureSession class is the central object for media capture.
  • QMediaRecorder class is now a class limited to recording audio and video. It handles encoding of data produced in a capture session.
  • Using QMediaFormat and QMediaRecorder, setting up the desired encoding when recording has changed significantly.
  • You can now also monitor the audio recorded by a capture session.
  • Support for selection of audio, video and subtitle tracks when playing back media files has been added.
  • QAudioDecoder is now supported on all platforms.

Removed features

Removed featureNotes or suggested alternative
Playlist in QMediaPlayerQMediaPlayer does not do any playlist handling anymore in Qt 6.
QMediaPlayListThis class has been removed from the API. It does however still exist as part of the Media Player Example.
QAudioProbe and QVideoProbeThe audio and video probing API has been removed.
QAudioRecorderUse the QMediaCaptureSession or CaptureSession QML type.
Audio QML typeUse MediaPlayer QML type.
QMediaObject and QMediaBindableInterfaceThese classes have been removed in favor of a more direct API for setting up connections between objects using, for example, setVideoOutput and QMediaCaptureSession.
QCameraViewFinderSettingsThis class has been removed. Use QCameraFormat to define the resolution and frame rate the camera should be using.
QMediaContentThe class has been removed. Use QUrl for individual media files instead.
QSoundUse QSoundEffect instead.
QVideoFilterRunnableUse shader effects in QML instead or access the QVideoFrame's content in C++.
Public back-end APIThe back-end API of Qt Multimedia is private in Qt 6. This improves response time for supporting new multimedia use cases. Any classes that contain the words "Control" or "Abstract" in the class name in Qt 5 are now private in Qt 6.
Back-end pluginsQt Multimedia in Qt 6 does not use a plugin infrastructure for its back ends anymore. This means that users no longer need to ship those back ends with their application. Instead, the back end being used is determined at compile time based on the underlying operating system. Qt uses gstreamer on Linux, WMF on Windows, AVFoundation on macOS and iOS and the Android multimedia APIs on Android.

Changed features

A number of classes previously offered in Qt Multimedia have changed in ways that may affect previously written code. The following table highlights these changes.

Changed featureNotes
Handling of Camera resolutions and frame ratesHandling of these has been simplified and a new QCameraFormat class helps with selecting the correct resolution and frame rate for the camera.
Video output handling on the C++ side has changed significantly.QAbstractVideoSurface has been replaced by the QVideoSink class, and generic rendering support has been enhanced to cover all pixel formats supported by Qt Multimedia.
Metadata typesQMediaMetaData has changed significantly: mainly moving from string based to enum based keys, and reducing the set of supported keys to the ones that can be supported on most platforms.
QMediaFormatHandling of formats for encoded media and the settings for the media recorder have changed significantly. Qt 5 provides a string-based API, a separated file format, and audio and video codecs into three classes. However, Qt 6 unifies the formats in the QMediaFormat class. Additional settings are directly specified in QMediaRecorder. Setting up file formats and codecs is now implemented with enums and no longer uses strings. This puts some limitations on the set of codecs that can be used, but helps provide a consistent cross-platform API.
QCameraImageCapture renamed QImageCaptureNone
Audio inputs and outputsQMediaPlayer and QMediaCaptureSession (and the corresponding QML types MediaPlayer and CaptureSession) are not connected to any audio devices by default. Explicitly connect them to a QAudioInput/AudioInput or QAudioOutput/AudioOutput to capture or play back audio.
Capturing videoA capture session is by default not connected to a Camera. Connect it to a QCamera object (Camera item) to be able to capture video or still images.

qt6中的正则表达式校验的应用

项目中,涉及IP地址校验等需求,qt6 正则表达式和qt5有一定差异,见下面的代码

#ifndef CLINEEDIT_H
#define CLINEEDIT_H#include <QLineEdit>
#include <QEvent>class QLabel;class QIPLineEdit : public QLineEdit
{Q_OBJECTpublic:QIPLineEdit(QWidget *parent = 0);~QIPLineEdit();void setText(const QString &strIP);QString text() const;
protected:bool eventFilter(QObject *obj, QEvent *ev);int getIndex(QLineEdit *pEdit);bool isTextValid(const QString &strIP);
private:QLineEdit *m_lineEidt[4];
};/
class QMacLineEdit : public QLineEdit
{Q_OBJECTpublic:QMacLineEdit(QWidget *parent = 0);~QMacLineEdit();void setText(const QString &strMac);QString text() const;
protected:
//    void paintEvent(QPaintEvent *event);bool eventFilter(QObject *obj, QEvent *ev);int getIndex(QLineEdit *pEdit);bool isTextValid(const QString &strIP);
private:QLineEdit *m_lineEidt[6];
};class QIconLineEdit : public QLineEdit {Q_OBJECT
public:QIconLineEdit(QWidget *parent = 0);~QIconLineEdit();void SetIcon(const QPixmap &pixmap);
private:QLabel *labelPixmap;
};#endif // QIPLINEEDIT_H
#include "clineedit.h"
#include "ipvalidator.h"
#include <QLabel>
#include <QRegularExpressionValidator>
#include <QRegularExpression>
#include <QValidator>
#include <QPainter>
#include <QHBoxLayout>
#include <QKeyEvent>
#include <QMessageBox>
#include <QDebug>
#include <QRegularExpression>
#include <QValidator>QIPLineEdit::QIPLineEdit(QWidget *parent): QLineEdit(parent)
{QRegularExpression rx("(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})");//QRegExp rx("(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})");QHBoxLayout *pHBox = new QHBoxLayout(this);pHBox->setSpacing(2);pHBox->setContentsMargins(2, 2, 2, 2);QLabel *labelDot[3];for (int i = 0; i < 4; i++){m_lineEidt[i] = new QLineEdit(this);m_lineEidt[i]->setProperty("ip", true);m_lineEidt[i]->setFrame(false);m_lineEidt[i]->setMaxLength(3);m_lineEidt[i]->setAlignment(Qt::AlignCenter);m_lineEidt[i]->installEventFilter(this);//m_lineEidt[i]->setValidator(new QRegExpValidator(rx, this));m_lineEidt[i]->setValidator(new IPValidator(this));m_lineEidt[i]->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);pHBox->addWidget(m_lineEidt[i]);if (i < 3) {labelDot[i] = new QLabel(this);labelDot[i]->setText(".");labelDot[i]->setFixedWidth(2);pHBox->addWidget(labelDot[i]);}}this->setReadOnly(true);m_lineEidt[0]->setFocus();m_lineEidt[0]->selectAll();
}QIPLineEdit::~QIPLineEdit()
{
}// 获取当前输入框索引
int QIPLineEdit::getIndex(QLineEdit *pEdit)
{int index = -1;for (int i = 0; i < 4; i++){if (pEdit == m_lineEidt[i])index = i;}return index;
}// 事件过滤器,判断按键输入
bool QIPLineEdit::eventFilter(QObject *obj, QEvent *ev)
{if (children().contains(obj) && QEvent::KeyPress == ev->type()){QKeyEvent *keyEvent = dynamic_cast<QKeyEvent *>(ev);QLineEdit *pCurrentEdit = qobject_cast<QLineEdit *>(obj);switch (keyEvent->key()){case Qt::Key_0:case Qt::Key_1:case Qt::Key_2:case Qt::Key_3:case Qt::Key_4:case Qt::Key_5:case Qt::Key_6:case Qt::Key_7:case Qt::Key_8:case Qt::Key_9:{QString strText = pCurrentEdit->text();if (pCurrentEdit->selectedText().length()){pCurrentEdit->text().replace(pCurrentEdit->selectedText(), QChar(keyEvent->key()));}else if (strText.length() <=3 &&strText.toInt() * 10 > 255){int index = getIndex(pCurrentEdit);if (index != -1 && index != 3){m_lineEidt[index + 1]->setFocus();m_lineEidt[index + 1]->selectAll();}}else if (strText.length() == 2 && strText.toInt() * 10 < 255){if (Qt::Key_0 == keyEvent->key() && strText.toInt()){pCurrentEdit->setText(strText.insert(pCurrentEdit->cursorPosition(),QChar(Qt::Key_0)));}}return QLineEdit::eventFilter(obj, ev);}break;case Qt::Key_Backspace:{QString strText = pCurrentEdit->text();if (strText.isEmpty()){int index = getIndex(pCurrentEdit);if (index != -1 && index != 0){m_lineEidt[index - 1]->setFocus();int length = m_lineEidt[index - 1]->text().length();m_lineEidt[index - 1]->setCursorPosition(length ? length : 0);}}return QLineEdit::eventFilter(obj, ev);}case Qt::Key_Left:{if (!pCurrentEdit->cursorPosition()){int index = getIndex(pCurrentEdit);if (index != -1 && index != 0){m_lineEidt[index - 1]->setFocus();int length = m_lineEidt[index - 1]->text().length();m_lineEidt[index - 1]->setCursorPosition(length ? length : 0);}}return QLineEdit::eventFilter(obj, ev);}case Qt::Key_Right:{if (pCurrentEdit->cursorPosition() == pCurrentEdit->text().length()){int index = getIndex(pCurrentEdit);if (index != -1 && index != 3){m_lineEidt[index + 1]->setFocus();m_lineEidt[index + 1]->setCursorPosition(0);}}return QLineEdit::eventFilter(obj, ev);}// 小键盘的“.”号case Qt::Key_Period:{int index = getIndex(pCurrentEdit);if (index != -1 && index != 3){m_lineEidt[index + 1]->setFocus();m_lineEidt[index + 1]->setCursorPosition(0);}return QLineEdit::eventFilter(obj, ev);}break;default:break;}}return false;
}// 设置信息
void QIPLineEdit::setText(const QString &strIP)
{// 是否是IP地址if (!isTextValid(strIP)){QMessageBox::warning(this, "Attention","Your IP Address is Invalid!",QMessageBox::StandardButton::Ok);return;}else{int i = 0;QStringList ipList = strIP.split(".");foreach (QString ip ,ipList){m_lineEidt[i]->setText(ip);i++;}}
}// 判断IP地址
bool QIPLineEdit::isTextValid(const QString &strIP)
{//QRegExp rx2("\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b");QRegularExpression rx2("\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b");QRegularExpressionMatch match = rx2.match(strIP);if (!match.hasMatch()) {return false;}//    if (!rx2.exactMatch(strIP))
//        return false;return true;
}// 获取IP地址
QString QIPLineEdit::text() const
{QString strIP;for (int i = 0; i < 4; i++) {strIP.append(m_lineEidt[i]->text());if (3 != i) {strIP.append(".");}}return strIP;
}QMacLineEdit::QMacLineEdit(QWidget *parent): QLineEdit(parent)
{//QRegExp rx("([0-9A-Fa-f]{2})");QRegularExpression rx("([0-9A-Fa-f]{2})");QHBoxLayout *pHBox = new QHBoxLayout(this);pHBox->setSpacing(2);pHBox->setContentsMargins(2, 2, 2, 2);QLabel *labelDot[5];for (int i = 0; i < 6; i++){m_lineEidt[i] = new QLineEdit(this);m_lineEidt[i]->setFrame(false);m_lineEidt[i]->setMaxLength(2);m_lineEidt[i]->setAlignment(Qt::AlignCenter);m_lineEidt[i]->installEventFilter(this);//m_lineEidt[i]->setValidator(new QRegExpValidator(rx, this));//m_lineEidt[i]->setValidator(new QValidator (0,100,this));QRegularExpressionValidator* validator = new QRegularExpressionValidator(QRegularExpression("(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})"), this);m_lineEidt[i]->setValidator(validator);m_lineEidt[i]->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);pHBox->addWidget(m_lineEidt[i]);if (i < 5) {labelDot[i] = new QLabel(this);labelDot[i]->setText("-");labelDot[i]->setFixedWidth(2);pHBox->addWidget(labelDot[i]);}}this->setReadOnly(true);m_lineEidt[0]->setFocus();m_lineEidt[0]->selectAll();
}QMacLineEdit::~QMacLineEdit()
{
}int QMacLineEdit::getIndex(QLineEdit *pEdit)
{int index = -1;for (int i = 0; i < 6; i++){if (pEdit == m_lineEidt[i])index = i;}return index;
}//
bool QMacLineEdit::eventFilter(QObject *obj, QEvent *ev)
{if (children().contains(obj) && QEvent::KeyPress == ev->type()){QKeyEvent *keyEvent = dynamic_cast<QKeyEvent *>(ev);QLineEdit *pCurrentEdit = qobject_cast<QLineEdit *>(obj);switch (keyEvent->key()){case Qt::Key_0:case Qt::Key_1:case Qt::Key_2:case Qt::Key_3:case Qt::Key_4:case Qt::Key_5:case Qt::Key_6:case Qt::Key_7:case Qt::Key_8:case Qt::Key_9:case Qt::Key_A:case Qt::Key_B:case Qt::Key_C:case Qt::Key_D:case Qt::Key_E:case Qt::Key_F:{QString strText = pCurrentEdit->text();if (pCurrentEdit->selectedText().length()){pCurrentEdit->text().replace(pCurrentEdit->selectedText(),QChar(keyEvent->key()).toUpper());}else if (strText.length() == 2) {int index = getIndex(pCurrentEdit);if (0 <= index  && index < 5){m_lineEidt[index + 1]->setFocus();m_lineEidt[index + 1]->selectAll();}}return QLineEdit::eventFilter(obj, ev);}break;case Qt::Key_Backspace:{QString strText = pCurrentEdit->text();if (strText.isEmpty()){int index = getIndex(pCurrentEdit);if (index != -1 && index != 0){m_lineEidt[index - 1]->setFocus();int length = m_lineEidt[index - 1]->text().length();m_lineEidt[index - 1]->setCursorPosition(length ? length : 0);}}return QLineEdit::eventFilter(obj, ev);}case Qt::Key_Period:{int index = getIndex(pCurrentEdit);QString strText = pCurrentEdit->text();if (strText.length() == 1) {pCurrentEdit->setText(strText.insert(0, QChar(Qt::Key_0)));}else if (strText.length() == 0) {pCurrentEdit->setText("00");}if (index != -1 && index < 5){m_lineEidt[index + 1]->setFocus();m_lineEidt[index + 1]->setCursorPosition(0);}return QLineEdit::eventFilter(obj, ev);}break;default:break;}}return false;
}//
void QMacLineEdit::setText(const QString &strMac)
{if (!isTextValid(strMac)){QMessageBox::warning(this, "Attention","Your MAC Address is Invalid!",QMessageBox::StandardButton::Ok);return;}else{int i = 0;QStringList macList = strMac.split("-");foreach (QString mac ,macList){m_lineEidt[i]->setText(mac);i++;}}
}bool QMacLineEdit::isTextValid(const QString &strIP)
{//qt6的写法QRegularExpression rx2("([0-9A-Za-z]{2})([0-9A-Za-z:-]{3}){5}");QRegularExpressionMatch match = rx2.match(strIP);return match.hasMatch();//qt5的写法//QRegExp rx2("([0-9A-Za-z]{2})([0-9A-Za-z:-]{3}){5}");//    if (!rx2.exactMatch(strIP))//        return false;// return true;
}QString QMacLineEdit::text() const
{QString strMac;for (int i = 0; i < 5; i++) {strMac.append(m_lineEidt[i]->text());if (3 != i) {strMac.append("-");}}return strMac;
}QIconLineEdit::QIconLineEdit(QWidget *parent) :QLineEdit(parent)
{labelPixmap = new QLabel(this);labelPixmap->setMinimumSize(16, 16);labelPixmap->setVisible(false);}QIconLineEdit::~QIconLineEdit()
{}void QIconLineEdit::SetIcon(const QPixmap &pixmap)
{if (pixmap.isNull()) return;labelPixmap->setPixmap(pixmap);labelPixmap->setVisible(true);labelPixmap->setGeometry(5,(this->height() - pixmap.height()) / 2, 16, 16);this->setTextMargins(25, 1, 1, 1);
}

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

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

相关文章

居民小区电动汽车有序充电策略研究

摘 要&#xff1a;针对电动汽车在居民小区无序充电对电网系统产生严重隐患及充电间时过长问题&#xff0c;提出一种采用延迟充电的电动汽车有序充电控制策略&#xff0c;并在分析国内外电动汽车有序充电的研究现状后&#xff0c;设计了居民小区电动汽车有序充电策略的总体框架。…

JIT耗时优化

优质博文&#xff1a;IT-BLOG-CN 一、背景 业务流量突增&#xff0c;机器直接接入大量流量QPS2000&#xff0c;JIT和GC会消耗太多CPU资源&#xff0c;导致1-2分钟时间内的请求超时导致异常&#xff0c;因此采用流量预热的方式&#xff0c;让机器逐步接入流量&#xff0c;需要预…

vscode类似GitHub Copilot的插件推荐

由于GitHub Copilot前段时间学生认证的账号掉了很多&#xff0c;某宝激活也是价格翻了几倍&#xff0c;而却&#xff0c;拿来用一天就掉线&#xff0c;可以试试同类免费的插件哦。 例如&#xff1a;TabNine&#xff0c;下载插件后&#xff0c;他会提示你登录&#xff0c;直接登…

spring6-国际化:i18n | 数据校验:Validation

文章目录 1、国际化&#xff1a;i18n1.1、i18n概述1.2、Java国际化1.3、Spring6国际化1.3.1、MessageSource接口1.3.2、使用Spring6国际化 2、数据校验&#xff1a;Validation2.1、Spring Validation概述2.2、实验一&#xff1a;通过Validator接口实现2.3、实验二&#xff1a;B…

关于计算机找不到vcomp140.dll无法继续执行怎么修复

在计算机使用过程中&#xff0c;我们可能会遇到各种问题&#xff0c;其中之一就是vcomp140.dll文件丢失。vcomp140.dll是一个动态链接库文件&#xff0c;它通常用于支持软件运行和系统功能。当这个文件丢失时&#xff0c;可能会导致程序无法正常运行&#xff0c;甚至系统出现错…

分类预测 | MATLAB实现SSA-CNN-BiLSTM麻雀算法优化卷积双向长短期记忆神经网络数据分类预测

分类预测 | MATLAB实现SSA-CNN-BiLSTM麻雀算法优化卷积双向长短期记忆神经网络数据分类预测 目录 分类预测 | MATLAB实现SSA-CNN-BiLSTM麻雀算法优化卷积双向长短期记忆神经网络数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现SSA-CNN-BiLSTM数据…

大厂秋招真题【贪心】大疆20230813秋招T1-矩形田地

题目描述与示例 题目描述 给定一个矩形田地&#xff0c;其高度为 h 且宽度为 w。同时&#xff0c;你将获得两个整数数组 horizontalCutting 和 verticalCutting&#xff0c;其中 horizontalCutting[i] 表示从矩形田地顶部到第 i 个水平切口的距离&#xff0c;verticalCutting…

使用CountdownLatch和线程池批量处理http请求,并处理响应数据

背景和问题 ​ 背景&#xff1a;最近项目的一个接口数据&#xff0c;需要去请求其他多个服务器的数据&#xff0c;然后统一返回&#xff1b; 问题点&#xff1a;如果遍历所有的服务器地址&#xff0c;然后串行请求就会出现请求时间过长&#xff0c;加入需要请求十个服务器&…

解决谷歌学术bib信息不全的问题

在我们撰写学术论文时&#xff0c;经常需要引用参考文献。如果用latex撰写论文&#xff0c;势必会用到文献的bib信息&#xff0c;大部分的教程都会告诉我们去google scholar上去搜索。 一、问题描述 搜索一篇文章&#xff0c;然后选择cite&#xff0c;再选择bib。 很明显&…

Node学习笔记之MySQL基本使用

使用 SQL 管理数据库 其实写接口简单来说就是操作数据库数据&#xff0c;所以我们需要学会数据库的增、删、查、改等基本操作 1. 什么是 SQL SQL&#xff08;英文全称&#xff1a;Structured Query Language&#xff09;是结构化查询语言&#xff0c;专门用来访问和处理数据…

(2)Nmap

笔记目录 渗透测试工具(1)wireshark渗透测试工具(2)Nmap渗透测试工具(3)BurpsuiteAWD比赛(1)AWD入门攻略大纲 1.工具简介 (1)定义 ①功能 网络扫描和嗅探工具包&#xff0c;三个主要基本功能&#xff1a; 探测一组主机是否在线 扫描主机端口、嗅探所提供的网络服务 推断出主…

Keil实现Flash升级跳转(STM32/GD32/HC32)

编写BOOT程序&#xff0c;和APP程序。 BOOT程序检查OTA参数&#xff0c;执行OTA升级&#xff0c;然后跳转到APP代码。 记录一下跳转APP需要修改得东西&#xff1a; 1、BOOT程序 修改跳转地址 先检查APP地址是否有效 然后关闭外设 反初始化 设置MSP指针&#xff0c;进行跳转 …

ZooKeeper+HBase分布式集群环境搭建

安装版本&#xff1a;hadoop-2.10.1、zookeeper-3.4.12、hbase-2.3.1 一、zookeeper集群搭建与配置 1.下载zookeeper安装包 2.解压移动zookeeper 3.修改配置文件&#xff08;创建文件夹&#xff09; 4.进入conf/ 5.修改zoo.cfg文件 6.进入/usr/local/zookeeper-3.4.12/zkdata…

Vue 模板字符串碰到script无法识别,报错Parsing error: Unterminated template.

需求&#xff1a; 将js代码完整的显示在界面上&#xff0c;包括标签 代码如下&#xff1a; 报错信息如下&#xff1a; 我们在上图中可以看到模板字符串加入了script标签后会报错 原因&#xff1a;运行JS的时候由上至下&#xff0c;先识别模板字符串里面的script标签&#xf…

基于B/S架构,包括PC后台管理端、APP移动端、可视化大屏端的智慧工地源码

智慧工地管理平台充分运用数字化技术&#xff0c;聚焦施工现场岗位一线&#xff0c;依托物联网、互联网、AI等技术&#xff0c;围绕施工现场管理的人、机、料、法、环五大维度&#xff0c;以及施工过程管理的进度、质量、安全三大体系为基础应用&#xff0c;实现全面高效的工程…

计算机网络,网络(OSI)七层模型,三次握手四次挥手,get与post请求区别,网络IO(BIO\NIO\AIO),TCP与UDP区别

1.OSI模型&#xff1f; 开放式系统互联通信参考模型(Open System Interconnection Reference Model) OSI网络七层模型&#xff1a;应用层、表示层、会话层、传输层、网络层、数据链路层、物理层 TCP/IP协议群简化了OSI七层模型&#xff1a;应用层、传输层、网络层、数据链路…

自然语言处理---文本预处理概述

自然语言处理&#xff08;Natural Language Processing&#xff0c;简称NLP&#xff09;是计算机科学与语言学中关注于计算机与人类语言间转换的领域。其主要应用于&#xff1a;语音助手、机器翻译、搜索引擎、智能问答等。 文本预处理概述 文本语料在输送给模型前一般需要一…

QSlider 类使用教程

文章目录 1、简介2 、公共类型3、属性4、functions4.1、访问属性相关 function4.2、公共槽4.3、Signal4.4、其他方法 5、设置样式 QT 官方文档参考地址&#xff1a;https://doc.qt.io/qt-5/qslider.html 1、简介 QSlider是垂直或水平滑块条控件&#xff0c;最常见的应用就是视…

MySQL常见面试题

一、存储引擎相关 &#xff08;1&#xff09;MySQL 支持哪些存储引擎? MySQL支持多种存储引擎&#xff0c;比如InnoDB&#xff0c;MyISAM&#xff0c; MySQL大于等于5.5之后&#xff0c;默认存储引擎是InnoDB &#xff08;2&#xff09;InnoDB 和 MyISAM 有什么区别? InnoD…

【计算机网络】IP协议的相关特性

IP协议&#xff1a;互联网的核心组件 在当今高度数字化的世界中&#xff0c;互联网已成为人们生活、工作不可或缺的一部分。而在这个庞大的网络中&#xff0c;IP协议&#xff08;Internet Protocol&#xff09;作为核心的通信协议&#xff0c;发挥着至关重要的作用。本文将详细…