FPGA实现SDI视频H265压缩网络推流输出,基于VCU架构,支持12G-SDI 4K60帧,提供工程源码和技术支持

目录

  • 1、前言
    • 工程概述
    • 免责声明
  • 2、相关方案推荐
    • 我这里已有的视频图像编解码方案
    • 本博已有的 SDI 编解码方案
  • 3、详细设计方案
    • 设计框图
    • FPGA开发板
    • 视频输入
    • SDI硬件均衡器LMH1219
    • UHD-SDI GT SDI视频解串
    • SMPTE UHD-SDI RX SUBSYSTEM SDI视频解码
    • Video Frame Buffer Write
    • Zynq UltraScale+ VCU
    • PetaLinux 工程编译
    • VLC播放器
    • 工程源码架构
  • 4、Vivado工程源码详解
  • 5、工程移植说明
    • vivado版本不一致处理
    • FPGA型号不一致处理
    • 其他注意事项
  • 6、上板调试验证并演示
    • 准备工作
    • 配置Xshell
    • 配置开发板IP
    • 配置输入视频
    • 配置H265视频压缩
    • 配置VLC播放器
    • VLC播放H265码流视频演示
  • 7、福利:工程源码获取

FPGA实现SDI视频H265压缩网络推流输出,基于VCU架构,支持12G-SDI 4K60帧,提供工程源码和技术支持

1、前言

Xilinx Zynq UltraScale+ ZUEV系列FPGA自带VCU视频编解码功能,VCU有以下特点:
• 支持多达 32 个流的同步编码和解码 (最大聚合带宽为3840x2160 @ 60fps)
• 低时延速率控制
• 灵活的速率控制:CBR、 VBR 和常量 QP
• 支持分辨率高达 4K UHD @ 60 Hz 的同步编码和解码
• 支持 8 K UHD (~15 Hz) 的降低帧速率

工程概述

本设计采用Zynq UltraScale+MPSoCs–XCZU4EV的高端型号FPGA实现SDI视频H265压缩网络推流输出;输入源为笔记本电脑接入HDMI转SDI盒子,输出SDI视频给FPGA;也可以使用SDI彩条发生器或者SDI相机直接输出给FPGA;SDI视频接入FPGA开发板板载的TI公司的LMH1219芯片做均衡处理,同时将单端信号转为差分信号;然后视频进入Xilinx官方提供的UHD-SDI GT IP核做解串处理,该IP调用GTH高速接口资源将SDI视频解串为AXI4-Stream视频流和控制流,然后进入Xilinx官方提供的SMPTE UHD-SDI RX SUBSYSTEM IP核做SDI视频解码处理,将视频转为RGB;到这里,12G-SDI 视频解码工作就完成了,解码后的视频为并行的TTL电平的数据,此时可以供用户做后续处理,比如缓存、颜色转换、缩放、图像识别等;然后然后调用Xilinx官方的Video Frame Buffer Write IP核将SDI视频写入PS侧的DDR4中缓存;然后然后调用Xilinx官方的Zynq UltraScale+ VCU IP核读出图像并作H265压缩;至此,整个FPGA工程已经完成;然后编译工程,导出.xsa文件,并在PetaLinux中做嵌入式Linux启动文件,在Linux软件设计中,将压缩的H265视频码流通过TCP协议从网口发送出去,在PC端可通过LVC播放器播放压缩的H265码流;然后将做好的Linux启动文件复制到TF卡中,插上TF卡即可启动Linux系统,在Xshell中即可操作终端进行配置;

本设计提供资源如下:
• 提供一套XCZU4EV开发板
• 提供一套Vivado2020.2版本的工程源码
• 提供一套编译好的固件,可启动Linux系统

本博客详细描述了Xilinx系列Zynq UltraScale+MPSoCs–XCZU4EV的高端型号FPGA做基于VCU的H265视频压缩的设计方案,工程代码可综合编译上板调试,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做学习提升,可应用于医疗、军工等行业的高速接口或图像处理领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;

免责声明

本工程及其源码即有自己写的一部分,也有网络公开渠道获取的一部分(包括CSDN、Xilinx官网、Altera官网以及其他开源免费获取渠道等等),若大佬们觉得有所冒犯,请私信批评教育;部分模块源码转载自上述网络,版权归原作者所有,如有侵权请联系我们删除;基于此,本工程及其源码仅限于读者或粉丝个人学习和研究,禁止用于商业用途,若由于读者或粉丝自身原因用于商业用途所导致的法律问题,与本博客及博主无关,请谨慎使用。。。

2、相关方案推荐

我这里已有的视频图像编解码方案

我这里有图像的JPEG解压缩、JPEG-LS压缩、H264编解码、H265编解码以及其他方案,后续还会出更多方案,我把他们整合在一个专栏里面,会持续更新,专栏地址:
直接点击前往

本博已有的 SDI 编解码方案

我的博客主页开设有SDI视频专栏,里面全是FPGA编解码SDI的工程源码及博客介绍;既有基于GS2971/GS2972的SDI编解码,也有基于GTP/GTX资源的SDI编解码;既有HD-SDI、3G-SDI,也有6G-SDI、12G-SDI等;专栏地址链接如下:
点击直接前往

3、详细设计方案

设计框图

本设计使用的工程详细设计方案框图如下:
在这里插入图片描述

FPGA开发板

本UP主有下列FPGA开发板均可实现4K@60Hz视频 HDMI2.0的收发,本博客仅仅是介绍了其中Zynq UltraScale+系列的开发板实现方案,关于本博客使用的这款开发板详细信息,请参考我之前的博客,对这块开发板感兴趣的朋友可以咨询本UP获得;博客链接如下:
点击直接前往

视频输入

输入源为笔记本电脑接入HDMI转SDI盒子,输出SDI视频给FPGA;架构如下:
在这里插入图片描述
如需支持12G SDI 4K60帧,你的笔记本电脑要能够输出4K@60Hz分辨率才行,可通过查看显示驱动版本确定是否支持4K@60Hz分辨率,一般驱动版本在20.0以上就是支持输出4K的;参考如下:
在这里插入图片描述
演示用的例程仅作1080P输入;
也可以使用SDI彩条发生器或者SDI相机直接输出给FPGA;
本博主热爱SDI视频开发,自研了一款12G-SDI彩条发生器,如下:
在这里插入图片描述
该设备价格低廉但很好用,可产生3G、6G、12G等多种分辨率的SDI视频彩条,通过一个按键切换,具体切换逻辑如下:
上电默认输出1080P@60Hz的彩条;
按第一下按键:输出1080P@50Hz的彩条;
按第二下按键:输出4K@60Hz的彩条;
按第三下按键:输出4K@50Hz的彩条;
按第四下按键:输出4K@30Hz的彩条;
按第五下按键:输出4K@25Hz的彩条;
该彩条发生器非常适合做SDI视频输入源,需要它的朋友,向本博主可有偿提供;

SDI硬件均衡器LMH1219

SDI接收端使用TI公司的LMH1219芯片做均衡处理,同时将单端信号转为差分信号,最高支持12G-SDI;
LMH1219和LMH1218可做硬件回环处理,这样可以将SDI视频做到极低的延时,本设计默认做了硬件回环处理,若需要FPGA接收SDI视频经处理再输出,需要i2c总线配置LMH1218,本设计工程即是这种方式;
另外,需要做LMH1219和LMH1218硬件回环的朋友,可联系本博主有偿提供硬件设计或成品;

UHD-SDI GT SDI视频解串

工程使用Xilinx官方提供的UHD-SDI GT IP核,可解串和串化3G、6G、12G SDI视频,本设计配置为最高的2G SDI,可向下兼容3G SDI、6G SDI视频,如下:
在这里插入图片描述
该IP直接调用GTH高速接口资源实现SDI视频的解串与串化,使用和配置非常方便,但需要指定SDI硬件连接的GT块位置和GT时钟引脚,此外,该IP不需要软件配置,可使用官方例程进行配套连接;

SMPTE UHD-SDI RX SUBSYSTEM SDI视频解码

工程使用Xilinx官方提供的SMPTE UHD-SDI RX SUBSYSTEM,可解码3G、6G、12G SDI视频,本设计配置为12G SDI,可向下兼容3G SDI、6G SDI视频,如下:
在这里插入图片描述
该IP需要软件配置,本设计提供了vitis软件驱动,详情请参考vitis工程;

Video Frame Buffer Write

Video Frame Buffer Write相当于精简版的VDMA,只具有视频写入DDR的功能,与VDMA相比具有YUV视频写入的功能,配置如下:
在这里插入图片描述
在Linux设计中可以对视频写入的基地址进行配置,通过终端指令配置;

Zynq UltraScale+ VCU

Zynq UltraScale+ VCU是Xilinx Zynq UltraScale+ ZUEV系列FPGA才有的IP,可以实现最高4K60帧的视频压缩和解压,IP的官方文档是《PG252》,读者可以自行前往阅读,Zynq UltraScale+ VCU配置如下:
在这里插入图片描述
输入视频格式为YUV420,最高分辨率配置为4K60帧;

PetaLinux 工程编译

注意!!!
注意!!!
注意!!!
本博主已经提供好已制作完成的启动文件,理论上PetaLinux 工程编译不不要您重复再做,如果您感兴趣,则可以做这一步。。。

PetaLinux版本:PetaLinux版本为2020.2,因为vivado用的vivado202.2,为了兼容性,建议使用与之配套的PetaLinux2020.2;
运行环境:Ubuntu操作系统,我用的Win10上虚拟机搭建的Ubuntu,当然也可以使用直接装Ubuntu操作系统的电脑;

第1步:导出vivado工程的.xsa文件,并放到Ubuntu下你新建的文件夹中;同时下载我们提供的BSP包,也放到Ubuntu下你新建的文件夹中;然后改变其用户权限,如下图:
• 终端指令:sudo chmod -R 777 文件名
在这里插入图片描述
第2步:配置PetaLinux2020.2环境变量,如下图:
• 终端指令:source /opt/pkg/petalinux/2020.2/settings.sh
在这里插入图片描述
第3步:建立基于BSP包的PetaLinux2020.2工程,如下图:
• 终端指令:petalinux-create -t project -s zu402_sd.bsp -n zu402_sd
在这里插入图片描述
第4步:将.xsa硬件信息导入PetaLinux2020.2工程,如下图:
• 终端指令:petalinux-config --get-hw-description=/home/文件路径/zu402_sd
在这里插入图片描述
在编译环境设置时,建议使用离线编译,当然,选择在线编译也是可以的,离线编译配置如下:
Yocto Settings → Add pre-mirror url如下,路径要改为你自己 download 及 ssate 的解压路径;
在这里插入图片描述
Yocto Settings → Local sstate feeds settings如下,路径要改为你自己 download 及 ssate 的解压路径;
在这里插入图片描述
其他配置保持默认即可,然后保存退出,如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
第5步:修改设备树文件,如下图:
将我们提供的设备树文件替换掉PetaLinux工具自动生成的用户设备树文件;
• 终端指令:ln -sf zu402_sdirx.dtsi system-user.dtsi
• 终端指令:ls -l
在这里插入图片描述
第6步:编译PetaLinux2020.2工程,如下图:
• 终端指令:petalinux-build
在这里插入图片描述
如果编译中途有报错信息,请复制报错信息并百度寻找解决办法,因为每个人的电脑配置不一样,环境配置不一样,遇到的问题也不一样,无法给出统一的答案;

第7步:生成镜像,如下图:
• 终端指令:cd images/linux
• 终端指令:petalinux-package --boot --fsbl zynqmp_fsbl.elf --u-boot u-boot.elf --pmufw pmufw.elf --fpga
system.bit
在这里插入图片描述
然后把PetaLinux2020.2工程生成的如下几个文件连同我们提供好的脚本文件一起放入SD卡中,如下:
在这里插入图片描述
到此们就可以插入SD卡上电跑系统了;

VLC播放器

压缩后的H265码流可通过VLC播放器播放,关于VLC播放器的安装与使用,请参考下面的博客链接:
点击直接前往

工程源码架构

工程源码架构包括vivado Block Design逻辑设计和PetaLiux软件设计;
Block Design逻辑设计架构截图如下:
在这里插入图片描述
综合后的源码架构如下:
在这里插入图片描述
需要注意的是,在对Block Design进行Generate Output Products时需要选择Global模式,如下:
在这里插入图片描述

4、Vivado工程源码详解

开发板FPGA型号:Xilinx–Zynq UltraScale+MPSoCs–xczu4ev-sfvc784-2-i;
开发环境:Vivado2020.2;
输入:笔记本电脑,3G-SDI,最高支持12G-SDI 4K60帧;
输出:RJ45网口,H265压缩码流;
视频压缩方案:Zynq UltraScale+ VCU–H265;
工程源码架构请参考前面第3章节中的《工程源码架构》小节;
工程作用:此工程目的是让读者掌握FPGA基于VCU的H265视频压缩的设计能力,以便能够移植和设计自己的项目;
工程的资源消耗和功耗如下:
在这里插入图片描述

5、工程移植说明

vivado版本不一致处理

1:如果你的vivado版本与本工程vivado版本一致,则直接打开工程;
2:如果你的vivado版本低于本工程vivado版本,则需要打开工程后,点击文件–>另存为;但此方法并不保险,最保险的方法是将你的vivado版本升级到本工程vivado的版本或者更高版本;
在这里插入图片描述
3:如果你的vivado版本高于本工程vivado版本,解决如下:
在这里插入图片描述
打开工程后会发现IP都被锁住了,如下:
在这里插入图片描述
此时需要升级IP,操作如下:
在这里插入图片描述
在这里插入图片描述

FPGA型号不一致处理

如果你的FPGA型号与我的不一致,则需要更改FPGA型号,操作如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
更改FPGA型号后还需要升级IP,升级IP的方法前面已经讲述了;

其他注意事项

1:由于每个板子的DDR不一定完全一样,所以MIG IP需要根据你自己的原理图进行配置,甚至可以直接删掉我这里原工程的MIG并重新添加IP,重新配置;
2:根据你自己的原理图修改引脚约束,在xdc文件中修改即可;
3:纯FPGA移植到Zynq需要在工程中添加zynq软核;

6、上板调试验证并演示

准备工作

FPGA开发板,推荐使用本博的开发板;
笔记本电脑,仅作输入源;
带显卡的电脑主机,显卡越贵越好;
网线;
我的开发板具体连接如下:
在这里插入图片描述
开发板有启动模式选择拨码开关,SD卡启动方式如下,请将开发板拨到如图的配置:
在这里插入图片描述
然后将资料中的如下图所示压缩包解压,并将解压后的全部文件复制到TF卡中:
在这里插入图片描述
然后插上TF卡,然后将串口线和网线连接到电脑,安装串口驱动,资料包中已经提供,上电;

配置Xshell

我们使用Xshell连接开发板模拟Linux终端的操作,Xshell配置如下:
在这里插入图片描述
在这里插入图片描述

配置开发板IP

首先需要配置开发板IP,配置为和你的电脑在同一网段即可,因为开发板压缩的码流视频需要发送给电脑;首先查看你的电脑IP,以我的为例如下:
在这里插入图片描述
然后在Xshell依次输入如下指令配置配置开发板IP,具体配置要根据你的电脑IP而定,这里只是以我的为例,如果这一步都看不懂建议不要往下看了。。。
• 终端指令:ifconfig
• 终端指令:ifconfig eth0 169.254.135.135
如下:
在这里插入图片描述
然后ping电脑IP,一定要能ping通,不然后面的操作就没意义了,如下:
• 终端指令:ping 169.254.135.77
在这里插入图片描述

配置输入视频

需要检测输入视频的格式,配置视频缩放,如下:
• 终端指令:media-ctl -p -d /dev/media0
在这里插入图片描述

配置H265视频压缩

输入如下指令:
• 终端指令:gst-launch-1.0 v4l2src device=/dev/video0 !
video/x-raw, width=1920, height=1080, format=NV16_10LE32, framerate=60/1
! omxh265enc target-bitrate=60000 periodicity-idr=120 ! queue
! mpegtsmux alignment=7 name=mux ! rtpmp2tpay ! udpsink host=169.254.135.77 port=5004
注意!!!
注意!!!
注意!!!
上述指令中的《udpsink host=169.254.135.77 port=5004》
这里的IP是根据我自己的电脑配置的,你的电脑请根据实际情况修改;端口号5004为固定值;
在这里插入图片描述
如果输入为12G-SDI,则分辨率为4K@30Hz,则指令变为如下:
• 终端指令:gst-launch-1.0 v4l2src device=/dev/video0 !
video/x-raw, width=3840, height=2160, format=NV16_10LE32, framerate=30/1
! omxh265enc target-bitrate=25000 periodicity-idr=120 ! queue
! mpegtsmux alignment=7 name=mux ! rtpmp2tpay ! udpsink host=169.254.135.77 port=5004

配置VLC播放器

开发板网线连接电脑,打开VLC播放器,配置如下:
在这里插入图片描述
在这里插入图片描述
这里一定要注意:这里的IP是根据我自己的电脑配置的,你的电脑请根据实际情况修改;
注意!!!
注意!!!
注意!!!
电脑端一定要用有显卡的电脑,不要用笔记本电脑,不然延时很大,根本无法播放。。。
播放效果如下:
在这里插入图片描述
同时可打开任务管理器–>性能,查看网卡正在接收数据,如下:
在这里插入图片描述

VLC播放H265码流视频演示

VLC播放H265码流视频演示如下:

SDI视频接收H265压缩

7、福利:工程源码获取

福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送;
获取方式:私,或者博客末尾的V名片;
网盘资料如下:
在这里插入图片描述
此外,有很多朋友给本博主提了很多意见和建议,希望能丰富服务内容和选项,因为不同朋友的需求不一样,所以本博主还提供以下服务:
在这里插入图片描述

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

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

相关文章

Apollo Planning模块中的Hybird A*算法

文章目录 流程图OpenSpacePlanner算法与周边模块关系OpenSpacePlanner与PublicRoadPlanner关系Hybird A*流程Hybird A*外部调用入口Hybird A*内部流程 Hybird A*代码逻辑主函数Plan碰撞检测ReedsShepp曲线加速搜索扩展相邻的节点计算节点的代价路径后处理路径分割轨迹平滑&…

android AccessibilityService合法合规增加小红书曝光阅读量(2024-09-02)

免责任声明: 任何可操作性的内容与本人无关,文章内容仅供参考学习,如有侵权损害贵公司利益,请联系作者,会立刻马上进行删除。 一、分析 目前可增加曝光阅读流量渠道入口(完成) 1. 发现页 打开小红书app选择顶部发现页&…

【网络世界】网络层

目录 🌈前言🌈 📁 网络层 📁 IPV4 📂 什么是IP地址 📂 网段划分 📂 特殊IP 📂 内网和公网 📂 IPV4的危机 📁 IP协议格式 📁 路由 &#x1f…

VSCode+Keil协同开发之Keil Assistant

VSCodeKeil协同开发之Keil Assistant 目录 VSCodeKeil协同开发之Keil Assistant1. 效果展示2. Keil Assistant简介3. Keil Assistant功能特性4. 部署步骤4.1. 部署准备4.2. 安装Keil Assistant插件4.3. 配置Keil Assistant插件 5. Keil Assistant使用6. 总结 大家在单片机开发时…

密码学基础

一、理论知识 科尔霍夫原则 1、对于一个密码学系统,应当仅有密钥是保密的,其余算法和一切参数都应该是公开的 2、并不一定要数学上完全不可破解,只要在现实中不可能破解即可 对称加密 加密解密都使用相同的密钥 非对称加密 1、加密解密…

【iOS】通过第三方库Masonry实现自动布局

目录 前言 约束 添加约束的规则 使用Masonry自动布局 Masonry的常见使用方法 补充 前言 在暑期完成项目时,经常要花很多时间在调试各种控件的位置上,因为每一个控件的位置都需要手动去计算,在遇到循环布局的控件时,还需要设…

【安当产品应用案例100集】014-使用安当TDE实现达梦数据库实例文件的透明加密存储

随着数据安全重要性的不断提升,数据库文件的落盘加密已成为数据保护的一项基本要求。达梦数据库作为一款高性能的国产数据库管理系统,为用户提供了一种高效、安全的数据存储解决方案。本文将详细介绍如何利用安当KSP密钥管理平台及TDE透明加密组件来实现…

OpenAI即将推出自然语音功能

🦉 AI新闻 🚀 OpenAI即将推出自然语音功能 摘要:测试博客testingcatalog揭示OpenAI正在通过逆向工程ChatGPT应用,计划增加更自然的语音朗读功能。未来可能推出8种新语音,具有独特代号,能表达动物叫声等非…

【kafka】在Linux系统中部署配置Kafka的详细用法教程分享

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

华为云征文|部署电影收藏管理器 Radarr

华为云征文|部署电影收藏管理器 Radarr 一、Flexus云服务器X实例介绍1.1 云服务器介绍1.2 应用场景1.3 性能模式 二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 Radarr3.1 Radarr 介绍3.2 Docker 环境搭建3.3 Radarr 部署3.4 Rada…

Django 第十三课 -- Form 组件

Django Form 组件用于对页面进行初始化,生成 HTML 标签,此外还可以对用户提交的数据进行校验(显示错误信息)。 报错信息显示顺序: 先显示字段属性中的错误信息,然后再显示局部钩子的错误信息。若显示了字…

如何打造高校实验室预约系统?Java SpringBoot助力高效管理,MySQL存储数据,Vue前端展现,四步实现学生轻松预约!

🍊作者:计算机毕设匠心工作室 🍊简介:毕业后就一直专业从事计算机软件程序开发,至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长:按照需求定制化开发项目…

已解决centos7 yum报错:cannot find a valid baseurl for repo:base/7/x86_64的解决方案

出现cannot find a valid baseurl for repo:base/7/x86_64错误通常是由于YUM仓库源无法找到或无法访问,导致YUM无法正常工作。这种情况常见于CentOS 7系统。解决这个问题需要检查几个方面,如网络连接、DNS设置和YUM仓库源配置。 🧑 博主简介&…

思科交换机端口安全配置1

#网络安全技术实现# #任务一交换机端口安全配置1# #1配置计算机的IP 地址、子网掩码和网关 #2配置交换机B的主机名称,创建vlan 10和vlan 20,将f0/1、2划入vlan 10,f0/3、4划入vlan 20,将f0/24配置为Trunk Switch(config)#hostna…

修改服务器DNS解析及修改自动对时时区

修改服务器DNS解析: 1、搜索一下当地的DNS服务器的地址 2、登录服务器,执行 vim /etc/resolv.conf文件,在nameserver字段后填写DNS服务的地址 3、chattr i /etc/resolv.conf 加上不可修改权限,防止重启DNS被修改 修改自动对时…

解读GaussianTalker:利用音频驱动的基于3D高斯点染技术的实时高保真讲话头像合成

单位:首尔大学 项目地址:https://ku-cvlab.github.io/GaussianTalker/ github:https://github.com/KU-CVLAB/gaussiantalker 本文是对GaussianTalker的解读,欢迎大家阅读指正! 目录 前言摘要一、背景介绍二 相关工作三…

centos 7部署nacos 2.4.1版本单点方式

文章目录 Nacos:微服务架构中的服务发现与配置管理利器官方网址引言Nacos简介Nacos的核心功能1. 服务发现和服务健康监测2. 动态配置服务3. 服务及其元数据管理 Nacos的工作原理Nacos的集群部署与高可用性Nacos的使用场景如何使用Nacos1. 安装Nacos2. 服务注册与发现…

设计模式 -- 访问者模式(Visitor Pattern)

1 问题引出 1.1 测评系统的需求 将观众分为男人和女人,对歌手进行测评,当看完某个歌手表演后,得到他们对该歌手不同的评价(评价 有不同的种类,比如 成功、失败 等) 1.2 传统方式解决 如果系统比较小,还是 ok 的&#…

安装 rocky9.4

涉及软件:virtualbox、rocky linux 9.4、mobaxterm virtualbox新建虚拟机,设置虚拟机配置 启动虚拟机,第一次会提示挂载虚拟光盘,选择下载的rocky linux 9.4。 选择第一项,安装rocky linux 9.4 进入安装设置&#…

VUE2.0 elementUI el-input-number 数据更新,视图不更新——基础积累

今天遇到一个问题,是关于el-input-number组件的,发现数据明明已经更改了,但是页面上组件输入框中还是之前的值。 比如上方输入框中,我输入120.5,就会出现下面的诡异现象 回显此值是120.779,但是页面上输入…