1. 程式人生 > >嵌入式Linux基於QML開發QtMultimedia應用

嵌入式Linux基於QML開發QtMultimedia應用

ByToradex秦海

1). 簡介

使用QML語言進行QT應用程式開發可以將介面開發和邏輯控制分開,提高應用的開發週期和靈活性;另外對於多媒體應用非常重要的一點是,基於QML/QT Quick 的應用程式可以直接呼叫GPU進行加速,這大大提高了多媒體應用在嵌入式系統環境下的處理效率和資源佔用,因此本文就基於QML和QT Multimedia元件介紹多媒體應用開發。

本文所演示的平臺來自於Toradex Apalis iMX6 ARM嵌入式平臺,這是一個基於NXP iMX6ARM處理器,支援雙核/四核Cortex-A9。


2. 準備

a). ApalisiMX6 ARM核心版配合Ixora載板,連線除錯串列埠UART1到開發主機方便除錯。


b). Apalis iMX6系統使用基於OpenEmbedded框架重新編譯的整合Qt5.9支援的ToradexLinux image release V2.8b2 版本以及對應的SDK。可以結合這裡的說明自行編譯,需要修改的local.conf 檔案如下,image更新方法請參考這裡

-------------------------------

IMAGE_INSTALL_append = "gstreamer1.0-plugins-bad-* gstreamer1.0-plugins-ugly-* gstreamer1.0-libav"

PACKAGECONFIG_append_pn-qtmultimedia =" gstreamer"

-------------------------------


c). 關於開發主機SDK安裝和Qt creator開發環境的配置請參考這裡


d). 演示程式使用的LCD為10inch 18bitLVDS螢幕,請參考這裡修改配置uboot顯示解析度。


e). 如果需要,可以開啟QT debuglogging

./ 開啟所有 debug logging

-------------------------------

$ export QT_LOGGING_RULES=*.debug=true

-------------------------------

./ 開啟 multimedia 相關debuglogging

-------------------------------

$ export QT_LOGGING_RULES=*.debug=true

-------------------------------


f). 本文演示應用程式分為兩個部分,對應為兩個頁面;應用啟動後預設頁面為視訊播放(Video Player)頁面,通過點選按鈕可以切換為攝像頭捕獲頁面(Camera Capture)頁面。下面就逐一進行一些說明。


3). QT演示程式開發 – Video Player


a). 原始碼和執行效果如下:

./ 程式碼

main.qml - https://github.com/simonqin09/QtQMLMultimedia/blob/master/main.qml

main.cpp - https://github.com/simonqin09/QtQMLMultimedia/blob/master/main.cpp


b). 具體要點說明如下

./ 由於QT Multimedia元件在底層也是呼叫GstreamerPlaybin元件進行媒體播放操作,因此在程式設計之前,首先可以直接使用Gstreamer pipeline在嵌入式系統先驗證下,確保媒體可以正常播放,沒有解碼器缺失的情況。

-------------------------------

$ gst-launch-1.0 playbin uri=file:///home/root/ready-player-one-trailer-2_h720p.mov

-------------------------------


./ main.cpp 檔案用於識別輸入變數並通過下面程式碼將其傳遞給QML來指定媒體檔案位置。

-------------------------------

QQmlApplicationEngine engine;

engine.rootContext()->setContextProperty("mysource",source);

-------------------------------


./ main.qml 檔案用於實現video player介面以及媒體播放。

  • 媒體播放主要由 ”Mediaplayer”元素和 ”VideoOutput” 元素來配合實現。然後將其顯示在定義好的640x480解析度的rectangle中。
  • 定義了一些控制播放和音量的按鍵,當點選時候會有顏色的變化指示。
  • 使用了 Connections 用於訊號觸發操作,這裡對應為當發現媒體播放停止的時候自動將 Play 按鍵的顏色變更為初始狀態。
  • 在頁面切換按鍵處,使用了loader功能來載入 Camera Capture 頁面,需要注意的是同時也需要在main.qml 中建立一個 CameraMode.qml 的例項以便於操作。

   -------------------------------

    CameraMode {

               id: cameramode1

               anchors.fill: parent

               z: 1

           }

   -------------------------------



4). QT演示程式開發 – Camera Capture

a). 原始碼和執行效果如下:

./ 程式碼

CameraMode.qml - https://github.com/simonqin09/QtQMLMultimedia/blob/master/CameraMode.qml


b). 具體要點說明如下

./ QML檔案首先通過Item和Component組合,並通過定義函式show 來載入Component 也就是Camera Capture主頁面。這裡為了控制CameraMode.qml不在程式一啟動就自動載入,增加了一個從main.qml傳遞過來的變數 camera_mode_visible。

./ 攝像頭的capture功能由 Camera 元素和Videooutput 元素配合實現,同樣將camera capture畫面顯示到預定義好的 640x480 解析度的 rectangle 中。

./ 使用 ListView 來顯示目前系統所連線的所有可用camera id,當點選時候實現camera id的切換以及重點顯示。

./ 定義了 start 和 stop 按鍵,用於開始和停止所選定camera id的影象捕獲。

./ 定義截圖按鍵,通過 Camera 元素裡面的 imageCapture屬性實現將所儲存的圖片顯示在影象捕獲視窗的下方區域。

./ 定義了 pagedestroy 函式,用於從當前頁面返回video player 頁面。



5). 程式部署配置

a). 將編譯好的可執行程式 “videotest”和所需要的視訊檔案“ready-player-one-trailer-2_h720p.mov” 複製到ApalisiMX6模組“/home/root” 目錄下。


b). 配置程式開機自啟動

./ 修改 /usr/bin/x-window-manager檔案為如下

-------------------------------

RET=1

while [ $RET -ne 0 ]; do

        cd/home/root

       /home/root/videotest -urlfile:///home/root/ready-player-one-trailer-2_h720p.mov

       RET=$?

done

-------------------------------



6). 程式執行演示

a). 開機後,系統自動啟動程式,如下所示

./ video player


./ camera capture

系統上面一共連線了兩個攝像頭,第一個目前正在cpature的是MIPI CSI OV5640 攝像頭模組,第二個是一個Logitech 720P USB 攝像頭。


b). CPU佔用率,通過 top 命令檢視

./ video player 播放視訊狀態,約為20% 左右。

-------------------------------

PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                          

 640 root      20   0  384796  45628  34032 S  19.8  4.4   2:15.30 videotest                                                                        

 554 root     19  -1  174652  12404   8684 S   3.3  1.2   0:20.38 Xorg                                                                             

 678 root     20   0    4796   2352   1920 R   1.2  0.2  0:00.19 top

-------------------------------

./ camera capture 開始捕獲影象狀態,約為21% 左右。

-------------------------------

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                          

 640 root      20   0  435508  45092  34012 S  21.6  4.4   1:46.03 videotest                                                                        

 554 root     19  -1  174652  12404   8684 S   3.3  1.2   0:16.26 Xorg                                                                             

 676 root     20   0    4796   2368   1936 R   1.5  0.2  0:01.80 top

-------------------------------



6). 總結

本文基於NXP iMX6嵌入式平臺在嵌入式linux系統下測試基於QML和QT Multimedia的多媒體應用,通過程式碼說明和程式執行結果可見,QML和QT multimedia的結合確實可以快速高效的構建一個介面化的多媒體應用,同時得益於QML的GPU加速以及針對NXP iMX系列的對應加速優化,其執行效率也非常之高。當然,在進行開發過程中也發現了一些問題,比如不夠靈活,不能像直接使用Gstreamer框架一樣自行定義pipeline元件,另外QML和C++的配合也需要一些學習和經驗才能靈活掌握,因此具體採用哪種方式還是要根據實際需要來決定。