1、概述
英創(chuàng)公司推出的ESM8000主板搭載了NXP i.MX8M Mini Quad 64位處理器,主CPU為主頻1.6GHz的四核ARM Cortex-A53,并且?guī)в幸粋€(gè)視頻處理單元(VPU),能夠提供硬件解碼和編碼的功能,解碼支持的格式有1080p60 HEVC/H.265,H.264,VP9,VP8等,編碼支持的格式有1080p60 H.264,VP8等。對(duì)視頻編解碼有一定需求的應(yīng)用,最好選擇帶有VPU的主板進(jìn)行開(kāi)發(fā)。因?yàn)樵跊](méi)有VPU的情況下,CPU只能通過(guò)軟件計(jì)算來(lái)進(jìn)行編解碼,效率很低并且會(huì)占用大量CPU資源,而通過(guò)VPU來(lái)編解碼能夠極大的節(jié)約CPU資源,并且處理的速度也比CPU快很多。
在ESM8000主板中,已經(jīng)集成了Qt-5.15,用戶可以通過(guò)Qt來(lái)實(shí)現(xiàn)用戶圖形界面的開(kāi)發(fā),這部分我們已經(jīng)在《ESM8000主板圖形界面編程簡(jiǎn)介》中比較詳細(xì)的介紹過(guò)了,文章在最后提到了如果要想調(diào)用VPU進(jìn)行解碼,就需要通過(guò)QML界面或者Gstreamer工具。在ESM8000主板中已經(jīng)集成了Gstreamer工具和一些專用插件,這些插件就提供了使用VPU進(jìn)行編解碼的功能。為了支持在Qt中調(diào)用Gstreamer工具實(shí)現(xiàn)視頻的處理,ESM8000主板中移植了專用插件qmlsink,用戶無(wú)需進(jìn)行特殊的設(shè)置或者操作,使用標(biāo)準(zhǔn)的QML語(yǔ)言編程即可,當(dāng)涉及到視頻處理的部分,系統(tǒng)就會(huì)自動(dòng)通過(guò)Gstreamer的插件調(diào)用vpu來(lái)處理視頻。
所以對(duì)于熟悉QML的用戶來(lái)說(shuō),可以在ESM8000主板上直接采用標(biāo)準(zhǔn)的qml語(yǔ)言編程來(lái)實(shí)現(xiàn)應(yīng)用,不需要其他特殊設(shè)置,十分方便。對(duì)于QML不太熟悉的用戶來(lái)說(shuō),英創(chuàng)公司提供了一個(gè)基于QML語(yǔ)言實(shí)現(xiàn)的視頻顯示界面,用戶可以通過(guò)在傳統(tǒng)Qt C++的實(shí)現(xiàn)的窗口中嵌入這個(gè)現(xiàn)成的界面來(lái)實(shí)現(xiàn)對(duì)應(yīng)的功能。我們想通過(guò)這種方式,讓客戶還是可以使用熟悉的Qt C++環(huán)境來(lái)編程,而不必花費(fèi)更多的時(shí)間去學(xué)習(xí)QML語(yǔ)言的使用。下面我們以顯示網(wǎng)絡(luò)攝像頭監(jiān)控畫(huà)面為例,來(lái)講解如何調(diào)用現(xiàn)成的QML界面。
2、Qt C++調(diào)用QML實(shí)現(xiàn)視頻顯示
英創(chuàng)公司提供一個(gè)現(xiàn)成的基于QML語(yǔ)言實(shí)現(xiàn)的視頻顯示界面ipcamera1.qml,這個(gè)界面可以顯示本地視頻或者網(wǎng)絡(luò)攝像頭的畫(huà)面。方案的核心就是利用了Qt提供的quickWidget類來(lái)嵌入QML界面,這個(gè)widget類專門(mén)用于顯示Qt Quick(Qt提供支持QML語(yǔ)言的庫(kù)以及函數(shù))用戶界面。在Qt的官方網(wǎng)站中對(duì)quickWidget有詳細(xì)的說(shuō)明https://doc.qt.io/qt-5/qquickwidget.html,有興趣的客戶可以參考。
首先在創(chuàng)建的工程中導(dǎo)入英創(chuàng)公司提供的視頻顯示界面ipcamera1.qml,在這里我們選擇導(dǎo)入到Qt Resource中。右鍵工程選擇添加新文件,在模板中選擇Qt Resource File,單擊下一步,然后輸入名稱,例程中輸入的名稱為qml。可參考下圖:
成功后,會(huì)自動(dòng)生成一個(gè)qml.qrc文件,這時(shí)需要進(jìn)行初始設(shè)置,并添加視頻顯示界面ipcamera1.qml。首先點(diǎn)擊添加按鈕,選擇添加前綴,在前綴中輸入想設(shè)置的路徑(在引用資源的時(shí)候會(huì)使用到),例程中設(shè)置為/,如下圖:
設(shè)置完后,再次點(diǎn)擊添加按鈕,選擇添加文件,在文件瀏覽框中選中復(fù)制到工程目錄下的ipcamera1.qml文件,成功后可以在qml.qrc的瀏覽窗中看到對(duì)應(yīng)的文件,如下圖:
導(dǎo)入QML文件的部分就已經(jīng)完成了,用戶只需要在程序中增加對(duì)quickWidget的初始化即可,可參考下面的代碼:
w = new QQuickWidget; w->move(0,0); w->resize(640, 360); w->setSource(QUrl(("qrc:/ipcamera1.qml")));
如果需要和QML界面中的內(nèi)容進(jìn)行交互,可以通過(guò)信號(hào)與槽來(lái)實(shí)現(xiàn)。Qt C++中發(fā)送信號(hào),在QML界面中定義槽函數(shù)響應(yīng),或是在QML界面中發(fā)送信號(hào),在Qt C++中定義槽函數(shù)來(lái)響應(yīng)都是可以的。例程中實(shí)現(xiàn)了一些按鈕,對(duì)QML界面進(jìn)行簡(jiǎn)單的操作,比如開(kāi)始、停止等功能。在Qt的網(wǎng)站上也有比較詳細(xì)的說(shuō)明:https://doc.qt.io/qt-5/qtqml-cppintegration-interactqmlfromcpp.html。在英創(chuàng)公司提供的例程中,加入了開(kāi)始、停止、縮放、旋轉(zhuǎn)以及切換清晰度等操作,都是通過(guò)界面上C++的控件類(pushButton、comoBox等)發(fā)送信號(hào)來(lái)實(shí)現(xiàn)的,具體可以參考例程中的代碼。
例程采用了比較常用的網(wǎng)絡(luò)攝像頭,測(cè)試效果如下:
3、總結(jié)
從程序的截圖中可以看出來(lái),在使用VPU解碼的情況下,幾乎不會(huì)對(duì)CPU造成負(fù)載,用戶可以利用CPU資源執(zhí)行其他操作。
通過(guò)這種方式,我們希望讓用戶不必花過(guò)多時(shí)間對(duì)QML語(yǔ)言編程進(jìn)行學(xué)習(xí),以此能夠幫助用戶提升應(yīng)用程序開(kāi)發(fā)的時(shí)間。感興趣的客戶可以和英創(chuàng)的工程師聯(lián)系獲取完整的測(cè)試代碼。
成都英創(chuàng)信息技術(shù)有限公司 028-8618 0660