一、视频链路介绍
相机的帧率是30 fps/s,输出是yuv422格式,FPD_Link III接口。经过ti964将串行转mipi后送入到hi3559的VI模块,VI模块将捕获到的视频流送到VENC进行编码,编码后存入DDR.,最后从DDR中取出H265发送出去。PC端接受到码流后用FFMPEG分帧,将分出的帧送到GPU解码,最后显示。
整条视频链路的延时主要有五步分组成:
1、相机延时,这跟相机帧率有关,30 fps/s的相机延时为33ms
2、3559接受码流和编码延时
3、网络传输延时
4、GPU解码延时
5、显示延时,这个和显示机制和屏幕刷新率有关
二、板端延时测试方法
板端延时主要是3559接受码流和编码延时
1、用qt在PC端做一个实时时钟,时钟显示的是PC的时间。并每隔一段时间将pc的时间发送给板端,用来校准板端时间。这样时钟时间,PC时间,板端时间三者同步。
2、同步PC和板端时间
3、将摄像头对准时钟,在板端保存若干帧h265码流,每帧保存一个文件,文件名为获取到码流的当前板端时间
4、将保存的若干帧码流用pc解码成jpg图片。
5、对比图片上的时间和文件名时间,这两个时间差就是相机的延时和板端延时。
图片名称的时间:17.759
图片名称上的时间:17.826
第一张图片上的时间最后的秒和毫秒为17.669或17.679,获取到这张图片的h265的板端时间是17.759。所以从相机采集到编码完成的延时是17.759-17.669=90ms或17.759-17.679=80ms.
第二张图片上的最秒和毫秒时间为17.728或17.748,获取到这张图片的h265的板端时间是17.826。所以从相机采集到编码完成的延时是17.826-17.728=98ms或17.826-17.748=78ms.
三、网络延时测试方法
1、同步板端和pc端时间
2、板端在获取到一帧h265后,在其后面插入一段私有帧信息和私有帧,如下所示:
私有帧信息中的mSec就是获取到这帧码流的板端时间。插入私有帧是为了降低ffmpeg分帧的延时。因为ffmpeg分帧时将两个帧头中的数据作为一帧的数据,如果没有插入一帧的私有帧,则需要等到下一帧的帧头过来后才能分出上一帧,这样就增加了一帧的延时。
3、将ffmpeg中分出一帧后获取pc的时间减去私有帧信息中的时间就是网络传输延时
四、GPU解码延时测试
测试gpu解码的延时很简单,将解码结束的PC时间减去开始解码的PC时间即可。GPU解码有可能缓存,测试是否缓存方法为:
1、在板端保存若干帧h265,每帧保存一个文件
2、从I帧开始,将若干帧h265放入GPU解码,看是否放入的每帧都能解出来
让GPU低延时解码,需要在初始化NvDecoder时指定是低延时模式: