自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

詳解 QT 顯示視頻 Linux下 Qt 和 Xv實(shí)現(xiàn)

移動(dòng)開(kāi)發(fā)
無(wú)論是Qt還是Xv,他們都是基于一個(gè)顯示架構(gòu)的,那就是X架構(gòu),Qt是對(duì)Xlib進(jìn)行的更高層及的封裝,而Xv則是對(duì)Xlib功能上 的一個(gè)擴(kuò)展,先來(lái)看內(nèi)容。

 

QT 顯示視頻 linuxQt Xv 是本文要介紹的內(nèi)容,先來(lái)對(duì)linux下的 Qt Xv來(lái)做個(gè)總結(jié),然后加了一段代碼,供大家參考!先來(lái)看內(nèi)容。

采用Qt+Xv實(shí)現(xiàn)視頻顯示的原因是因?yàn)?strong>Xv可以使用顯卡進(jìn)行顯示加速;比如,對(duì)于視頻大小的縮放,如果交給cpu來(lái)完成這項(xiàng)操作,那cpu的計(jì)算量是非常大的,一般的cpu基本上是滿負(fù)荷運(yùn)轉(zhuǎn)了,所以,選用Xv來(lái)實(shí)現(xiàn)視頻縮放和顯示,是一個(gè)非常明智的選擇;這里我先簡(jiǎn)單說(shuō)一下,為什么Qt可以和Xv和在一起來(lái)顯示視頻幀呢?它的原理又是什么呢?

首先,我們要知道,無(wú)論是Qt還是Xv,他們都是基于一個(gè)顯示架構(gòu)的,那就是X架構(gòu),Qt是對(duì)Xlib進(jìn)行的更高層及的封裝,而Xv則是對(duì)Xlib功能上 的一個(gè)擴(kuò)展,旨在盡可能的挖掘顯卡的運(yùn)算能力,而實(shí)現(xiàn)更為強(qiáng)大的功能;這也是為什么兩者可以結(jié)合在一起顯示視頻的理論和實(shí)際基礎(chǔ)了;然而,又由于,兩者所 在的層次不同,而且目的也不同,那么如何將這兩者結(jié)合起來(lái),就成為了當(dāng)前的最大的問(wèn)題了;

通過(guò)在網(wǎng)上搜索,可以知道Xv可以直接顯示YUV數(shù)據(jù),并且很容易實(shí)現(xiàn)視頻縮放,而且這些都已經(jīng)經(jīng)過(guò)硬件加速優(yōu)化過(guò)了;這也正是我最需要的!

我們直接開(kāi)始介紹Xv中的顯示圖片的函數(shù)--XvPutImage,和Xlib提供的顯示圖片函數(shù)XPutImage只相差一個(gè)字母,但是這個(gè)函數(shù)功能確強(qiáng)大了許多;

此函數(shù)的函數(shù)原型為:

  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); 

針對(duì)此函數(shù),我們來(lái)看怎么使用此函數(shù),會(huì)用了此函數(shù),就可以顯示YUV數(shù)據(jù)了;

此函數(shù)需要結(jié)合一個(gè)QWidget才能夠顯示圖片;

第一個(gè)參數(shù),可以通過(guò)QWidget的x11Display()函數(shù)得到;

第二個(gè),可以通過(guò)XvQueryAdaptors得到;

第三個(gè),通過(guò)QWidget的winId()得到;

第四個(gè),通過(guò)XvCreateImage得到;

剩下的幾個(gè)坐標(biāo)函數(shù),我就不解釋了,光看參數(shù)名稱,就應(yīng)該猜的出來(lái);

這里需要注意的一點(diǎn)是,在使用XvCreateImage生成了新的XvImage時(shí),此函數(shù)的第四個(gè)參數(shù)可以直接賦予AVFrame的data[0]指 針,這樣,就把ffmpeg的數(shù)據(jù)幀同要顯示的XvImage聯(lián)系到了一起,并且,這個(gè)AVFrame中的data[0]數(shù)據(jù)為YUV數(shù)據(jù),完全符合要 求,可以直接刷新顯示了;

總的來(lái)說(shuō),大致就是這樣子了,以后有什么疑問(wèn),還會(huì)對(duì)此文檔進(jìn)行詳細(xì)擴(kuò)充;爭(zhēng)取寫成教程;

采用Xv進(jìn)行顯示也是存在風(fēng)險(xiǎn)的,一旦當(dāng)前系統(tǒng)的驅(qū)動(dòng)對(duì)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  

小結(jié):關(guān)于詳解 QT 顯示視頻 linux Qt Xv 實(shí)現(xiàn) 的內(nèi)容介紹到這里,希望本文對(duì)你有所幫助!

責(zé)任編輯:zhaolei 來(lái)源: 互聯(lián)網(wǎng)
相關(guān)推薦

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-06-08 14:06:42

linux SDK Qt

2011-04-02 09:17:38

2011-06-30 17:51:17

QT 元類型 線程

2011-06-24 09:01:20

Qt QLibrary dll

2011-06-24 17:05:07

QT QT 4.7.3 windows

2011-06-24 10:05:51

QT 對(duì)象 父對(duì)象

2011-07-05 10:55:14

Linux Qt 移植

2011-07-05 11:10:23

Linux Qt 移植

2011-06-28 15:18:45

Qt 單例模式

2011-06-28 13:38:15

Arm linux QT

2011-07-01 12:52:50

Ubuntu Qt wxWidgets

2011-06-23 13:38:27

QT 元對(duì)象 信號(hào)

2011-06-23 14:05:32

Qt 事件機(jī)制

2011-06-21 17:01:44

Qt 靜態(tài) 編譯

2011-06-16 10:09:25

QT Windows DLL

2011-06-24 08:46:37

Linux Qt x11 4.5

2011-08-30 13:59:06

QTMysql數(shù)據(jù)庫(kù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)