Linux 35.6 + JetPack v5.1.4之RTP实时视频Python框架

Linux 35.6 + JetPack v5.1.4之RTP实时视频Python框架

  • 1. 源由
  • 2. 思路
  • 3. 方法论
    • 3.1 扩展思考 - 慎谋而后定
    • 3.2 扩展思考 - 拒绝拖延或犹豫
    • 3.3 扩展思考 - 哲学思考
    • 3.4 逻辑实操 - 方法论
  • 4 准备
  • 5. 分析
    • 5.1 gst-launch-1.0
      • 5.1.1 xvimagesink
      • 5.1.2 nv3dsink
      • 5.1.3 nv3dsink + sync=0
      • 5.1.4 xvimagesink + sync=0
    • 5.2 python framework
      • 5.2.1 xvimagesink
      • 5.2.2 nv3dsink
      • 5.2.3 xvimagesink + sync=0
      • 5.2.4 nv3dsink + sync=0
  • 6. 总结 & 优化
  • 7. 补充 - RTP/RTSP推/拉流

1. 源由

鉴于目前 DeepStream 的代码没有基于RTP实时视频流分析的 Python Demo 代码,但是是有RTSP的示例。

  • DeepStream 示例代码
ApplicationDescription
deepstream-test14-class object detection pipeline - now also demonstrates support for new nvstreammux
deepstream-test24-class object detection, tracking, and attribute classification pipeline
deepstream-test3Multi-stream pipeline performing 4-class object detection - now also supports Triton inference server, no-display mode, file-loop, and silent mode
deepstream-test4msgbroker for sending analytics results to the cloud
deepstream-imagedata-multistreamMulti-stream pipeline with access to image buffers
deepstream-ssd-parserSSD model inference via Triton server with output parsing in Python
deepstream-test1-usbcamdeepstream-test1 pipeline with USB camera input
deepstream-test1-rtsp-outdeepstream-test1 pipeline with RTSP output
deepstream-opticalflowOptical flow and visualization pipeline with flow vectors returned in NumPy array
deepstream-segmentationSegmentation and visualization pipeline with segmentation mask returned in NumPy array
deepstream-nvdsanalyticsMultistream pipeline with analytics plugin
runtime_source_add_deleteAdd/delete source streams at runtime
deepstream-imagedata-multistream-redactionMulti-stream pipeline with face detection and redaction
deepstream-rtsp-in-rtsp-outMulti-stream pipeline with RTSP input/output - now takes new command line argument “–rtsp-ts” for configuring the RTSP source to attach the timestamp rather than the streammux
deepstream-preprocess-testMulti-stream pipeline using nvdspreprocess plugin with custom ROIs
deepstream-demux-multi-in-multi-outMulti-stream pipeline using nvstreamdemux plugin to generate separate buffer outputs
deepstream-imagedata-multistream-cupyAccess imagedata buffer from GPU in a multistream source as CuPy array - x86 only
deepstream-segmaskAccess and interpret segmentation mask information from NvOSD_MaskParams
deepstream-custom-binding-testDemonstrate usage of NvDsUserMeta for attaching custom data structure - see also the Custom User Meta Guide

2. 思路

为此,计划先写一个基于RTP视频流的框架,然后从RTSP示例中移植 DeepStream代码。

通常需要思考以下基本问题:

  • Why (为什么)
  • When (何时)
  • What (什么)
  • Who (谁)
  • Where (哪里)
  • How (如何)

上述基本问题,拍脑袋一想:

  1. 从逻辑上应该是通的,因为RTSP其实就是RTP上的控制信息,理论上GST就是支持RTP;// Why (为什么)
  2. 实际上官方为什么这么基础的示例没有,目前论坛上也有人问,但是似乎也没有找到;// Where (哪里)
  3. 别人为什么没有做,大概是哪些人会要做这个;// What (什么) Who (谁)
  4. 是不是太简单了?不值得做?hello world也很简单,但是也有很多示例就是这种 // How (如何)

从底层逻辑思维去想这个问题,可能大家就不能想象一个问题:性能

注:当初并没有想到这个问题点,但是随着一步一步的深入分析和理解,感觉主要是由于RTP带来后续一系列的问题,尤其是性能方面。

3. 方法论

“谋而后动,不是不动”的俗语提醒我们:

  1. 做事要有计划,不要盲目行动。
  2. 计划的目的是为了更好地行动,而不是让行动停滞。
  3. 行动中要灵活调整,避免纸上谈兵。

这句话体现了一种高效的处事智慧:思考为行动铺路,行动为思考赋能,最终实现知行合一。

3.1 扩展思考 - 慎谋而后定

核心意思:行动前要进行充分的思考和计划,但“谋”并非拖延,而是为了行动提供更好的方向。

示例:
一个企业在推出新产品前,进行市场调研和风险分析,是“谋”;调研完成后,果断投入资源推广,是“后动”。

3.2 扩展思考 - 拒绝拖延或犹豫

核心意思:谋划的目的是为了更好的行动,而不是找借口拖延行动。

示例:
在学习和工作中,设定目标后过于纠结细节而迟迟不开始,实际上是一种拖延心态。

3.3 扩展思考 - 哲学思考

核心意思:谋划是智慧的体现,行动是实践的体现,二者统一于“知行合一”。

真正的成功,不仅需要思想上的高度,还需要行动上的落实。“谋而后动”强调思考的重要性,但同时否定“以思代行”。

3.4 逻辑实操 - 方法论

逻辑思路很简单,会想会说的人很多,但是要能够真正落地,需要实操的方法论来保证。

评价工程师技术能力,并不是过去的经验、成就。因为能力不是过去式,而是潜在的将来式。

如何从方法论角度确保能力的体现,最重要的几个大步骤:

  • 会想
  • 会说
  • 会写
  • 会做
  • 总结
  • 优化 //这个就是继续回归到“会想”,循环螺旋式上升高度

4 准备

注:关于环境安装,就不多说了,想了解的,请参阅:Linux 35.6 + JetPack v5.1.4@DeepStream安装

准备工作主要是测试数据+验证代码+测试方法+测试环境,没有这些东西,上来就喊是没有人理你的。因此,主要准备以下内容:

  1. video-viewer 命令及参数
  2. gst-launch-1.0 命令及参数
  3. python RTP 框架测试代码
  4. 依据上述命令和测试代码进行测试,整理测试结果

然后,专业的事情找专业的人:

  • Request python deepstream demo based on RTP video feed

搜索找不到,不代表没有,看看能否通过技术支持找到一些有用信息。

  • Is it correct that DeepStream Python bindings cannot be used to analyze RTP video streams?

如果没有,是否技术上存在难点?或者暂时无法搞清楚的一些背景原因。

  • Gst-launch-1.0 only get 15FPS on jetson orin?

测试下来效果并不理想,为什么?通过数据、示例代码,与技术人员互动,寻找解决方案,远比坐井观天来的实在。

  • DeepStream 1.1.8 demo app deepstream-test1 failed

后续集成或者PortingDeepStream代码。

环境配置如下:

Software part of jetson-stats 4.2.12 - (c) 2024, Raffaello Bonghi
Model: NVIDIA Orin Nano Developer Kit - Jetpack 5.1.4 [L4T 35.6.0]
NV Power Mode[0]: 15W
Serial Number: [XXX Show with: jetson_release -s XXX]
Hardware:- P-Number: p3767-0005- Module: NVIDIA Jetson Orin Nano (Developer kit)
Platform:- Distribution: Ubuntu 20.04 focal- Release: 5.10.216-tegra
jtop:- Version: 4.2.12- Service: Active
Libraries:- CUDA: 11.4.315- cuDNN: 8.6.0.166- TensorRT: 8.5.2.2- VPI: 2.4.8- OpenCV: 4.9.0 - with CUDA: YES
DeepStream C/C++ SDK version: 6.3Python Environment:
Python 3.8.10GStreamer:                   YES (1.16.3)NVIDIA CUDA:                   YES (ver 11.4, CUFFT CUBLAS FAST_MATH)OpenCV version: 4.9.0  CUDA TrueYOLO version: 8.3.33Torch version: 2.1.0a0+41361538.nv23.06Torchvision version: 0.16.1+fdea156
DeepStream SDK version: 1.1.8

5. 分析

  • 个人长期工作在0~1的过程,换句话说就是从不知道到知道的过程。
  • 在实际工作中,一开始的思路会相对来说发散(但是基于假设场景的有限发散),这句话很拗口,仔细体会。
  • 通常随着逐步深入和细化,问题将会呈现收敛。
  • 随之形成局部或者部分结论,此时,Root cause逐步呈现。

鉴于video-viewer工具在1080P@60Hz的RTP源上稳定获得60FPS的视频流,从逻辑角度以下两条线都应该呈现该性能。

5.1 gst-launch-1.0

关于这个gst-launch-1.0命令和参数,网上搜,自己慢慢的积累,多了就知道大概了,然后要孜孜不倦的问问题,呵呵!

  • xvimagesink 软的
  • nv3dsink 有硬件加速
  • sync=0 即时处理 // NVIDIA论坛上,专家反馈。不是“砖家”,大家懂得!!!

5.1.1 xvimagesink

gst-launch-1.0 -v udpsrc port=5600 ! application/x-rtp,encoding-name=H265,payload=96 ! rtph265depay ! h265parse ! nvv4l2decoder ! nvvidconv ! fpsdisplaysink text-overlay=0 video-sink=xvimagesink

/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 9, dropped: 6, fps: 7.35, drop rate: 5.51
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 11, dropped: 10, fps: 3.86, drop rate: 7.73
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 19, dropped: 11, fps: 15.00, drop rate: 1.87
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 23, dropped: 15, fps: 7.61, drop rate: 7.61
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 30, dropped: 17, fps: 11.30, drop rate: 3.23
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 34, dropped: 20, fps: 6.83, drop rate: 5.13

5.1.2 nv3dsink

gst-launch-1.0 -v udpsrc port=5600 ! application/x-rtp,encoding-name=H265,payload=96 ! rtph265depay ! h265parse ! nvv4l2decoder ! fpsdisplaysink text-overlay=0 video-sink=nv3dsink

/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 13, dropped: 6, fps: 18.44, drop rate: 1.84
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 17, dropped: 9, fps: 7.88, drop rate: 5.91
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 25, dropped: 10, fps: 15.16, drop rate: 1.90
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 29, dropped: 14, fps: 7.83, drop rate: 7.83
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 35, dropped: 17, fps: 11.38, drop rate: 5.69
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 42, dropped: 20, fps: 12.73, drop rate: 5.45

5.1.3 nv3dsink + sync=0

gst-launch-1.0 -v udpsrc port=5600 ! application/x-rtp,encoding-name=H265,payload=96 ! rtph265depay ! h265parse ! nvv4l2decoder ! fpsdisplaysink text-overlay=0 video-sink=nv3dsink sync=0

/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 30, dropped: 0, current: 59.51, average: 59.51
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 61, dropped: 0, current: 60.00, average: 59.76
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 91, dropped: 0, current: 59.70, average: 59.74

5.1.4 xvimagesink + sync=0

gst-launch-1.0 -v udpsrc port=5600 ! application/x-rtp,encoding-name=H265,payload=96 ! rtph265depay ! h265parse ! nvv4l2decoder ! nvvidconv ! fpsdisplaysink text-overlay=0 video-sink=xvimagesink sync=0

/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 70, dropped: 0, current: 67.39, average: 69.26
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 100, dropped: 0, current: 59.61, average: 66.05
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 129, dropped: 0, current: 57.52, average: 63.92

5.2 python framework

Python其实是通过中间GST-Python --> PyBindings --> Data流程获取的数据,从pipline的角度,其实和gst-launch-1.0没什么差别。关于这个GST-Python和相关底层库和Python组件安装,详见:Linux 35.6 + JetPack v5.1.4@DeepStream安装

在这里插入图片描述

5.2.1 xvimagesink

源代码:python xvimagesink

性能: ~15FPS

5.2.2 nv3dsink

源代码:python nv3dsink

性能: ~20FPS

5.2.3 xvimagesink + sync=0

daniel@daniel-nvidia:~/Work/jetson-fpv$ python3 ./utils/deepstream_xvimagesink.py 5600
Selected Pipeline: udpsrc port=5600 ! application/x-rtp,encoding-name=H265,payload=96 ! rtph265depay ! h265parse ! nvv4l2decoder ! nvvidconv ! xvimagesink sync=0
Pipeline elements:
- capsfilter0
- xvimagesink0
- nvvconv0
- nvv4l2decoder0
- h265parse0
- rtph265depay0
- udpsrc0
Opening in BLOCKING MODE
Running...
NvMMLiteOpen : Block : BlockType = 279
NvMMLiteBlockCreate : Block : BlockType = 279
FPS: 36.96
FPS: 58.96
FPS: 59.95
FPS: 59.93
FPS: 59.93
FPS: 60.98
FPS: 58.94
FPS: 59.93
FPS: 60.94
^CExiting...
deepstream done!

5.2.4 nv3dsink + sync=0

daniel@daniel-nvidia:~/Work/jetson-fpv$ python3 ./utils/deepstream.py 5600
Selected Pipeline: udpsrc port=5600 buffer-size=8388608 ! application/x-rtp,encoding-name=H265,payload=96 ! rtph265depay ! h265parse ! nvv4l2decoder ! nv3dsink name=sink sync=0
Opening in BLOCKING MODE
Running...
NvMMLiteOpen : Block : BlockType = 279
NvMMLiteBlockCreate : Block : BlockType = 279
FPS: 17.03
FPS: 59.95
FPS: 59.94
FPS: 59.93
FPS: 59.93
FPS: 59.96
FPS: 59.98
^CExiting...
deepstream done!

6. 总结 & 优化

通过一个简单的RTP实时视频Python框架遇到的问题,以及通过方法论来解决问题,大致的思路和步骤,做一个简单的整理。

其实工程问题远比科学问题简单,因为工程问题通常是有结论的。而科学问题,有时候会走到死胡同的。只要学会方法论,通过底层逻辑就能快速的解决工程技术问题。


优化的代码版本,稳定获取FPS 60Hz的数据,这个与我们在video-viewer上看到的一致。

基于这个版本,我们去做DeepStream算法才是有意义的,否则源头上就FPS存在问题。

源代码:python nv3dsink + sync=0

7. 补充 - RTP/RTSP推/拉流

因为,很多DEMO都是RTSP的,所以这里给下几个常用命令:

注:笔者有一个1080P@60FPS的设备可以稳定输出各种编码和分辨率以及帧率的视频;没有这种视频源的朋友,可能需要一些模拟源,就可能用到下面的命令。

  • RTSP推/拉流
gst-launch-1.0 -v videotestsrc ! x264enc ! rtph264pay ! udpsink host=<IP_ADDRESS> port=5000
gst-launch-1.0 -v rtspsrc location=rtsp://<RTSP_SERVER_IP>:<PORT>/stream ! decodebin ! autovideosink
  • RTP推/拉流
gst-launch-1.0 -v videotestsrc ! x264enc ! rtph264pay ! udpsink host=<IP_ADDRESS> port=5000
gst-launch-1.0 -v udpsrc port=5000 ! application/x-rtp,media=video,encoding-name=H264,payload=96 ! rtph264depay ! decodebin ! autovideosink
  • 循环播放指定文件

在Jetson Orin板子上,可以用以下工具,非常简单的循环播放一个视频来做测试:

$ video-viewer file:///$(pwd)/<your video file> rtp://127.0.0.1:5000 --input-loop=-1 --headless  --ouput-codec=h265
$ video-viewer rtp://@:5000

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

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

相关文章

渤海证券基于互联网环境的漏洞主动防护方案探索与实践

来源&#xff1a;中国金融电脑 作者&#xff1a;渤海证券股份有限公司信息技术总部 刘洋 伴随互联网业务的蓬勃发展&#xff0c;证券行业成为黑客进行网络攻击的重要目标之一&#xff0c;网络攻击的形式也变得愈发多样且复杂。网络攻击如同悬于行业之上的达摩克利斯之剑&…

隐私安全大考,Facebook 如何应对?

随着数字时代的到来和全球互联网用户的快速增长&#xff0c;隐私安全问题已上升为网络世界的重要议题。社交媒体巨头Facebook因其庞大的用户群体和大量的数据处理活动&#xff0c;成为隐私问题的聚焦点。面对隐私安全的大考&#xff0c;Facebook采取了一系列策略来应对这些挑战…

04 创建一个属于爬虫的主虚拟环境

文章目录 回顾conda常用指令创建一个爬虫虚拟主环境Win R 调出终端查看当前conda的虚拟环境创建 spider_base 的虚拟环境安装完成查看环境是否存在 为 pycharm 配置创建的爬虫主虚拟环境选一个盘符来存储之后学习所写的爬虫文件用 pycharm 打开创建的文件夹pycharm 配置解释器…

旅游管理系统的设计与实现

文末获取源码和万字论文&#xff0c;制作不易&#xff0c;感谢点赞支持。 毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;旅游管理系统的设计与实现 摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#…

QT 中 sqlite 数据库使用

一、前提 --pro文件添加sql模块QT core gui sql二、使用 说明 --用于与数据库建立连接QSqlDatabase--执行各种sql语句QSqlQuery--提供数据库特定的错误信息QSqlError查看qt支持的驱动 QStringList list QSqlDatabase::drivers();qDebug()<<list;连接 sqlite3 数据库 …

HENU祖传课堂测试第三弹:Java的文件输入输出

题目&#xff1a;设定文件file1内容&#xff1a;年级,班级&#xff0c;学号&#xff0c;姓名分为四行。 读取文件file1中的内容&#xff0c;若其字符<3个将其转入file2,如若是字符&#xff1e;3个转入file3 代码如下 import java.io.*; import java.nio.file.*; import j…

React Native 速度提升 550%

React Native 爱好者们!🌟 您准备好听一些激动人心的消息了吗?React Native 刚刚发布了其最大的更新之一:一种全新的架构,彻底改变了我们构建移动应用程序的方式。如果您想知道这对您的项目和开发体验意味着什么,请继续关注!我们正在深入探讨这个改变游戏规则的事物;您…

Qt中的 tableView 设置 二进制 十六进制 序号表头

二 进制序号 因为QTableView的垂直表头并不支持使用委托来自定义。 相反&#xff0c;可以通过将自定义的QWidget作为QHeaderView的标签来实现这一目标。 代码&#xff1a; #include <QApplication> #include <QMainWindow> #include <QVBoxLayout> #include …

中国移动量子云平台:算力并网590量子比特!

在技术革新的浪潮中&#xff0c;量子计算以其独特的并行处理能力和指数级增长的计算潜力&#xff0c;有望成为未来技术范式变革和颠覆式创新应用的新源泉。中国移动作为通信行业的领军企业&#xff0c;致力于量子计算技术研究&#xff0c;推动量子计算产业的跨越式发展。 量子云…

D614 PHP+MYSQL +失物招领系统网站的设计与现 源代码 配置 文档

失物招领系统 1.摘要2. 系统开发的背景和意义3.功能结构图4.界面展示5.源码获取 1.摘要 随着互联网的迅速发展&#xff0c;人们的生产生活方式逐渐发生改变&#xff0c;传统的失物招领也可以通过网络处理。本网站是基PHP技术的一款综合性较强的西南民族大学PHP失物招领系统。 …

YOLOv8实战道路裂缝缺陷识别

本文采用YOLOv8作为核心算法框架&#xff0c;结合PyQt5构建用户界面&#xff0c;使用Python3进行开发。YOLOv8以其高效的实时检测能力&#xff0c;在多个目标检测任务中展现出卓越性能。本研究针对道路裂缝数据集进行训练和优化&#xff0c;该数据集包含丰富的道路裂缝图像样本…

并发编程(15)——基于同步方式的线程安全的栈和队列

文章目录 十四、day141. 线程安全的栈1.1 存在隐患的栈容器1.2 优化后的栈容器 2. 线程安全的队列2.1 基于智能指针的线程安全的队列2.2 不同互斥量管理队首、队尾的队列 十四、day14 在并发编程&#xff08;1&#xff09;并发编程&#xff08;5&#xff09;中&#xff0c;我们…

容器第五天(day042)

1.安装 yum install -y docker-compose 2.配置 配置文件名字&#xff1a;docker-compose.yaml或docker-compose.yml 3.启动 docker-compose up -d

离散数学重点复习

第一章.集合论 概念 1.集合是不能精确定义的基本数学概念.通常是由指定范围内的满足给定条件的所有对象聚集在一起构成的 2.制定范围内的每一个对象称为这个集合的元素 3.固定符号如下: N:自然数集合 Z:整数集合 Q:有理数集合 R:实数集合 C:复数集合 4.集合中的元素是…

docker学习笔记(四)--DockerFile

文章目录 一、什么是Dockerfile二、docker build命令三、dockerfile指令3.1 FROM3.2 ENV3.3 WORKDIR3.4 RUN3.5 CMD3.6 ENTRYPOINT3.7 EXPOSE3.8 ARG3.9 ADD3.10 COPY3.11 VOLUME 四、dockerfile示例 一、什么是Dockerfile Dockerfile 是用于构建 Docker 镜像的脚本文件&#…

动手学深度学习-线性神经网络-1线性回归

目录 线性回归的基本元素 线性模型 损失函数 解析解 随机梯度下降 用模型进行预测 矢量化加速 正态分布与平方损失 从线性回归到深度网络 神经网络图 生物学 小结 回归&#xff08;regression&#xff09;是能为一个或多个自变量与因变量之间关系建模的一类方法。…

BERT模型的输出格式探究以及提取出BERT 模型的CLS表示,last_hidden_state[:, 0, :]用于提取每个句子的CLS向量表示

说在前面 最近使用自己的数据集对bert-base-uncased进行了二次预训练&#xff0c;只使用了MLM任务&#xff0c;发现在加载训练好的模型进行输出CLS表示用于下游任务时&#xff0c;同一个句子的输出CLS表示都不一样&#xff0c;并且控制台输出以下警告信息。说是没有这些权重。…

设计模式:18、组合模式

目录 0、定义 1、组合模式的三种角色 2、组合模式的UML类图 3、示例代码 0、定义 将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使用户对单个对象和组合对象的使用具有一致性。 1、组合模式的三种角色 抽象组件&#xff08;Component&#xff09;&#…

Canal 深入解析:从原理到实践的全面解读

Canal 深入解析&#xff1a;从原理到实践的全面解读 官网&#xff1a;https://github.com/alibaba/canal Canal 是阿里巴巴开源的一款分布式增量数据同步工具&#xff0c;广泛应用于数据同步、实时数据处理和数据库的增量备份等场景。它可以通过监听 MySQL 数据库的 binlog&am…

LCD1602液晶显示屏指令详解

文章目录 LCD1602液晶显示屏1.简介2. 液晶引脚说明3. 指令介绍3.1 清屏指令3.2 光标归位指令3.3 进入模式设置指令3.4 显示开关设置指令3.5 设定显示或光标移动方向指令3.6 功能设定指令3.7 设定CGRAM地址指令3.8 设定DDRAM地址指令3.9 读取忙或AC地址指令3.10 总图3.11 DDRAM …