嵌入式Linux基于QML開發(fā)QtMultimedia應用
1). 簡介
使用QML語言進行QT應用程序開發(fā)可以將界面開發(fā)和邏輯控制分開,提高應用的開發(fā)周期和靈活性;另外對于多媒體應用非常重要的一點是,基于QML/QT Quick 的應用程序可以直接調(diào)用GPU進行加速,這大大提高了多媒體應用在嵌入式系統(tǒng)環(huán)境下的處理效率和資源占用,因此本文就基于QML和QT Multimedia組件介紹多媒體應用開發(fā)。
本文所演示的平臺來自于Toradex Apalis iMX6 ARM嵌入式平臺,這是一個基于NXP iMX6ARM處理器,支持雙核/四核Cortex-A9。
2). 準備
a). ApalisiMX6 ARM核心版配合Ixora載板,連接調(diào)試串口UART1到開發(fā)主機方便調(diào)試。
b). Apalis iMX6系統(tǒng)使用基于OpenEmbedded框架重新編譯的集成Qt5.9支持的ToradexLinux image release V2.8b2 版本以及對應的SDK。可以結(jié)合這里的說明自行編譯,需要修改的local.conf 文件如下,image更新方法請參考這里。
-------------------------------
IMAGE_INSTALL_append = "gstreamer1.0-plugins-bad-* gstreamer1.0-plugins-ugly-* gstreamer1.0-libav"
PACKAGECONFIG_append_pn-qtmultimedia =" gstreamer"
-------------------------------
c). 關于開發(fā)主機SDK安裝和Qt creator開發(fā)環(huán)境的配置請參考這里。
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演示程序開發(fā) – 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組件在底層也是調(diào)用GstreamerPlaybin元件進行媒體播放操作,因此在編程之前,首先可以直接使用Gstreamer pipeline在嵌入式系統(tǒng)先驗證下,確保媒體可以正常播放,沒有解碼器缺失的情況。
-------------------------------
$ 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 文件用于實現(xiàn)video player界面以及媒體播放。
- 媒體播放主要由 ”Mediaplayer”元素和 ”VideoOutput” 元素來配合實現(xiàn)。然后將其顯示在定義好的640x480分辨率的rectangle中。
- 定義了一些控制播放和音量的按鍵,當點擊時候會有顏色的變化指示。
- 使用了 Connections 用于信號觸發(fā)操作,這里對應為當發(fā)現(xiàn)媒體播放停止的時候自動將 Play 按鍵的顏色變更為初始狀態(tài)。
- 在頁面切換按鍵處,使用了loader功能來加載 Camera Capture 頁面,需要注意的是同時也需要在main.qml 中創(chuàng)建一個 CameraMode.qml 的實例以便于操作。
-------------------------------
CameraMode {
id: cameramode1
anchors.fill: parent
z: 1
}
-------------------------------
4). QT演示程序開發(fā) – Camera Capture
a). 源代碼和運行效果如下:
./ 代碼
CameraMode.qml - https://github.com/simonqin09/QtQMLMultimedia/blob/master/CameraMode.qml
b). 具體要點說明如下
./ QML文件首先通過Item和Component組合,并通過定義函數(shù)show 來加載Component 也就是Camera Capture主頁面。這里為了控制CameraMode.qml不在程序一啟動就自動加載,增加了一個從main.qml傳遞過來的變量 camera_mode_visible。
./ 攝像頭的capture功能由 Camera 元素和Videooutput 元素配合實現(xiàn),同樣將camera capture畫面顯示到預定義好的 640x480 分辨率的 rectangle 中。
./ 使用 ListView 來顯示目前系統(tǒng)所連接的所有可用camera id,當點擊時候?qū)崿F(xiàn)camera id的切換以及重點顯示。
./ 定義了 start 和 stop 按鍵,用于開始和停止所選定camera id的圖像捕獲。
./ 定義截圖按鍵,通過 Camera 元素里面的 imageCapture屬性實現(xiàn)將所保存的圖片顯示在圖像捕獲窗口的下方區(qū)域。
./ 定義了 pagedestroy 函數(shù),用于從當前頁面返回video player 頁面。
5). 程序部署配置
a). 將編譯好的可執(zhí)行程序 “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). 開機后,系統(tǒng)自動啟動程序,如下所示
./ video player
./ camera capture
系統(tǒng)上面一共連接了兩個攝像頭,第一個目前正在cpature的是MIPI CSI OV5640 攝像頭模塊,第二個是一個Logitech 720P USB 攝像頭。
b). CPU占用率,通過 top 命令查看
./ video player 播放視頻狀態(tài),約為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 開始捕獲圖像狀態(tài),約為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). 總結(jié)
本文基于NXP iMX6嵌入式平臺在嵌入式linux系統(tǒng)下測試基于QML和QT Multimedia的多媒體應用,通過代碼說明和程序運行結(jié)果可見,QML和QT multimedia的結(jié)合確實可以快速高效的構建一個界面化的多媒體應用,同時得益于QML的GPU加速以及針對NXP iMX系列的對應加速優(yōu)化,其執(zhí)行效率也非常之高。當然,在進行開發(fā)過程中也發(fā)現(xiàn)了一些問題,比如不夠靈活,不能像直接使用Gstreamer框架一樣自行定義pipeline元件,另外QML和C++的配合也需要一些學習和經(jīng)驗才能靈活掌握,因此具體采用哪種方式還是要根據(jù)實際需要來決定。
提交
Verdin AM62 LVGL 移植
基于 NXP iMX8MM 測試 Secure Boot 功能
隆重推出 Aquila - 新一代 Toradex 計算機模塊
Verdin iMX8MP 調(diào)試串口更改
NXP iMX8MM Cortex-M4 核心 GPT Capture 測試