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.mzph.cn/bicheng/63175.shtml

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

相关文章

企业风险投资、融资事件数据(1921-2024)

数据包括历年上市与非上市企业的风险投资融资数据等数据&#xff0c;包括融资时间、被投企业、投资方、退出方等数据&#xff0c;希望对大家的研究有所帮助 一、数据介绍 数据名称&#xff1a;企业风险投资、融资事件 数据范围&#xff1a;上市与非上市企业 数据年份&#x…

移远5G模块移植

移远5G模块移植 1.NCM网卡配置2.拨号工具编译3.程序运行 1.NCM网卡配置 1.1、内核配置 打开内核配置界面&#xff0c;并找到USB Network Adapters进行NCM网卡配置 > Device Drivers > Network device support > USB Network Adapters 1.2、驱动修改 打开内核源码钟的…

基于单片机的智能农田灌溉节水系统设计及应用

摘 要 &#xff1a; 针对传统的灌溉方法浪费水资源节水系统设计。该系统从节水角度出发&#xff0c;对传感器和主电路进行了设计&#xff0c;主要采集灌溉地的湿度与温度数据&#xff0c;根据测量土壤中的温度与湿度作为主要参数&#xff0c;对农田灌溉节水系统进行实时控制&am…

煤矿 35kV 变电站 3 套巡检机器人 “上岗”,力破供电瓶颈

近日&#xff0c;杭州旗晟智能科技与甘肃某变电站配电室的三套智能巡检机器人线下测试顺利完成&#xff0c;并成功交付使用&#xff0c;这为电力运维工作注入了全新的活力与强大的技术支撑。 一、项目背景 甘肃某变电站总建筑面积1098平方米的变电站集变电、配电、监控等多功能…

什么是封装性?C++ 中如何实现封装?封装性的好处是什么?

一、引言 在面向对象编程中&#xff0c;封装性是一个重要的概念。封装可以帮助我们更好地组织和管理代码&#xff0c;提高代码的可维护性、可扩展性和安全性。本文将详细介绍什么是封装性&#xff0c;C 中如何实现封装以及封装性的好处。 二、什么是封装性&#xff1f; 封装…

docker 相关问题记录

docker mysql 一直重启解决办法&#xff08;断电或者重启&#xff09; 一直重启。。因为是内部开发&#xff0c;也没有备份最新的。所以不能删了重来。 方法&#xff1a; docker logs mysql5.7 看到错误跟innodb有关。 具体原因可以参考 http://acuilab.com/articles/2019/1…

如何在自动化安全测试中,实现多工具集成与数据融合,以提高对Spring Boot应用程序安全漏洞的检测效率与准确性?

为了在自动化安全测试中实现多工具集成与数据融合&#xff0c;以提高对Spring Boot应用程序安全漏洞的检测效率与准确性&#xff0c;可以采取以下策略和方法&#xff1a; 文章目录 1. 工具选择与集成2. 数据标准化与聚合3. 数据分析与融合4. 持续改进5. 实施示例 1. 工具选择与…

Java快速分组技术解析

在Java开发中&#xff0c;我们经常需要对数据进行分组处理&#xff0c;比如根据某个属性将数据集合中的元素分组。这种需求在处理数据库查询结果、日志分析、报表生成等场景中非常常见。本文将介绍几种Java中快速分组的技术&#xff0c;帮助开发者提高数据处理的效率。 1. 使用…

龙蜥 Linux 安装 JDK

龙蜥 Linux 安装 JDK 下载安装解压到目标路径设置环境变量直接在启动脚本中临时设置 参考资料 下载 这个就不赘述了&#xff0c;参考资料中的另外两篇安装帖&#xff0c;都有。 如果不能上网&#xff0c;也可以去内网其他之前装过JDK的服务器&#xff0c;直接复制过来。 tar …

Linux中Crontab(定时任务)命令详解

文章目录 Linux中Crontab&#xff08;定时任务&#xff09;命令详解一、引言二、Crontab的基本使用1、Crontab命令格式2、Crontab常用操作 三、Crontab的配置与服务管理1、配置Crontab2、服务管理 四、使用示例1、每天凌晨2点备份网站数据2、每周一凌晨3点清理临时文件3、每月的…

记录学习《手动学习深度学习》这本书的笔记(三)

这两天看完了第六章&#xff1a;卷积神经网络&#xff0c;巧的是最近上的专业选修课刚讲完卷积神经网络&#xff0c;什么卷积层池化层听得云里雾里的&#xff0c;这一章正好帮我讲解了基础的知识。 第六章&#xff1a;卷积神经网络 6.1 从全连接层到卷积 在之前的学习中&…

测试知识-高阻示波器的探头补偿

目录 探头补偿 探头补偿 调节补偿电容 调节补偿电容 探头补偿 设计到一个知识盲点&#xff0c;刚好复习补充下 探头补偿 理论知识 示波器和 10:1 探头的简化模型如上图所示&#xff0c;其中示波器的输入阻抗为 RscopeRscope​&#xff0c;探头的补偿电容为 CcompCcomp​。…

低空经济的第一助推力,基于鸿道Intewell操作系统的无人机控制系统

低空经济背景 低空经济是指利用低空空域资源进行经济活动的总和&#xff0c;包括无人机、通用航空、低空物流等新兴产业。近年来&#xff0c;随着技术的不断突破和政策的支持&#xff0c;低空经济正逐渐成为全球瞩目的新经济增长点。在中国&#xff0c;低空经济的发展受到了政…

windows 上ffmpeg编译好的版本选择

1. Gyan.dev Gyan.dev 是一个广受信赖的 FFmpeg 预编译库提供者&#xff0c;提供多种版本的 FFmpeg&#xff0c;包括静态和动态链接版本。 下载链接: https://www.gyan.dev/ffmpeg/builds/ 特点&#xff1a; 提供最新稳定版和开发版。 支持静态和共享&#xff08;动态&…

Spring Boot微服务应用实战:构建高效、可扩展的服务架构

在当今的软件开发领域&#xff0c;微服务架构凭借其高度的灵活性、可扩展性和可靠性&#xff0c;已成为众多企业的首选。而Spring Boot&#xff0c;作为Spring框架的一个子项目&#xff0c;以其简洁的API、快速的应用启动以及内嵌的Servlet容器等特点&#xff0c;成为了构建微服…

什么是IndexedDB?有什么特点

IndexedDB 是一种在用户浏览器中存储大量结构化数据的低级API。它是一种事务性数据库系统&#xff0c;允许Web应用程序保存和检索复杂的数据类型&#xff0c;如文件或二进制大对象&#xff08;BLOB&#xff09;。与 localStorage 和 sessionStorage 不同&#xff0c;IndexedDB …

软件测试基础详解(自动化测试/安全测试/性能测试)

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 自动化测试的意义 缩短软件开发测试周期&#xff0c;可以让产品更快投放市场 测试效率高&#xff0c;充分利用硬件资源 节省人力资源&#xff0c;降低测试成本 …

最小二乘法实际应用

最小二乘法 使用最小二乘法拟合大气二氧化碳浓度数据 数据保存在monthly_co2.xls文件中(只截取部分) python需要安装的库 xlrdnumpypandasmatplotlib 绘制图像代码(绘制整体数据趋势图) # -*- coding: utf-8 -*- """ File : 绘制趋势图.py Time : …

HTML5系列(13)-- 微数据与结构化数据指南

前端技术探索系列&#xff1a;HTML5 微数据与结构化数据指南 &#x1f4ca; 致读者&#xff1a;探索数据语义化的世界 &#x1f44b; 前端开发者们&#xff0c; 今天我们将深入探讨 HTML5 微数据与结构化数据&#xff0c;学习如何让网页内容更易被搜索引擎理解和解析。 微数…

原生html+css+ajax实现二级下拉选择的增删改及树形结构列出

<?php $db_host localhost; $db_user info_chalide; $db_pass j8c2rRr2RnA; $db_name info_chalide; /* 数据库结构SQL CREATE TABLE categories ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, parent_id INT DEFAULT 0 ); */ try { $pdo new PD…