RTSP视频流相关的一些操作

news2024/9/27 19:23:38

播放rtsp camera 内容

  • 端口554在网络通信中用于Real Time Streaming Protocol(RTSP)。
gst-launch-1.0 playbin uri=rtsp://admin:WANGfengtu12@10.0.20.190:554/client0x
gst-launch-1.0 playbin uri=rtsp://admin:WANGfengtu12@10.0.20.61:554/client1x

gst-launch-1.0 rtspsrc location=rtsp://admin:WANGfengtu12@10.0.20.70:554/client0x ! rtph264depay ! h264parse ! decodebin ! autovideosink
gst-launch-1.0 rtspsrc location=rtsp://admin:WANGfengtu12@10.0.20.61:554/client1x ! rtph264depay ! h264parse ! decodebin ! autovideosink
  • 尝试使用v4l2 去解码
gst-launch-1.0 rtspsrc location=rtsp://admin:WANGfengtu12@10.0.20.61:554/client1x latency=10 ! rtph264depay ! h264parse ! v4l2h264dec capture-io-mode=4 ! v4l2convert output-io-mode=5 capture-io-mode=4 ! autovideosink sync=false

在这里插入图片描述

Ref

https://gstreamer.freedesktop.org/documentation/tutorials/playback/hardware-accelerated-video-decoding.html?gi-language=c
https://github.com/uutzinger/camera/blob/master/RTSP_RTP_gstreamer.md

NNStreamer

Env

  • Ubuntu18.04
  • x86-64
# 安装
$ sudo add-apt-repository ppa:nnstreamer/ppa
$ sudo apt-get update
$ sudo apt-get install nnstreamer

$ sudo add-apt-repository ppa:nnstreamer-example/ppa
$ sudo apt-get update
$ sudo apt-get install nnstreamer-example

sudo apt install nnstreamer-tensorflow2-lite
$ cd /usr/lib/nnstreamer/bin

./nnstreamer_example_pose_estimation_tflite 
python3 nnstreamer_example_object_detection_tflite.py 
  • 使用 rtsp 流去做推理 nnstreamer_example_object_detection_tflite.py
        self.pipeline = Gst.parse_launch(
            'rtspsrc location=rtsp://admin:WANGfengtu12@10.0.20.61:554/client1x ! rtph264depay ! h264parse ! decodebin ! videoconvert ! videoscale ! '
            'video/x-raw,width=640,height=480,format=RGB ! tee name=t_raw '
            't_raw. ! queue leaky=2 max-size-buffers=2 ! videoscale ! video/x-raw,width=300,height=300 ! tensor_converter ! '
            'tensor_transform mode=arithmetic option=typecast:float32,add:-127.5,div:127.5 ! '
            'tensor_filter framework=tensorflow-lite model=' + self.tflite_model + ' ! '
            'tensor_decoder mode=bounding_boxes option1=mobilenet-ssd option2='
            + self.tflite_label + ' option3=' + self.tflite_box_prior + ' option4=640:480 option5=300:300 !'
            'compositor name=mix sink_0::zorder=2 sink_1::zorder=1 ! videoconvert ! ximagesink '
            't_raw. ! queue leaky=2 max-size-buffers=10 ! mix. '
        )
  • yolov5
gst-launch-1.0 v4l2src ! videoscale ! videoconvert ! video/x-raw,width=320,height=320,format=RGB,framerate=30/1,pixel-aspect-ratio=1/1 ! tee name=t   t. ! queue ! tensor_converter ! other/tensors,num_tensors=1,types=uint8,format=static,dimensions=3:320:320:1 !     tensor_transform mode=arithmetic option=typecast:float32,add:0.0,div:255.0 ! queue leaky=2 max-size-buffers=2 !     tensor_filter framework=tensorflow2-lite model=./yolov5s-fp16-320.tflite !     other/tensors,num_tensors=1,types=float32,format=static,dimensions=85:6300:1:1 !     tensor_decoder mode=bounding_boxes option1=yolov5 option2=./coco.txt option4=320:320 option5=320:320 !     video/x-raw,width=320,height=320,format=RGBA ! mix.sink_0   t. ! queue ! mix.sink_1 compositor name=mix sink_0::zorder=2 sink_1::zorder=1 ! videoconvert ! ximagesink

gst-launch-1.0 rtspsrc location=rtsp://admin:WANGfengtu12@10.0.20.61:554/client1x ! rtph264depay ! h264parse ! decodebin ! videoconvert ! video/x-raw,width=320,height=320,format=RGB,framerate=30/1,pixel-aspect-ratio=1/1 ! tee name=t   t. ! queue ! tensor_converter ! other/tensors,num_tensors=1,types=uint8,format=static,dimensions=3:320:320:1 !     tensor_transform mode=arithmetic option=typecast:float32,add:0.0,div:255.0 ! queue leaky=2 max-size-buffers=2 !     tensor_filter framework=tensorflow2-lite model=./yolov5s-fp16-320.tflite !     other/tensors,num_tensors=1,types=float32,format=static,dimensions=85:6300:1:1 !     tensor_decoder mode=bounding_boxes option1=yolov5 option2=./coco.txt option4=320:320 option5=320:320 !     video/x-raw,width=320,height=320,format=RGBA ! mix.sink_0   t. ! queue ! mix.sink_1 compositor name=mix sink_0::zorder=2 sink_1::zorder=1 ! videoconvert ! ximagesink

使用opencv播放rtsp流

py

import cv2 as cv


cap = cv.VideoCapture('rtsp://admin:WANGfengtu12@10.0.20.61:554/client1x',cv.CAP_GSTREAMER)
while cv.waitKey(1) < 0:
    hasFrame, frame = cap.read()

    if not hasFrame:
        break

    cv.imshow("rtsp", frame)

cpp

cv::VideoCapture cap;
cap.open("rtsp://admin:WANGfengtu12@10.0.20.61:554/client1x",cv::CAP_GSTREAMER);


cv::Mat frame;

while(cv::waitKey(1) < 0) // Press any key to exit
{
    if (!cap.read(frame))
    {
        cerr << "No frames grabbed!\n";
        break;
    }
}
}   

Ref

  • https://bbs.huaweicloud.com/blogs/315157

Q&A

python 使用gstreamer遇到的问题

  • No matching distribution found for gi
  • https://stackoverflow.com/questions/71369726/no-module-named-gi
sudo apt install libcairo2-dev libxt-dev libgirepository1.0-dev

pip install pycairo PyGObject

ffmpeg拉取rtsp流播放

ffmpeg -f v4l2 -i /dev/video0  -s 1280X720 -r 24 -vcodec libx264 -f rtsp rtsp://10.0.20.193:554/stream

ffplay -rtsp_transport tcp -fflags nobuffer rtsp://10.0.20.193/test

rk3588 使用gstreamer编解码,OpenEuler上

  • 将硬编码相关的mpp 拷贝到设备上,https://gitee.com/wangyx0704/roc-rk3588s-pc-mppcodec
  • 修改设备/dev/mpp_service 权限
# 下载相关的git 仓库
git clone https://gitee.com/wangyx0704/gst-d-softbus-sink.git
git clone https://gitee.com/wangyx0704/roc-rk3588s-pc-mppcodec.git

#安装相关的依赖
yum install opencv*  gcc-c++.aarch64  gcc.aarch64 -y
dnf install eigen3
dnf install -y gstreamer1 gstreamer1-devel gstreamer1-plugins-base gstreamer1-plugins-good gstreamer1-plugins-bad-free

dnf install -y gstreamer1* git make  cmake unzip pkg-config
rpm -e gstreamer1-plugins-base-help.noarch

#使用仓库中下载完的软件包,替换已经安装好的软件包
cd gst-d-softbus-sink/rpms
yum install -y gstreamer1-plugins-base-1.19.2/*.rpm
yum install -y gstreamer1-rtsp-server-1.19.2/*.rpm
将`roc-rk3588s-pc-mppcodec` 编解码库移动到系统目录`/usr/lib64`
  • 常使用的pipeline的用法

# 解码
# 硬解
gst-launch-1.0 rtspsrc location="rtsp://admin:WANGfengtu12@10.0.20.61:554/client1x" latency=0 drop-on-latency=true protocols=tcp ! rtph264depay ! h264parse ! mppvideodec ! video/x-raw,format=BGR ! appsink

# 软解
gst-launch-1.0 rtspsrc location="rtsp://admin:WANGfengtu12@10.0.20.61:554/client1x" latency=0 drop-on-latency=true protocols=tcp ! rtph264depay ! h264parse ! avdec_h264 ! videoconvert ! video/x-raw,format=BGR ! appsink


# 编码
# 硬编
gst-launch-1.0 appsrc ! videoconvert ! mppvp8enc ! video/x-vp8, mapping=/stream1 ! rtspclientsink latency=0 location=rtsp://10.0.20.193:554/test

gst-launch-1.0 videotestsrc ! video/x-raw,width=1280,height=720 ! videoconvert ! mpph264enc ! video/x-h264, mapping=/stream1 ! rtspclientsink latency=0 location=rtsp://10.0.20.193:554/test

gst-launch-1.0 videotestsrc ! videoconvert ! mpph264enc ! rtspclientsink latency=0 location=rtsp://10.0.20.193:554/test

# 软编
gst-launch-1.0 videotestsrc ! videoconvert ! vp8enc ! rtspclientsink latency=0 location=rtsp://10.0.20.193:554/test

# 不能同时支持 软硬解码
gst-launch-1.0 rtspsrc location=rtsp://10.0.20.193/st1 latency=0 protocols=udp ! queue ! rtph264depay ! h264parse ! avdec_h264 ! videoconvert ! video/x-raw, format=BGR ! videoconvert ! video/x-raw,format=YUY2,width=1280,height=720 ! mpph264enc ! rtspclientsink latency=100 location=rtsp://10.0.20.193:554/test

RK3588 Ubuntu使用

sudo apt install gstreamer1.0-rtsp
sudo apt install gstreamer1.0-rockchip1

OpenEuler 上面安装GStreamer

OE 22.03

sudo dnf install gstreamer*

# 目录 gstreamer1-rtsp-server-1.19.2
sudo rmp -Uvh *.rpm
# 直接远程安装
sudo dnf install gstreamer1-rtsp-server*

# rtspsrc
sudo dnf install gstreamer1-plugins-good*

# h264parse
sudo dnf install gstreamer1-plugins-bad*

# avdec_h264
sudo dnf install libgstlibav*

OE 20.03

# 卸载旧包
rpm -e gstreamer1-plugins-base-help.noarch

# 在下面目录依次执行
yum install *.rpm
# gstreamer1-plugins-base-1.19.2
#  gstreamer1-rtsp-server-1.19.2 

rk3588 gstreamer pipeline 的使用

# 硬件编码
gst-launch-1.0 videotestsrc ! videoconvert ! mpph264enc ! rtspclientsink latency=0 location=rtsp://10.0.20.193:554/test

在这里插入图片描述

# 软件编码
gst-launch-1.0 videotestsrc ! videoconvert ! vp8enc ! rtspclientsink latency=0 location=rtsp://10.0.20.193:554/test

# 软解软编
gst-launch-1.0 rtspsrc location=rtsp://10.0.20.193/st1 latency=0 protocols=udp ! queue ! rtph264depay ! h264parse ! avdec_h264 ! videoconvert ! video/x-raw, format=BGR ! videoconvert ! vp8enc ! rtspclientsink latency=100 location=rtsp://10.0.20.193:554/test

# 硬解硬编 (这种存在问题)
gst-launch-1.0 -v rtspsrc location=rtsp://10.0.20.193/st1 latency=0 ! rtph264depay ! h264parse ! mppvideodec ! videoconvert ! mpph264enc ! queue ! h264parse ! rtspclientsink location=rtsp://10.0.20.193:554/st2 latency=100

# 通过将mpp patch打上,重新编译内核 
export GST_VIDEO_CONVERT_USE_RGA=1
export GST_VIDEO_FLIP_USE_RGA=1
gst-launch-1.0 rtspsrc location=rtsp://10.0.20.193/input latency=0 protocols=udp ! queue ! rtph264depay ! h264parse ! mppvideodec ! videoconvert ! video/x-raw, format=BGR ! videoconvert ! video/x-raw,format=NV12 ! mpph264enc ! rtspclientsink latency=100 location=rtsp://10.0.20.193:554/test

Gstreamer server (完全不推荐)

1

#include <gst/gst.h>
#include <gst/rtsp-server/rtsp-server.h>

int main(int argc, char ** argv)
{
    GMainLoop *loop;
    GstRTSPMediaFactory *factory;

    char * pipe = "rtspsrc location=rtsp://10.0.20.193/st1 latency=0 protocols=udp ! queue ! rtph264depay ! h264parse ! avdec_h264 ! videoconvert ! video/x-raw, format=BGR ! videoconvert ! video/x-raw,format=YUY2,width=1280,height=720 ! mpph264enc ! rtspclientsink latency=100 location=rtsp://10.0.20.193:554/test";
    loop = g_main_loop_new(NULL, FALSE);

    factory = gst_rtsp_media_factory_new();
    gst_rtsp_media_factory_set_launch(factory, pipe);
    gst_rtsp_media_factory_set_shared(factory, TRUE);
    gst_rtsp_media_factory_set_enable_rtcp(factory, FALSE);

    g_main_loop_run(loop);
    return 0;
}
  • 编译选项
 # 错误
 gcc test_pipeline.c -o test_pipeline -lgstrtsp-1.0 `pkg-config --cflags --libs gstreamer-1.0` `pkg-config --cflags --libs gstreamer-plugins-base-1.0`
 # 正确
 gcc test_pipeline.c -o test_pipeline -lgstrtsp-1.0 `pkg-config --cflags --libs gstreamer-1.0` `pkg-config --cflags --libs gstreamer-rtsp-server-1.0`

2

#include <gst/gst.h>


int main(int argc, char **argv)
{
    GstElement *pipeline;
    GstBus * bus;
    GstMessage *msg;


    gst_init(&argc, &argv);

    pipeline = gst_parse_launch("rtspsrc location=rtsp://10.0.20.193/st1 latency=0 protocols=udp ! queue ! rtph264depay ! h264parse ! avdec_h264 ! videoconvert ! video/x-raw, format=BGR ! videoconvert ! video/x-raw,format=YUY2,width=1280,height=720 ! mpph264enc ! rtspclientsink latency=100 location=rtsp://10.0.20.193:554/test", NULL);

    gst_element_set_state(pipeline, GST_STATE_PLAYING);



    bus = gst_element_get_bus(pipeline);

    msg = gst_bus_timed_pop_filtered(bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR | GST_MESSAGE_EOS);

    if(msg != NULL)
    {
        gst_message_unref(msg);
    }

    gst_object_unref(msg);

    gst_element_set_state(pipeline, GST_STATE_NULL);

    gst_object_unref(pipeline);
    return 0;
}
  • 编译选项
gcc test_pipeline_2.c -o test_pipeline_2 `pkg-config --cflags --libs gstreamer-1.0` `pkg-config --cflags --libs gstreamer-rtsp-server-1.0`

使用ffmpeg 拉流保存到本地

ffmpeg -i rtsp://admin:WANGfengtu12@10.0.20.70:554/client0x  -vcodec copy out.h264

ffmpeg 推送本地流

ffmpeg -re  -stream_loop -1 -i D:\workspace\test.mp4  -vcodec copy -rtsp_transport tcp -f rtsp rtsp://192.168.3.176:554/s1

ffmpeg -re  -i rtsp://192.168.1.103/car/EdgeCar2 -vcodec copy -rtsp_transport tcp -f rtsp rtsp://192.168.1.109:554/s1

ffmpeg 拉流转发

ffmpeg -i rtsp://10.0.20.193/st1 -s 1080*720 -vcodec copy -f rtsp -rtsp_transport tcp rtsp://10.0.20.193:554/test
ffmpeg -i rtsp://10.0.20.193/st1 -acodec copy -vcodec copy -f rtsp -rtsp_transport tcp rtsp://10.0.20.193:554/test

推送到指定服务器

ffmpeg -re -stream_loop -1 -i test.mp4  -s 1280*720 -vcodec h264 -f rtsp -rtsp_transport tcp rtsp://10.0.20.221:554/test
ffmpeg -re -stream_loop -1 -i .\10daojishi.mp4 -vcodec copy -acodec copy -f rtsp rtsp://10.0.20.109:554/test

使用nvidia 硬编解码 推流

ffmpeg -re -stream_loop -1 -i merge.mp4   -vcodec h264_nvenc -f rtsp -rtsp_transport udp rtsp://10.0.20.193:554/test

设置Gstreamer debug level

export GST_DEBUG=4

rtsp 流服务器

easy-darwin

ZLMediaKit

https://github.com/ZLMediaKit/ZLMediaKit/wiki/%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84%E5%90%AF%E5%8A%A8%E4%B8%8E%E5%85%B3%E9%97%AD
https://github.com/ZLMediaKit/ZLMediaKit/wiki/ZLMediaKit%E6%8E%A8%E6%B5%81%E6%B5%8B%E8%AF%95

  • 启动
cd /home/test/ZLMediaKit/release/linux/Debug
sudo ./MediaServer -d &
  • 关闭
killall -2 MediaServer
  • 推流
ffmpeg -re -i test.mp4 -vcodec h264 -acodec aac -f rtsp -rtsp_transport tcp rtsp://10.0.20.221/live/test

在这里插入图片描述

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

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

相关文章

基于Arduino UNO的循迹小车

目录 1.analogWrite函数的使用 2.红外循迹模块介绍 3.循迹小车代码实现 4.实物示例 1.analogWrite函数的使用 用analogWrite来替换digitalWrite 说明 将一个模拟数值写进Arduino引脚。这个操作可以用来控制LED的亮度, 或者控制电机的转速. 在Arduino UNO控制器中&#…

关于二叉树的操作,详细操作与实现方法

树是数据结构中的重中之重&#xff0c;尤其以各类二叉树为学习的难点。在面试环节中&#xff0c;二叉树也是必考的模块。本文主要讲二叉树操作的相关知识&#xff0c;梳理面试常考的内容。一起来复习吧。 本篇针对面试中常见的二叉树操作作个总结&#xff1a; 前序遍历&#x…

Kubernetes(k8s)容器编排控制器使用

目录 1 Pod控制器1.1 Pod控制器是什么1.2 Pod和Pod控制器1.3 控制器的必要性1.4 常见的控制器1.4.1 ReplicaSet1.4.2 Deployment1.4.3 DaemonSet 2 ReplicaSet控制器2.1 ReplicaSet概述2.2 ReplicaSet功能2.2.1 精确反应期望值2.2.2 保证高可用2.2.3 弹性伸缩 2.3 创建ReplicaS…

专项练习12

目录 一、选择题 1、JavaScript中定义var a"40",var b7,则执行a%b会得到&#xff1f; 2、下面哪个选项中的对象与浏览列表有关&#xff08; &#xff09; 3、下面哪一个语句可以实现在jQuery中找到所有元素的同辈元素&#xff1f; 4、如何阻止IE和各大浏览器默认行为…

CVSS4.0将于2023年底正式发布

通用漏洞评分系统(CVSS)是一种流行的、标准化的方法&#xff0c;用于评估数字系统安全漏洞的严重程度。由事件反应和安全小组论坛(FIRST)开发&#xff0c;它为安全专业人员提供了评估和优先排序风险的一致方法。 目前的CVSS v3.0已经运行了十多年&#xff0c;但因其复杂性和灵…

Jenkins 持续集成:Linux 系统 两台机器互相免密登录

背景知识 我们把public key放在远程系统合适的位置&#xff0c;然后从本地开始进行ssh连接。 此时&#xff0c;远程的sshd会产生一个随机数并用我们产生的public key进行加密后发给本地&#xff0c;本地会用private key进行解密并把这个随机数发回给远程系统。 最后&#xf…

ModaHub魔搭社区:向量数据库MIlvus服务端配置(四)

目录 常见问题 常见问题 除了配置文件外&#xff0c;怎样可以判断我确实在使用 GPU 做搜索&#xff1f; 有以下三种方式&#xff1a; 使用 nvidia-smi 命令查看 GPU 使用情况。用 Prometheus 配置&#xff0c;详见 使用 Grafana 展示监控指标 > 系统运行指标。使用 Milv…

一文教你Mysql如何性能优化

Mysql性能优化 Mysql性能优化 性能优化维度 数据库优化思路 应急调优的思路&#xff1a; 针对突然的业务办理卡顿&#xff0c;无法进行正常的业务处理&#xff01;需要立马解决的场景&#xff01; show processlist&#xff08;查看连接session状态&#xff09; explain(分…

hudi系列-timeline service

Timeline Service(时间线服务)是hudi的一个组件,用于暴露文件系统视图接口给客户端,是一个基于Javalin+Jetty实现的web服务。当客户端使用远程文件系统视图(RemoteHoodieTableFileSystemView)时,就是访问时间线服务http接口 默认情况下,如果开启了时间线服务,则它运行在…

支付中心“收银台“设计方案

01.收银台的产品架构 重点收银台架构的三个方面&#xff1a; 1.公司所支持的收银台种类以未来拓展倾向 2.支付方式的枚举及根据业务发展预判拓展倾向 3.收银台服务端的能力建设规划和选择 02.收银台的业务架构 收银台&#xff0c;是支付的起点&#xff0c;所以无论是何种…

接口自动化测试学习笔记分享(附上视频教程供你学习)

目录 接口自动化测试框架介绍 目录 接口测试场景 自动化测试场景 接口测试在分层测试中的位置 接口自动化测试与 Web/App 自动化测试对比 接口自动化测试与 Web/App 自动化测试对比 接口测试工具类型 为什么推荐 Requests Requests 优势 Requests 环境准备 接口请求…

Java安全——应用安全

Java安全 Java 应用安全 JCE&#xff08;Java Cryptography Extension&#xff09;java加密扩展包 Java Cryptography Extension&#xff08;JCE&#xff09;是一个可选的Java标准扩展&#xff0c;提供了一组用于加密、密钥生成和密钥协商等功能的类和接口。JCE包含了导入、生…

【ChatGpt】解决视频框交换中的平滑过渡的问题

【ChatGpt】解决视频框交换中的平滑过渡的问题 问题抽象chatgpt 看看直接给参考代码 解决效果 问题 在视频的播放中&#xff0c;我们想调换下容器的位置 &#xff0c;在互调的过程中&#xff0c;如果需要重新进行数据的初始化&#xff0c;获取与加载&#xff0c;就会很慢&…

RocketMQ --- 原理篇

一、专业术语 Producer 消息生产者&#xff0c;负责产生消息&#xff0c;一般由业务系统负责产生消息。 Consumer 消息消费者&#xff0c;负责消费消息&#xff0c;一般是后台系统负责异步消费。 Push Consumer Consumer 的一种&#xff0c;应用通常向 Consumer 对象注册一个…

基于JavaScript的百度AI的人脸识别微信小程序(深度学习+机器视觉)含全部工程源码及视频演示(仅供学习)

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. Access token 获取2. 人脸注册3. 人脸删除4. 人脸识别 系统测试工程源代码下载其它资料下载 前言 本项目采用了百度AI的训练模型&#xff0c;利用图像识别接口返回结果&#xff0c;旨在实现人脸在库中的判断&am…

制造业质量管理如何实现数字化转型?这份指南讲透了

一、什么是制造业质量管理 制造业质量管理是现代制造业非常重要的一个方面。它包括了一系列的活动和方法&#xff0c;以确保制造产品或提供服务的过程中&#xff0c;实现高质量标准的目标。 制造业质量管理包括质量规划、控制和改进等各种方法和工具&#xff0c;以确保产品或…

4.25 IO多路复用简介 4.26select API介绍 4.27 select代码编写

4.25 IO多路复用简介 IO多路复用使得程序能同时监听多个文件描述符&#xff0c;能够提高程序的性能&#xff0c;Linux下实现IO多路复用的系统调用主要有select、poll和epoll。 4.26select API介绍 主旨思想&#xff1a; 1、首先构造一个关于文件描述符的列表&#xff…

【高危】Openfire权限绕过漏洞(POC公开)

漏洞描述 Openfire是Java开发且基于XMPP&#xff08;前称Jabber&#xff0c;即时通讯协议&#xff09;的开源实时协作&#xff08;RTC&#xff09;服务器。 在受影响版本中&#xff0c;由于路径验证机制存在缺陷&#xff0c;攻击者可以通过/setup/setup-s/%u002e%u002e/%u002e…

基于Python所写的学生管理系统

点击下方链接获取源码资源&#xff1a; https://download.csdn.net/download/qq_64505944/87950397?spm1001.2014.3001.5503 《学生信息管理系统》程序使用说明 在IDLE中运行《学生信息管理系统》即可进入如图1所示的系统主界面。在该界面中可以选择要使用功能对应的菜单进行…

【编译、链接、装载十四】堆与内存管理

【编译、链接、装载十四】堆与内存管理 一、堆与内存管理1、什么是堆 二、Linux进程堆管理三、Windows进程堆管理Q&A 一、堆与内存管理 相对于栈而言&#xff0c; 堆这片内存面临一个稍微复杂的行为模式&#xff1a; 在任意时刻&#xff0c; 程序可能发出请求&#xff0c;…