梦见你的名字 发表于 2024-9-16 13:01:31

FPGA实现SDI视频H265压缩网络推流输出,基于VCU架构,支持12G-SDI 4K60帧,

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、具体设计方案

设计框图

本设计使用的工程具体设计方案框图如下:
https://i-blog.csdnimg.cn/direct/9c090ae512b24bb6bd7861e64b17d9b2.png
FPGA开发板

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

输入源为条记本电脑接入HDMI转SDI盒子,输出SDI视频给FPGA;架构如下:
https://i-blog.csdnimg.cn/blog_migrate/c11e1dd75ce1b2e37cf77b1dea16bdc3.png
如需支持12G SDI 4K60帧,你的条记本电脑要可以或许输出4K@60Hz分辨率才行,可通过查看显示驱动版本确定是否支持4K@60Hz分辨率,一样寻常驱动版本在20.0以上就是支持输出4K的;参考如下:
https://i-blog.csdnimg.cn/blog_migrate/5fb72e30a51eae62a023453f69932f97.png
演示用的例程仅作1080P输入;
也可以使用SDI彩条发生器大概SDI相机直接输出给FPGA;
本博主热爱SDI视频开发,自研了一款12G-SDI彩条发生器,如下:
https://i-blog.csdnimg.cn/blog_migrate/fe9ebb1299d04f31add5d43fc3feb19f.jpeg
该设备代价低廉但很好用,可产生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视频,如下:
https://i-blog.csdnimg.cn/blog_migrate/e2db28097e182e237c79a61d387590a3.png
该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视频,如下:
https://i-blog.csdnimg.cn/blog_migrate/31b58bb4f8109143fe0caaf98eee338e.png
该IP必要软件配置,本设计提供了vitis软件驱动,详情请参考vitis工程;
Video Frame Buffer Write

Video Frame Buffer Write相当于精简版的VDMA,只具有视频写入DDR的功能,与VDMA相比具有YUV视频写入的功能,配置如下:
https://i-blog.csdnimg.cn/blog_migrate/05261977267df517f56a917f2021d78b.png
在Linux设计中可以对视频写入的基地址举行配置,通过终端指令配置;
Zynq UltraScale+ VCU

Zynq UltraScale+ VCU是Xilinx Zynq UltraScale+ ZUEV系列FPGA才有的IP,可以实现最高4K60帧的视频压缩和解压,IP的官方文档是《PG252》,读者可以自行前往阅读,Zynq UltraScale+ VCU配置如下:
https://i-blog.csdnimg.cn/blog_migrate/870a114ff6165dea714d422a8ab0cc80.png
输入视频格式为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 文件名
https://i-blog.csdnimg.cn/direct/8619327696ef4e3185bcae47cb7fc21f.png
第2步:配置PetaLinux2020.2环境变量,如下图:
• 终端指令:source /opt/pkg/petalinux/2020.2/settings.sh
https://i-blog.csdnimg.cn/direct/1e985f7a74334bcebf706a4a31624bef.png
第3步:创建基于BSP包的PetaLinux2020.2工程,如下图:
• 终端指令:petalinux-create -t project -s zu402_sd.bsp -n zu402_sd
https://i-blog.csdnimg.cn/direct/08455542b2bf41ea9d8f93e050dd9cc9.png
第4步:将.xsa硬件信息导入PetaLinux2020.2工程,如下图:
• 终端指令:petalinux-config --get-hw-description=/home/文件路径/zu402_sd
https://i-blog.csdnimg.cn/direct/68b795b8b8d04f95977f2034a7c80abf.png
在编译环境设置时,发起使用离线编译,当然,选择在线编译也是可以的,离线编译配置如下:
Yocto Settings → Add pre-mirror url如下,路径要改为你自己 download 及 ssate 的解压路径;
https://i-blog.csdnimg.cn/direct/261686d430c840b5bbea3e44b791412e.png
Yocto Settings → Local sstate feeds settings如下,路径要改为你自己 download 及 ssate 的解压路径;
https://i-blog.csdnimg.cn/direct/f5ba46201a174731b27ae6fbff2ccbe5.png
其他配置保持默认即可,然后生存退出,如下:
https://i-blog.csdnimg.cn/direct/d6ab1890e892466cb6cac6ac1a299ed6.png
https://i-blog.csdnimg.cn/direct/4dc86dd6aca747a1a11d1faf1e8e4c33.png
https://i-blog.csdnimg.cn/direct/711720f69c7446428f9ba0d79ea2d789.png
第5步:修改设备树文件,如下图:
将我们提供的设备树文件更换掉PetaLinux工具自动生成的用户设备树文件;
• 终端指令:ln -sf zu402_sdirx.dtsi system-user.dtsi
• 终端指令:ls -l
https://i-blog.csdnimg.cn/direct/7b0d6b9c07024bd883c9da2d0397941e.png
第6步:编译PetaLinux2020.2工程,如下图:
• 终端指令:petalinux-build
https://i-blog.csdnimg.cn/direct/8296db31d54b4836a224d7081735cf9b.png
如果编译中途有报错信息,请复制报错信息并百度探求解决办法,由于每个人的电脑配置不一样,环境配置不一样,遇到的问题也不一样,无法给出统一的答案;
第7步:生成镜像,如下图:
• 终端指令:cd images/linux
• 终端指令:petalinux-package --boot --fsbl zynqmp_fsbl.elf --u-boot u-boot.elf --pmufw pmufw.elf --fpga
system.bit
https://i-blog.csdnimg.cn/direct/3e8c6da84b244ea0843b7a8f7eec1ff2.png
然后把PetaLinux2020.2工程生成的如下几个文件连同我们提供好的脚本文件一起放入SD卡中,如下:
https://i-blog.csdnimg.cn/direct/6b6381510c0348a79c11a8179c51a941.png
到此们就可以插入SD卡上电跑系统了;
VLC播放器

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

工程源码架构包罗vivado Block Design逻辑设计和PetaLiux软件设计;
Block Design逻辑设计架构截图如下:
https://i-blog.csdnimg.cn/direct/8f596ce35ac04c17b1c862de4fe4090e.png
综合后的源码架构如下:
https://i-blog.csdnimg.cn/direct/a3645101ca164d599376ef1837b5be74.png
必要留意的是,在对Block Design举行Generate Output Products时必要选择Global模式,如下:
https://i-blog.csdnimg.cn/direct/9671ebd04ac746eca69d18d50358fb3a.png
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视频压缩的设计本领,以便可以或许移植和设计自己的项目;
工程的资源斲丧和功耗如下:
https://i-blog.csdnimg.cn/direct/ae6ff35a37e8483f95d3cc06ce6d7548.png
5、工程移植阐明

vivado版本不一致处理

1:如果你的vivado版本与本工程vivado版本一致,则直接打开工程;
2:如果你的vivado版本低于本工程vivado版本,则必要打开工程后,点击文件–>另存为;但此方法并不保险,最保险的方法是将你的vivado版本升级到本工程vivado的版本大概更高版本;
https://i-blog.csdnimg.cn/blog_migrate/bc48ac9fcff3ccf75afc3b8c93903943.png
3:如果你的vivado版本高于本工程vivado版本,解决如下:
https://i-blog.csdnimg.cn/blog_migrate/5339765854d33895fd1ef5f32b7c7316.png
打开工程后会发现IP都被锁住了,如下:
https://i-blog.csdnimg.cn/blog_migrate/2ac63999d842a4c6fb1d7380d6ca5e97.png
此时必要升级IP,操纵如下:
https://i-blog.csdnimg.cn/blog_migrate/89ba314f110850af150597ba2bc53bc5.png
https://i-blog.csdnimg.cn/blog_migrate/927dd0bd87ca3d4e31ff5dfd91915c65.png
FPGA型号不一致处理

如果你的FPGA型号与我的不一致,则必要更改FPGA型号,操纵如下:
https://i-blog.csdnimg.cn/blog_migrate/bfd4a4312f7a07d96dbdf352ca7cdf56.png
https://i-blog.csdnimg.cn/blog_migrate/62e7842d8f47097e251eab0531279f6c.png
https://i-blog.csdnimg.cn/blog_migrate/1a056eeffb8fd0c0e59755520973eb2c.png
更改FPGA型号后还必要升级IP,升级IP的方法前面已经报告了;
其他留意事项

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

准备工作

FPGA开发板,推荐使用本博的开发板;
条记本电脑,仅作输入源;
带显卡的电脑主机,显卡越贵越好;
网线;
我的开发板具体连接如下:
https://i-blog.csdnimg.cn/direct/38e78073e040499a8bf6fd9ac8cd28f4.jpeg#pic_center
开发板有启动模式选择拨码开关,SD卡启动方式如下,请将开发板拨到如图的配置:
https://i-blog.csdnimg.cn/blog_migrate/480a74c46cfadaf9fc7e9f461d2fcf3c.jpeg
然后将资料中的如下图所示压缩包解压,并将解压后的全部文件复制到TF卡中:
https://i-blog.csdnimg.cn/direct/16b3d9c6b4c04aa7934fb06fc0954633.png
然后插上TF卡,然后将串口线和网线连接到电脑,安装串口驱动,资料包中已经提供,上电;
配置Xshell

我们使用Xshell连接开发板模仿Linux终端的操纵,Xshell配置如下:
https://i-blog.csdnimg.cn/blog_migrate/19a65234d0c48a2fae6eb209a656aab1.png
https://i-blog.csdnimg.cn/blog_migrate/ee9eac725cb63830f0bb72194656f5f9.png
配置开发板IP

首先必要配置开发板IP,配置为和你的电脑在同一网段即可,由于开发板压缩的码流视频必要发送给电脑;首先查看你的电脑IP,以我的为比方下:
https://i-blog.csdnimg.cn/direct/11140d1bdd304a6fb8784a4af0a43078.png
然后在Xshell依次输入如下指令配置配置开发板IP,具体配置要根据你的电脑IP而定,这里只是以我的为例,如果这一步都看不懂发起不要往下看了。。。
• 终端指令:ifconfig
• 终端指令:ifconfig eth0 169.254.135.135
如下:
https://i-blog.csdnimg.cn/direct/0e88d3f3d9ae41899b56b77934a5208e.png
然后ping电脑IP,一定要能ping通,否则背面的操纵就没意义了,如下:
• 终端指令:ping 169.254.135.77
https://i-blog.csdnimg.cn/direct/0c6878d25b974d008f61b655d3b3d1c8.png
配置输入视频

必要检测输入视频的格式,配置视频缩放,如下:
• 终端指令:media-ctl -p -d /dev/media0
https://i-blog.csdnimg.cn/direct/24fdcc7e1fa54ce7b26a79f93406230d.png
配置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为固定值;
https://i-blog.csdnimg.cn/direct/bd87384ecc0f4df09754a5e42e770b67.png
如果输入为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播放器,配置如下:
https://i-blog.csdnimg.cn/direct/1b919a9c9e2f4658bd867501ae966192.png
https://i-blog.csdnimg.cn/direct/009ea0f727f242d28d03769692e361da.png
这里一定要留意:这里的IP是根据我自己的电脑配置的,你的电脑请根据实际环境修改;
留意!!!
留意!!!
留意!!!
电脑端一定要用有显卡的电脑,不要用条记本电脑,否则延时很大,根本无法播放。。。
播放结果如下:
https://i-blog.csdnimg.cn/direct/c6971dc6c2354560842103c7e4942073.png
同时可打开使命管理器–>性能,查看网卡正在吸收数据,如下:
https://i-blog.csdnimg.cn/direct/f2f24a6d3c79420586adb084e46f022a.png
VLC播放H265码流视频演示

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

   SDI视频吸收H265压缩

7、福利:工程源码获取

福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送;
获取方式:私,大概博客末尾的V名片;
网盘资料如下:
https://i-blog.csdnimg.cn/direct/6c8f71ebbb3549b29da7c8fdda360c76.png
别的,有很多朋友给本博主提了很多意见和发起,盼望能丰富服务内容和选项,由于不同朋友的需求不一样,所以本博主还提供以下服务:
https://i-blog.csdnimg.cn/blog_migrate/3822b51eedd8e3bf90dbed737ac4a2e1.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: FPGA实现SDI视频H265压缩网络推流输出,基于VCU架构,支持12G-SDI 4K60帧,