Qt与gstreamer一起用其实目前这种需求并不多。要么用Qt单独做一个APP,目前Qt包含的音视频解码库基本能满足需求。要么不需要UI单独用gstreamer直接播放。但是有些应用很奇特比如要UI悬浮叠加在视频上面不消失、因为要求播放和录视频必须要通过gstreamer与Qt交互等等。下面来总结一些问题。
1、两个fb设备和DRM驱动
NXP或者TI以前用framebuffer显示驱动时会生成两个fb设备,这时候就很简单了Qt用fb0、gstreamer用fb1。后来Linux用了DRM架构,然后就有几个plane层,这样也简单依旧可以单独使用。这时候Qt和gstreamer的交互控制可以开2个进程通过进程通信控制,非常方便。但是有些SOC在用DRM时就是有问题,比如上层plane用Qt就是不能透明然后就挡住了下层plane的gstreamer,这引出了下面的问题。
2、gstreamer嵌入Qt
既然Qt会挡住gstreamer只能考虑把gstreamer嵌入Qt的label、widget等作背景了了。在以前这个比较困难需gstreamer只能用xvimagesink,由此又要移植X11库还要注意64位、32位问题。后来Qt在5.12.2版本直接集成了xvimagesink和相关库,但是注意此时运行环境还是跟前面一样。Qt5.12.2简单的用player = new QMediaPlayer;player->setMedia(QUrl("gst-pipeline: videotestsrc ! autovideosink"));之类语句即可,Qt会转化。
3、Qt5.12.2与gstreamer交互控制
Qt通过QMediaPlayer类实现gstreamer的启动、暂停、终止,但是如何开启录像、录音、拍照呢?首先setMedia创建了一个pipeline且有两个分支。一个分支用来丢视频数据给Qt显示,然后通过QVideoProbe可以获得每一帧这就可以用来做简单的拍照。另一个分支的终点是shmsink把视频数据传给另一个pipeline。另一个pipeline通过shmsrc获取视频数据用于录音录像。第二个pipeline建立是为了可以随时控制录像停止开始。
当然这里可以探讨,希望读者有效率更高、实现更加简单的方法,如果有请留言。
5、Qt与ffmpeg、opencv等
另外Qt还可以与ffmpeg、opencv等结合实现摄像头录像、预览等功能。但是在嵌入式领域这个是比较受限制的,很多SOC的sdk对于ffmpeg和opencv根本没做接口,就是想用也难啊。
做嵌入式软件比较困难的就是要自己搭建一个应用软件的运行平台,通常程序员拿到的初始平台总是缺各种库,于是又要加很多这个过程比较痛苦。