嵌入式Qt開發(fā)一個視頻播放器
本篇繼續(xù)來實現(xiàn)一個Qt視頻播放器軟件,可以實現(xiàn)視頻列表的顯示與選擇播放等,先來看下最終的效果:

本篇的Qt代碼從野火開發(fā)板的例程中移植修改而來,下面分析下程序的代碼結(jié)構(gòu)。
1 視頻播放器開發(fā)總體結(jié)構(gòu)
整個Qt視頻播放器項目的代碼結(jié)構(gòu)如下:
主代碼中是視頻播放器相關(guān)的代碼,包括:
視頻播放器主界面
視頻名列表界面:在視頻播放時可以查看視頻列表并切換視頻
Qt視頻播放界面:實現(xiàn)單純的視頻播放
操作按鈕界面:實現(xiàn)播放、暫停、繼續(xù)、上一個、下一個、進度調(diào)節(jié),音量調(diào)節(jié)
播放預(yù)覽列表界面:在進入視頻播放之前的視頻預(yù)覽列表界面
Ui代碼中使用一些Qt的基本功能,包括:
一個Qt界面基類
滑條功能類
圖標按鈕顯示類
列表功能類
工具類
視頻幀解析
頁面列表類
Skin中是一些圖片資源和字體/皮膚定義
最后是編譯的中間文件和編譯結(jié)果存儲的目錄

下面分類介紹了程序的主要代碼實現(xiàn)。
2 通用界面代碼
上篇介紹音樂播放器時,介紹過一些自定義控件的代碼,本篇的視頻播放器,可以復(fù)用這些代碼:
qtwidgetbase:窗口基類,該類的一個主要功能是可以向窗口內(nèi)添加圖片形式的按鈕
qtsliderbar:用于實現(xiàn)自定義滑條控件,分為水平滑條與豎直滑條
qtpixmapbutton:圖片按鈕,支持未按下和按下后的兩種樣式的圖片顯示
qtlistwidget :基礎(chǔ)的列表顯示
相比于音樂播放器,視頻播放器還需要其它額外的功能,如下:
2.1 qttoolbar
工具條的基類,通過創(chuàng)建一個QPropertyAnimation屬性動畫對象,主要實現(xiàn)工具條的顯示與隱藏的動畫效果。
例如,在用戶無操作一段時間后,將上方的標題欄和下方的播放工具欄隱藏。

主要代碼如下:
2.2 qtvideowidgetsurface
視頻幀解析類,繼承自QAbstractVideoSurface類,這是一個抽象基類,通過實現(xiàn)它的派生類可以獲取來自QMediaPlayer或QCamera視頻的幀。
supportedPixelFormats 用于向Qt返回幀流的圖像類型
present 用于獲取到每一幀
2.3 qtpagelistwidget
頁面形式的預(yù)覽排布以及左右頁面的滑動切換
2.3.1 QtPageListWidgetItem
該類用于表示列表中的每一個項,可以是字符,并且可以帶有圖片(圖標):
2..3.2 QtPageListWidget
注意,該類和qtlistwidget類的功能比較相似
3 視頻播放器代碼
首先是整體的主界面部分,進行各項功能的初始化顯示,主要包括:
播放列表初始化(視頻預(yù)覽列表界面)
視頻播放界面初始化(先隱藏播放界面)
界面效果如下:

主要代碼邏輯:
初始化各個界面后,還要連接對應(yīng)的槽函數(shù),如切換視頻播放列表中的視頻時的處理等。
3.1 視頻播放
視頻播放部分,主要有兩部分功能:
視頻解碼播放:使用Qt自帶的媒體播放器組件進行音頻播放
播放時的按鈕操作:實現(xiàn)播放、暫停、繼續(xù)、上一個、下一個、進度調(diào)節(jié),音量調(diào)節(jié)

3.1.1 QMediaPlayer播放視頻
這里使用Qt自帶的QMediaPlayer組件進行視頻的播放,QMediaPlayer播放視頻于播放音頻的步驟類似。
本項目的視頻播放初始化部分:
3.1.2 播放操作按鈕
視頻播放時,需要用到播放、暫停、繼續(xù)、上一個、下一個、進度調(diào)節(jié)、音量調(diào)節(jié)等操作按鈕,這里的對應(yīng)按鈕使用圖標顯示為對應(yīng)的按鈕,通過加載QPixmap來實現(xiàn):
3.2 播放列表
播放列表功能用來實現(xiàn)視頻文件的顯示,以及手動指定切換要播放的視頻。

3.2.1 讀取視頻文件
通過讀取指定目錄下的文件,查找類型為mp4的視頻文件,構(gòu)造視頻播放列表。
3.2.2 視頻列表界面
視頻列表的具體界面實現(xiàn),主要是在對應(yīng)的矩形位置,顯示各個視頻文件的名稱:
3.3 視頻預(yù)覽列表
在進入正式的視頻播放前,會先有一個視頻預(yù)覽列表界面,在這個界面會列出指定搜索目錄下的所有視頻,點擊任意視頻圖標即可進入播放界面。

此部分的列表繪制代碼邏輯如下:
4 編譯與測試
4.1 在Windows平臺編譯
Qt程序編寫好后,可以先在Windows電腦上編譯查看效果,在運行時,可能會遇到如下問題:
DirectShowPlayerService::doRender: Unresolved error code 0x80040266 (IDispatch error #102)
編譯的時候沒問題,但運行的時候報錯:

這是因為Qt 中的多媒體播放,底層是使用DirectShowPlayerService,所以Windows電腦上需要先安裝一個DirectShow解碼器,例如LAV Filters??梢缘竭@里(https://github.com/Nevcairiel/LAVFilters/releases)下載并安裝 LAVFilters:

下載exe安裝包安裝即可,安裝后,再運行就不會報錯了,在Windows系統(tǒng)上運行視頻播放器的效果如下:

4.2 交叉編譯并在板子上運行
通過交叉編譯,來測試視頻播放器在OK3568-C板子上的播放效果。
使用編譯音樂播放器時編寫my3568build.sh的編譯腳本編譯即可,無需修改:
執(zhí)行該腳本即可編譯:
./my3568build.sh

將編譯成功的可執(zhí)行文件VIdeoPlayer復(fù)制到OK3568-C板子中,然后在其同目錄下創(chuàng)建一個video文件夾,里面放入若干個mp4視頻文件,然后就可以測試了,此外,代碼中,還指定了/userdata/media這個搜索目錄,這里有板子自帶的一些視頻:

文件復(fù)制到板子,我這里仍然使用的ADB無線傳輸?shù)姆绞剑容^方便,具體ADB操作演示,可參考之前這篇文章(RK3568源碼編譯與交叉編譯環(huán)境搭建)最后的Qt交叉編譯與測試部分
需注意的是,板子里的這個Linux系統(tǒng),不支持中文的顯示,視頻名不要有中文。
實測效果見文末視頻,整體體驗播放流暢,視頻切換流程,進度條調(diào)整播放進度沒有音樂播放器調(diào)整的順暢,另外不知道怎么原因,視頻播放的聲音外放聲音特別小,用耳機插孔聽是正常的。
5 總結(jié)
本篇介紹了使用Qt開發(fā)一個視頻播放器,一些功能代碼是復(fù)用上篇的音樂播放器的代碼,使用Qt Creator編寫視頻播放器的代碼,首先在Windows電腦上編譯運行測試,然后交叉編譯,在OK3568-C開發(fā)板上進行實際測試。
該視頻播放器實現(xiàn)的功能包括基礎(chǔ)的播放功能、暫停與繼續(xù),音量調(diào)節(jié),視頻列表顯示,下一個、下一個切換,進度條調(diào)節(jié)播放進度等。
嵌入式Qt開發(fā)一個視頻播放器的評論 (共 條)
