详解 QT 显示视频 Linux下 Qt 和 Xv实现
创始人
2024-08-02 04:11:24
0

 

QT 显示视频 linuxQt Xv 是本文要介绍的内容,先来对linux下的 Qt Xv来做个总结,然后加了一段代码,供大家参考!先来看内容。

采用Qt+Xv实现视频显示的原因是因为Xv可以使用显卡进行显示加速;比如,对于视频大小的缩放,如果交给cpu来完成这项操作,那cpu的计算量是非常大的,一般的cpu基本上是满负荷运转了,所以,选用Xv来实现视频缩放和显示,是一个非常明智的选择;这里我先简单说一下,为什么Qt可以和Xv和在一起来显示视频帧呢?它的原理又是什么呢?

首先,我们要知道,无论是Qt还是Xv,他们都是基于一个显示架构的,那就是X架构,Qt是对Xlib进行的更高层及的封装,而Xv则是对Xlib功能上 的一个扩展,旨在尽可能的挖掘显卡的运算能力,而实现更为强大的功能;这也是为什么两者可以结合在一起显示视频的理论和实际基础了;然而,又由于,两者所 在的层次不同,而且目的也不同,那么如何将这两者结合起来,就成为了当前的最大的问题了;

通过在网上搜索,可以知道Xv可以直接显示YUV数据,并且很容易实现视频缩放,而且这些都已经经过硬件加速优化过了;这也正是我最需要的!

我们直接开始介绍Xv中的显示图片的函数--XvPutImage,和Xlib提供的显示图片函数XPutImage只相差一个字母,但是这个函数功能确强大了许多;

此函数的函数原型为:

  1. XvPutImage(Display *, XvPortID, Window, GC *, XvImage *, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h); 

针对此函数,我们来看怎么使用此函数,会用了此函数,就可以显示YUV数据了;

此函数需要结合一个QWidget才能够显示图片;

第一个参数,可以通过QWidget的x11Display()函数得到;

第二个,可以通过XvQueryAdaptors得到;

第三个,通过QWidget的winId()得到;

第四个,通过XvCreateImage得到;

剩下的几个坐标函数,我就不解释了,光看参数名称,就应该猜的出来;

这里需要注意的一点是,在使用XvCreateImage生成了新的XvImage时,此函数的第四个参数可以直接赋予AVFrame的data[0]指 针,这样,就把ffmpeg的数据帧同要显示的XvImage联系到了一起,并且,这个AVFrame中的data[0]数据为YUV数据,完全符合要 求,可以直接刷新显示了;

总的来说,大致就是这样子了,以后有什么疑问,还会对此文档进行详细扩充;争取写成教程;

采用Xv进行显示也是存在风险的,一旦当前系统的驱动对Xv支持不好,或者干脆不支持,那么就不能显示视频了。

QT 显示视频代码:

  1.  
  2. QPainter has a method called drawImage. You can do something like the   
  3.  
  4. following in a subclass of QWidget:   
  5.  
  6. void VideoWidget::paintEvent()   
  7. {   
  8. //Get   
  9. the current frame and size data...   
  10. //Passing QImage   
  11. QImage frame(frameDataUCharPtr, frameWidth, frameHeight.  
  12. QImage::Format_RBG32 );   
  13. QPainter painter(this);   
  14. painter.drawImage(rect(), frame);   
  15. }   
  16. Under Qtopia   
  17. you can use QDirectPainter to write directly to framebuffer   
  18. memory and get   
  19. some faster access for drawing frames. You will have to   
  20. do the color conversions yourself to get   
  21. the frame into your   
  22. framebuffer's color model.   
  23. --Justin  

小结:关于详解 QT 显示视频 linux Qt Xv 实现 的内容介绍到这里,希望本文对你有所帮助!

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...