live555开发笔记(三):live555创建RTSP服务器源码剖析,创建h264文件rtsp服务器源码深度剖析

若该文为原创文章,转载请注明原文出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/147879917

长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…

FFmpeg、SDL和流媒体开发专栏

上一篇:《live555开发笔记(二):live555创建RTSP服务器源码剖析,创建rtsp服务器的基本流程总结》
下一篇:敬请期待…


前言

  对于live555的rtsp服务器有了而基本的了解之后,进一步对示例源码进行剖析,熟悉整个h264文件流媒体的开发步骤。


Demo

  请添加图片描述

  请添加图片描述

  播放本地文件,多路播放的时候,总是以第一个文件进度为准,所以当前这个Demo是同步播放的。
这对于摄像头采集视频实时播放来说,这个是满足这个功能的。


基本概念

Source、Sink、Filter

  • Source:作为数据流的起点,负责生成或获取原始数据。例如:ByteStreamFileSource:从文件读取原始字节流6,H264VideoStreamFramer:解析H.264视频流并生成帧数据
  • Filter:在数据流从Souce流到Sink的过程中能够设置Filter,用于过滤或做进一步加工。例如:H264or5Fragmenter:将视频帧分片以适应RTP包大小;解码器Filter:将编码数据解码为原始帧。
  • Sink:作为数据流的终点,负责消费或转发数据。
      整个LiveMedia中,数据都是从Souce,经过一个或多个Filter。终于流向Sink。在server中数据流是从文件或设备流向网络,而在client数据流是从网络流向文件或屏幕。
      MediaSouce是全部Souce的基类,MediaSink是全部Sink的基类。
      从类数量和代码规模能够看到。LiveMedia类是整个LIVE555的核心,其内部包括数十个操作详细编码和封装格式的类。LiveMedia定义的各种Souce均是从文件读取,假设想实现从设备获得实时流的传输,能够定义自己的Souce。

ClientSession、ClientConnection

  • ClientSession:对于每一个连接到server的client。server会为其创建一个ClientSession对象,保存该client的socket、ip地址等。同一时候在该client中定义了各种响应函数用以处理和回应client的各种请求。
  • ClientConnection:用于处理一些与正常播放无关的命令。如命令未找到、命令不支持或媒体文件未找到等。在ClientConnection处理DESCRIBE命令时会创建ClientSession对象。其它命令在ClientSession中处理。

MediaSession、MediaSubsession、Track

  LIVE555使用MediaSession管理一个包括音视频的媒体文件。每一个MediaSession使用文件名称唯一标识。使用SubSession管理MediaSession中的一个音频流或视频流,音频或视频均为一个媒体文件里的媒体流,因此一个MediaSession能够有多个MediaSubsession,可单独管理音频流、视频流,并为每一个媒体流分配一个TrackID,如视频流分配为Track1,音频流分配为Track2,此后client必须在URL指定要为那个Track发送SETUP命令,因此我们能够觉得MediaSubsession代表Server端媒体文件的一个Track,也即相应一个媒体流。MediaSession代表Server端一个媒体文件。
  对于既包括音频又包括视频的媒体文件,MediaSession内包括两个MediaSubsession。但MediaSession和MediaSubsession仅代表静态信息。若多个client请求同一个文件,server仅会创建一个MediaSession。各个client公用。为了区分各个MediaSession的状态又定义了StreamState类,用来管理每一个媒体流的状态。在MediaSubsession中完毕了Souce和Sink连接。Souce对指针象会被设置进sink。在Sink须要数据时,能够通过调用Souce的GetNextFrame来获得。
  LIVE555中大量使用简单工厂模式,每一个子类均有一个CreateNew静态成员。该子类的构造函数被设置为Protected,因此在外部不能直接通过new来构造。同一时候。每一个类的构造函数的參数中均有一个指向UsageEnvironment的指针,从而能够输出错误信息和将自己增加调度。

HashTable

  IVE555内部实现了一个简单哈希表类BasicHashTable。在LIVE555中。有非常多地方须要用到该哈希表类。如:媒体文件名称与MediaSession的映射,SessionID与ClientSession的映射,UserName和Password的映射等。

SDP

  SDP是Session Description Protocol的缩写。是一个用来描写叙述多媒体会话的应用层协议。它是基于文本的,用于会话建立过程中的媒体类型和编码方案的协商等。


rtp与rtcp与rtsp服务器

RTP(实时传输协议)

  负责传输实时音视频数据流,基于UDP/IP协议实现低延迟传输。支持时间戳、序列号等机制,确保数据包的时序性和同步性。不保证传输可靠性,需结合RTCP进行质量监控。

RTCP(实时传输控制协议)

  作为RTP的辅助协议,用于监控传输质量、反馈统计信息(如丢包率、延迟、抖动)。功能实现:通过发送SR(发送者报告)和RR(接收者报告)反馈网络状态。支持带宽动态调整(如TMMBR/TMMBN)和流同步。

RTSP(实时流协议)服务器

  作为流媒体会话的控制中心,负责客户端与服务器的交互(如播放、暂停、停止等指令)。

  • 会话管理:通过SETUP、PLAY、TEARDOWN等命令控制媒体流传输的生命周期。
  • 协议协调:与RTP/RTCP协同工作,RTSP定义控制逻辑,RTP传输数据,RTCP监控质量。
  • 多流支持:可同时管理音视频等多路流,并通过SDP协议协商编解码参数。

关键类介绍

H264VideoRTPSink:H264视频数据核心组件

  H264VideoRTPSink是H.264视频流通过RTP/RTSP协议实现实时传输的关键模块,负责协议封装、数据分片和网络适配,确保视频流在实时场景下的高效性和兼容性。
  在这里插入图片描述

  H264VideoRTPSink是Live555 流媒体框架中用于封装和传输H.264视频数据的核心组件,其作用主要包含以下方面:

  • RTP数据封装:H264VideoRTPSink 将 H.264 视频数据按 RTP 协议规范封装成网络传输包。具体包括:添加 RTP 包头信息(如时间戳、序列号、负载类型等);根据 H.264 的 NALU(网络抽象层单元)结构对视频数据进行分片或重组,确保数据适应网络传输的最大传输单元(MTU)限制。
  • 分片处理(Fragmentation):当单个 H.264 帧超过 MTU 限制时,H264VideoRTPSink 会将其拆分为多个 RTP 包(例如使用 FU-A 分片模式),并在包头中标记分片的起始、中间和结束位置。
  • 与 RTSP 协议协同工作:在RTSP会话中,H264VideoRTPSink作为数据传输的终点(Sink),与MediaSource(数据源)配合,完成从数据读取到RTP封装的完整流程。在客户端发送PLAY请求后,服务器通过H264VideoRTPSink将封装后的RTP流推送至网络。缓冲区管理处理大数据量H.264视频时,H264VideoRTPSink需依赖动态调整的缓冲区(如OutPacketBuffer::maxSize),防止因数据包过大导致的传输失败。

RTCPInstance:RTCP通讯类

  在Live555框架中,RTCPInstance与RTPSink、RTPInterface等类协作,共同实现完整的RTP/RTCP流媒体传输功能。其设计独立于其他高层协议模块,仅依赖基础网络组件,具备较好的封装性。
  在这里插入图片描述

  RTCPInstance是Live555框架中封装RTCP协议通信的核心类:

  • RTCP协议通信的封装与实现:负责RTCP数据包的收发处理,支持通过RTPInterface实现基于UDP或TCP的传输。接收到的RTCP报文(如SR、RR、BYE等)在incomingReportHandler等回调函数中处理,实现网络状态反馈和会话控制。
  • 网络状态监测与统计:统计RTP包的收发情况,收集丢包率、延迟、抖动等指标,为流量控制提供数据支持。依赖RTPSink类获取发送端统计信息,实现与RTP流的关联。
  • 反馈与动态调整机制:通过发送SR(发送者报告)和RR(接收者报告)实时反馈网络质量,触发发送速率调整或丢包重传。支持带宽控制机制(如TMMBR/TMMBN),根据网络状况动态调整媒体流传输参数。
  • 会话管理与流同步:处理BYE报文实现参与者退出通知,维护会话成员状态。通过SDES报文传递参与者描述信息,辅助多流同步(如音视频同步)。

ByteStreamFileSource:基础数据源组件

  ByteStreamFileSource是Live555中处理文件型H.264流的核心入口组件,承担数据读取与基础分块功能,并为上层解析、封装模块提供标准化输入接口。
  在这里插入图片描述

  ByteStreamFileSource在Live555 流媒体框架中作为基础数据源组件,核心作用如下:

  • 原始字节流读取:负责从本地文件(如 H.264 裸流文件)中读取未封装的原始字节数据,并以分块(Framed)形式输出,供后续解析模块处理。
  • 数据链的起点:在典型的 H.264 传输链路(如 H264VideoFileServerMediaSubsession中)中,其作为初始节点启动数据流,后续连接解析器(如H264VideoStreamParser)和分帧器(H264VideoStreamFramer),形成完整处理链路:ByteStreamFileSource → H264VideoStreamParser → H264VideoStreamFramer → … → RTP 封装。
  • 可扩展性支持:虽然默认实现为文件读取,但其继承自FramedSource基类,用户可通过自定义派生类(如实时采集或编码的数据源)替代该组件,实现灵活的数据输入适配。
  • 关键参数配置:支持通过fileSize属性获取文件大小信息,便于预估传输带宽需求。在动态服务器场景中,需注意其与缓冲区大小(如OutPacketBuffer::maxSize)的协同配置,避免大帧溢出问题。

FrameSource:帧源抽象类

  FrameSource是Live555中实现按帧输入媒体数据的基础组件,为RTSP/RTP 传输提供标准化的数据源接口,支持多格式媒体流的灵活扩展。
  在这里插入图片描述

  FrameSource 在 Live555 流媒体框架中作为数据源的核心抽象类,其作用可归纳如下:

  • 基础数据源抽象:FrameSource 是负责按帧(Framed)提供流媒体数据的基类,定义了统一的帧数据读取接口。其子类需实现 doGetNextFrame 方法,用于逐帧获取原始媒体数据(如视频帧或音频块)。
  • RTP数据流起点:在RTSP/RTP传输链路中,FrameSource 作为数据生产者,将媒体数据以帧为单位传递给下游处理模块(如解析器、封装器)。例如,H264VideoStreamFramer 继承自 FrameSource,负责将裸 H.264 码流分帧后输出。
  • 接口标准化:FrameSource 通过纯虚函数强制子类实现关键操作,包括:帧数据异步获取机制(通过 afterGetting 回调触发数据传输);帧数据的分块与缓冲区管理。
  • 与下游组件协同:FrameSource与MediaSink类(如H264VideoRTPSink)形成数据链路:MediaSink通过fSource成员绑定FrameSource,驱动数据拉取与封装流程;在RTSP会话中,FrameSource的数据最终被封装为RTP包并发送至客户端。

H264VideoStreamFramer:H264视频流帧器

  H264VideoStreamFramer在RTSP流媒体服务中通常由H264VideoFileServerMediaSubsession创建,是H.264实时流传输的关键解析层,承担了从原始字节流到结构化视频数据的转换任务。
  在这里插入图片描述

  H264VideoStreamFramer在Live555框架中作为视频流解析的核心组件,主要承担H.264基本流(ES)的解析与重构,其核心功能如下:

  • H.264原始流解析‌:从ByteStreamFileSource等数据源读取原始字节流,通过内置的H264VideoStreamParser解析器识别NALU(网络抽象层单元)边界,将连续字节流分割为独立NALU单元‌25处理H.264 Annex B格式的起始码(如0x00000001),实现NALU的精准定位‌56
  • 参数集处理‌:提取并缓存SPS(序列参数集)和PPS(图像参数集),用于后续解码器初始化‌,在流启动时优先发送SPS/PPS,确保解码端正确初始化‌。
  • 分帧逻辑控制‌:区分VCL(视频编码层)和非VCL NALU,根据帧类型(如IDR帧、非IDR帧)组织数据输出‌56;处理分片单元(Slice)的关联性,确保帧完整性‌
  • 时间戳生成机制:基于视频帧率或外部输入时钟计算RTP时间戳,实现与音视频同步;处理B帧/P帧的显示时间戳(PTS)与解码时间戳(DTS)关系。
  • 与上下游组件协作‌:作为FramedSource的子类,向上连接ByteStreamFileSource获取原始数据,向下对接H264FUAFragmenter完成RTP分片‌;通过事件驱动模型触发数据读取,形成Source → Parser → Framer → Fragmenter → RTPSink的完整处理链路‌。
      H264VideoStreamFramer把自己的缓冲(其实是sink的)传给H264VideoStreamParser,每当H264VideoStreamFramer要获取一个NALU时,就跟H264VideoStreamParser要,而H264VideoStreamParser就从ByteStreamFileSource读一坨数据,然后进行分析,如果取得了一个NALU,就传给H264VideoStreamFramer。

Live555流媒体服务实现基本流程

步骤一:创建任务调度管理器

  在这里插入图片描述

步骤二:创建rtp和rtcp

  在不同平台使用的socketaddr_storage类型有区别,有些事socketaddr_in,主要是groupsock的头文件构造函数类型的区别,判断是live555各种版本有区别。
  在这里插入图片描述

步骤三:创建H264VideoRTPSink

  在这里插入图片描述

步骤四:创建RTCPInstance

  在这里插入图片描述

步骤五:RTSP服务器

  在这里插入图片描述

步骤六:创建ServerMediaSession实例

  在这里插入图片描述

步骤七:创建subsession实例

  在这里插入图片描述

步骤八:开始播放

  在这里插入图片描述

步骤九:服务器运行

  在这里插入图片描述


Demo区别

  在这里插入图片描述

  没有启动服务器http端口监听,而是直接play。


整理后的中文注释代码

/*为了使此应用程序正常工作,H.264 Elementary Stream视频文件*必须*包含SPS和PPS NAL单元,最好在文件开头或附近。这些SPS和PPS NAL单元用于指定在输出流的SDP描述中设置的“配置”信息(由此应用程序内置的RTSP服务器设置)。另请注意,与其他一些“*Streamer”演示应用程序不同,生成的流只能使用RTSP客户端(如“openRTSP”)接收
*/#include <liveMedia.hh>
#include <BasicUsageEnvironment.hh>
#include <GroupsockHelper.hh>UsageEnvironment* env;
//char const* inputFileName = "test.264";
char const* inputFileName = "T:/test/front/20250311_123244_0.h264";
H264VideoStreamFramer* videoSource;
RTPSink* videoSink;void announceURL(RTSPServer* rtspServer, ServerMediaSession* sms)
{if(rtspServer == NULL || sms == NULL){return;}UsageEnvironment& env = rtspServer->envir();env << "Play this stream using the URL ";if(weHaveAnIPv4Address(env)){char* url = rtspServer->ipv4rtspURL(sms);env << "\"" << url << "\"";delete[] url;if (weHaveAnIPv6Address(env)){env << " or ";}}if(weHaveAnIPv6Address(env)){char* url = rtspServer->ipv6rtspURL(sms);env << "\"" << url << "\"";delete[] url;}env << "\n";
}void play(); // forwardint main(int argc, char** argv)
{// 步骤一:创建任务调度器和运行信息环境TaskScheduler* scheduler = BasicTaskScheduler::createNew();env = BasicUsageEnvironment::createNew(*scheduler);// 步骤二:创建groupsocks用于RTP和RTCPstruct sockaddr_storage destinationAddress;destinationAddress.ss_family = AF_INET;((struct sockaddr_in&)destinationAddress).sin_addr.s_addr = chooseRandomIPv4SSMAddress(*env);// 这是一个多播地址。如果希望使用单播进行流式传输,那么应该使用“testOnDemand RTSPServer”测试程序(而不是此测试程序)作为模型。const unsigned short rtpPortNum = 18888;const unsigned short rtcpPortNum = rtpPortNum+1;const unsigned char ttl = 255;const Port rtpPort(rtpPortNum);const Port rtcpPort(rtcpPortNum);Groupsock rtpGroupsock(*env, destinationAddress, rtpPort, ttl);rtpGroupsock.multicastSendOnly();Groupsock rtcpGroupsock(*env, destinationAddress, rtcpPort, ttl);rtcpGroupsock.multicastSendOnly(); //// 步骤三:从RTP“groupsock”创建“H264视频RTP”接收器OutPacketBuffer::maxSize = 100000;videoSink = H264VideoRTPSink::createNew(*env, &rtpGroupsock, 96);// 步骤四:为此RTP接收器创建(并启动)一个“RTCP实例” kbps为单位;RTCP b/w份额const unsigned estimatedSessionBandwidth = 500;const unsigned maxCNAMElen = 100;unsigned char CNAME[maxCNAMElen+1];gethostname((char*)CNAME, maxCNAMElen);CNAME[maxCNAMElen] = '\0'; // just in caseRTCPInstance* rtcp = RTCPInstance::createNew(*env,&rtcpGroupsock,estimatedSessionBandwidth,CNAME,videoSink,NULL,    // 代表服务器True);   // 代表SSM源// 步骤五:这将自动启动RTCP运行RTSPServer* rtspServer = RTSPServer::createNew(*env, 8554);if (rtspServer == NULL){*env << "Failed to create RTSP server: " << env->getResultMsg() << "\n";exit(1);}// 步骤六:创建ServerMediaSessionServerMediaSession* sms = ServerMediaSession::createNew(*env,"testStream",inputFileName,"Session streamed by \"testH264VideoStreamer\"",True);// 步骤七:创建subsessionsms->addSubsession(PassiveServerMediaSubsession::createNew(*videoSink, rtcp));rtspServer->addServerMediaSession(sms);announceURL(rtspServer, sms);// 开始流播放:*env << "Beginning streaming...\n";// 这个开始播放函数调用不调用区别:// 1.不调用时,有客户端输入,无法播放;必须调用play,进入则会开始调用播放,从头开始播放// 2.后进入的客户端播放进度会主动同步首个连接的客户端播放进度play();// 服务器阻塞进入服务循环env->taskScheduler().doEventLoop(); // does not returnreturn 0;
}void afterPlaying(void* clientData)
{*env << "...done reading from file\n";// 停止播放videoSink->stopPlaying();// 请注意,这也会关闭此源读取的输入文件。这是静态方法,可以直接关闭Medium::close(videoSource);// 再次开始播放play();
}void play()
{// 将输入文件作为“字节流文件源”打开ByteStreamFileSource* fileSource = ByteStreamFileSource::createNew(*env, inputFileName);if(fileSource == NULL){*env << "Unable to open file \"" << inputFileName<< "\" as a byte-stream file source\n";exit(1);}FramedSource* videoES = fileSource;// 为视频基本流创建帧器videoSource = H264VideoStreamFramer::createNew(*env, videoES);// 最后,开始播放*env << "Beginning to read from file...\n";videoSink->startPlaying(*videoSource, afterPlaying, videoSink);
}

工程模板v1.2.0

  在这里插入图片描述


上一篇:《live555开发笔记(二):live555创建RTSP服务器源码剖析,创建rtsp服务器的基本流程总结》
下一篇:敬请期待…


本文章博客地址:https://hpzwl.blog.csdn.net/article/details/147879917

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

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

相关文章

STM32-模电

目录 一、MOS管 二、二极管 三、IGBT 四、运算放大器 五、推挽、开漏、上拉电阻 一、MOS管 1. MOS简介 这里以nmos管为例&#xff0c;注意箭头方向。G门极/栅极&#xff0c;D漏极&#xff0c;S源极。 当给G通高电平时&#xff0c;灯泡点亮&#xff0c;给G通低电平时&a…

基于定制开发开源AI智能名片S2B2C商城小程序的公私域流量融合运营策略研究

摘要&#xff1a;本文以定制开发开源AI智能名片S2B2C商城小程序为技术载体&#xff0c;系统探讨公域流量向私域流量沉淀的数字化路径。研究通过分析平台流量&#xff08;公域流量&#xff09;与私域流量的共生关系&#xff0c;提出"公域引流-私域沉淀-数据反哺"的闭环…

mysql中索引的使用

前言 最近一直在学习mysql以及忙学校课程的事情。已经好久没写过博客了&#xff0c;今天跟大家分享一下在mysql中关于索引的知识&#xff0c;希望可以帮助到大家。 索引的定义 mysql中的索引是一种数据结构&#xff0c;它可以帮助数据库高效地查询&#xff0c;更新数据表中的…

深度拆解!MES如何重构生产计划与排产调度全流程?

☂引言 在制造业数字化转型浪潮中&#xff0c;生产计划与排产调度的精准性直接决定企业竞争力。深蓝易网MES系统通过智能化调度与全流程管控&#xff0c;帮助企业破解排产难题&#xff0c;实现资源高效协同与生产透明化管理&#xff0c;为制造企业打造柔性化、敏捷化的生产体系…

【深度学习】计算机视觉(18)——从应用到设计

文章目录 1 不同的注意力机制1.1 自注意力1.2 多头注意力1.3 交叉注意力1.3.1 基础1.3.2 进阶 1 不同的注意力机制 在学习的过程中&#xff0c;发现有很多计算注意力的方法&#xff0c;例如行/列注意力、交叉注意力等&#xff0c;如果对注意力机制本身不是特别实现&#xff0c…

洛谷 P1955 [NOI2015] 程序自动分析

【题目链接】 洛谷 P1955 [NOI2015] 程序自动分析 【题目考点】 1. 并查集 2. 离散化 【解题思路】 多组数据问题&#xff0c;对于每组数据&#xff0c;有多个 x i x j x_ix_j xi​xj​或 x i ≠ x j x_i \neq x_j xi​xj​的约束条件。 所有相等的变量构成一个集合&…

[Java] 输入输出方法+猜数字游戏

目录 1. 输入输出方法 1.1 输入方法 1.2 输出方法 2. 猜数字游戏 1. 输入输出方法 Java中输入和输出是属于Scanner类里面的方法&#xff0c;如果要使用这两种方法需要引用Scanner类。 import java.util.Scanner; java.util 是Java里面的一个包&#xff0c;里面包含一些工…

zst-2001 上午题-历年真题 UML(13个内容)

UML基础 UML - 第1题 ad UML - 第2题 依赖是暂时使用对象&#xff0c;关联是长期连接 依赖&#xff1a;依夜情 关联&#xff1a;天长地久 组合&#xff1a;组一辈子乐队 聚合&#xff1a;好聚好散 bd UML - 第3题 adc UML - 第4题 bad UML - 第5题 d UML…

WebFlux vs WebMVC vs Servlet 对比

WebFlux vs WebMVC vs Servlet 技术对比 WebFlux、WebMVC 和 Servlet 是 Java Web 开发中三种不同的技术架构&#xff0c;它们在编程模型、并发模型和适用场景上有显著区别。以下是它们的核心对比&#xff1a; 核心区别总览 特性ServletSpring WebMVCSpring WebFlux编程模型…

htmlUnit和Selenium的区别以及使用BrowserMobProxy捕获网络请求

1. Selenium&#xff1a;浏览器自动化之王 核心定位&#xff1a; 跨平台、跨语言的浏览器操控框架&#xff0c;通过驱动真实浏览器实现像素级用户行为模拟。 技术架构&#xff1a; 核心特性&#xff1a; 支持所有主流浏览器&#xff08;含移动端模拟&#xff09; 精…

SSRF相关

SSRF(Server Side Request Forgery,服务器端请求伪造)&#xff0c;攻击者以服务器的身份发送一条构造好的请求给服务器所在地内网进行探测或攻击。 产生原理&#xff1a; 服务器端提供了能从其他服务器应用获取数据的功能&#xff0c;如从指定url获取网页内容、加载指定地址的图…

SaaS备份的必要性:厂商之外的数据保护策略

在当今数字化时代&#xff0c;企业对SaaS&#xff08;软件即服务&#xff09;应用的依赖程度不断攀升。SaaS应用为企业提供了便捷的生产力工具&#xff0c;然而&#xff0c;这也使得数据安全面临诸多挑战&#xff0c;如意外删除、勒索软件攻击以及供应商故障等。因此&#xff0…

【Python 基础语法】

Python 基础语法是编程的基石&#xff0c;以下从核心要素到实用技巧进行系统梳理&#xff1a; 一、代码结构规范 缩进规则 使用4个空格缩进&#xff08;PEP 8标准&#xff09;缩进定义代码块&#xff08;如函数、循环、条件语句&#xff09; def greet(name):if name: # 正确缩…

利用“Flower”实现联邦机器学习的实战指南

一个很尴尬的现状就是我们用于训练 AI 模型的数据快要用完了。所以我们在大量的使用合成数据&#xff01; 据估计&#xff0c;目前公开可用的高质量训练标记大约有 40 万亿到 90 万亿个&#xff0c;其中流行的 FineWeb 数据集包含 15 万亿个标记&#xff0c;仅限于英语。 作为…

自动化测试与功能测试详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 什么是自动化测试? 自动化测试是指利用软件测试工具自动实现全部或部分测试&#xff0c;它是软件测试的一个重要组成 部分&#xff0c;能完成许多手工测试无…

MySQL全量,增量备份与恢复

目录 一.MySQL数据库备份概述 1.数据备份的重要性 2.数据库备份类型 3.常见的备份方法 二&#xff1a;数据库完全备份操作 1.物理冷备份与恢复 2.mysqldump 备份与恢复 3.MySQL增量备份与恢复 3.1MySQL增量恢复 3.2MySQL备份案例 三&#xff1a;定制企业备份策略思路…

Ubuntu 安装 Nginx

Nginx 是一个高性能的 Web 服务器和反向代理服务器&#xff0c;同时也可以用作负载均衡器和 HTTP 缓存。 Nginx 的主要用途 用途说明Web服务器提供网页服务&#xff0c;处理用户的 HTTP 请求&#xff0c;返回 HTML、CSS、JS、图片等静态资源。反向代理服务器将用户请求转发到…

人工智能 机器学习期末考试题

自测试卷2 一、选择题 1&#xff0e;下面哪个属性不是NumPy中数组的属性&#xff08; &#xff09;。 A&#xff0e;ndim B&#xff0e;size C&#xff0e;shape D&#xff0e;add 2&#xff0e;一个简单的Series是由&#xff08; &#xff09;的数据组成的。 A&#xff0e;两…

使用阿里云CLI调用OpenAPI

介绍使用阿里云CLI调用OpenAPI的具体操作流程&#xff0c;包括安装、配置凭证、生成并调用命令等步骤。 方案概览 使用阿里云CLI调用OpenAPI&#xff0c;大致分为四个步骤&#xff1a; 安装阿里云CLI&#xff1a;根据您使用设备的操作系统&#xff0c;选择并安装相应的版本。…

K8S Svc Port-forward 访问方式

在 Kubernetes 中&#xff0c;kubectl port-forward 是一种 本地与集群内资源&#xff08;Pod/Service&#xff09;建立临时网络隧道 的访问方式&#xff0c;无需暴露服务到公网&#xff0c;适合开发调试、临时访问等场景。以下是详细使用方法及注意事项&#xff1a; 1. 基础用…