详解 QT 显示视频 Linux下 Qt 和 Xv实现

移动开发
无论是Qt还是Xv,他们都是基于一个显示架构的,那就是X架构,Qt是对Xlib进行的更高层及的封装,而Xv则是对Xlib功能上 的一个扩展,先来看内容。

 

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 实现 的内容介绍到这里,希望本文对你有所帮助!

责任编辑:zhaolei 来源: 互联网
相关推荐

2011-06-24 13:27:13

Ubuntu QT SDK

2011-06-29 10:18:20

LINUX QT ARM

2011-06-22 17:36:50

QT Linux 串口

2011-04-02 09:17:38

2011-06-08 14:06:42

linux SDK Qt

2011-06-30 17:51:17

QT 元类型 线程

2011-06-24 17:05:07

QT QT 4.7.3 windows

2011-06-24 09:01:20

Qt QLibrary dll

2011-06-24 10:05:51

QT 对象 父对象

2011-07-05 11:10:23

Linux Qt 移植

2011-07-05 10:55:14

Linux Qt 移植

2011-06-28 15:18:45

Qt 单例模式

2011-06-28 13:38:15

Arm linux QT

2011-06-23 13:38:27

QT 元对象 信号

2011-07-01 12:52:50

Ubuntu Qt wxWidgets

2011-06-23 14:05:32

Qt 事件机制

2011-06-16 10:09:25

QT Windows DLL

2011-06-21 17:01:44

Qt 静态 编译

2011-08-30 13:59:06

QTMysql数据库

2011-06-24 08:46:37

Linux Qt x11 4.5
点赞
收藏

51CTO技术栈公众号