注意,本篇为干货,是经过了大量的资料查询以及公司实际的项目验证才有的经验。
可以让有需要的人一步登天,不走弯路。
一,前提条件
图像使用qt实现,视频则使用gstreamer。
图像运行在fb0图层上,视频则是fb1。备注:fb1是fb0的overlay层。
也就是说如果图像和视频都存在的话,视频是在图像之上的。
二,细节
那么有一些细节的问题我们需要关注下,比如图像如何运行在fb0图层上,qt4通过命令行参数的形式指定,qt5则是通过配置文件。
视频如何运行在fb1图层上?我们使用playbin这个管道来实现视频播放,video-sink有两个选择,一个是overlaysink,另一个是imxv4l2sink。不管使用哪种,在不特意设置某种属性的前提下,默认都是在fb1层播放。
有人看到这里会问,可不可以视频运行在fb0,而图像运行在fb1上?我的答案是可以这么做,但是会引起非常多的问题,这种选择我认为是错误的。千万不要这么干,有时间我会讲讲为什么。此处不表。
三,叠加问题
fb1层默认是透明的,在不播放视频的时候,你是可以看到fb0层的图像。播放视频后,比如全屏,你只会看到视频,视频底下的图像是看不到的。
那么有人会问,既然如此,怎么实现图像和视频共同显示呢?
这里就要说到overlaysink和imxv4l2sink的区别了。两者都有overlay-left,overlay-top,overlay-width,overlay-height这四个属性。使用起来效果不一样。比如全屏是1080P。left,top指定0,width,height分别指定1920和1080。两个sink的表现是一样的。视频全覆盖。如果width和height只指定部分。那么overlaysink的效果是视频可见,剩余部分黑屏,不透明。而imxv4l2sink的效果是视频可见,剩余部分透明,可以看得到图像。
说到这里,我想你应该知道怎么做了。
四,结语
真相往往非常简单,但却要复出加倍努力去揭开。