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

打印 上一主题 下一主题

主题 760|帖子 760|积分 2280

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名片;
网盘资料如下:

别的,有很多朋友给本博主提了很多意见和发起,盼望能丰富服务内容和选项,由于不同朋友的需求不一样,所以本博主还提供以下服务:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

梦见你的名字

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表