徐特
(蘇州長風(fēng)航空電子有限公司 江蘇省蘇州市 215151)
音視頻播放器是指能播放以數(shù)字信號形式存儲的音頻及視頻的軟件程序。目前市面上存在數(shù)十種播放器,適用于桌面端、移動端等各種場景,有的設(shè)計精簡、有的功能強大,一般都能支持各種常見的媒體格式(.mkv、.rmvb、.mpg、.mp4、.avi 等)。雖然各種播放器性能和功能都各不相同,但也有一些不足之處,如暴風(fēng)影音占用系統(tǒng)資源大,射手播放器的播放列表并不顯示到主界面上等,且通常無法支持六路同時播放。本文將根據(jù)特定需求,設(shè)計并實現(xiàn)一款界面簡潔,操作簡單,功能強大,支持多種媒體格式的音視頻播放器。
音視頻播放器應(yīng)具備以下主要功能:
(1)六路音視頻同時解碼,按數(shù)據(jù)編碼時間戳播放同步播放;
(2)可進行播放、暫停、停止等操作;
(3)可調(diào)節(jié)音量;
(4)可隨意切換“六等分畫面”、“主從畫面”、“單畫面”三種模式進行播放;
(5)單幀前進及單幀后退播放功能;
(6)對文件中標(biāo)記的時間進行快速跳轉(zhuǎn)查找;
(7)具備時間搜索定位功能,精確到秒級;
(8)支持快進播放和慢放功能;
(9)支持快退播放;
(10)提供主要狀態(tài)信息查詢功能;
(11)具有用戶名、密碼等權(quán)限管理功能;
(12)具備視頻截圖和視頻截取功能;
(13)可將記錄載體中的記錄數(shù)據(jù)文件下載到本地硬盤。
QT 是諾基亞開發(fā)的一個跨平臺的C++圖形用戶界面應(yīng)用程序框架。自QT 進入商業(yè)領(lǐng)域,它已經(jīng)成為全世界范圍內(nèi)數(shù)千種成功的應(yīng)用程序的基礎(chǔ)。信號和槽機制是QT 的核心機制,信號和槽是一種高級接口,應(yīng)用于對象之間的通信,它是QT 的核心特性,也是QT 區(qū)別于其它工具包的重要地方。
Qt 提供了一整套的窗口部件。它們組合起來可用于創(chuàng)建用戶界面的可視元素。按鈕、菜單、滾動條、消息框和應(yīng)用程序窗口都是窗口部件的實例。
mpv 是開源播放器mplayer 和mplayer2 的一個分支,界面精簡,功能齊全。其在Linux 上擁有廣泛的輸出設(shè)備支持,相對于PotPlayer 它最大的特點是跨平臺,支持動態(tài)lua 腳本解析,可高度定制化。內(nèi)置ffmpeg 解碼器,支持絕大部分的視頻和音頻格式,支持ass 特效字幕,GPU 解碼能力十分出色,支持本地播放和網(wǎng)絡(luò)播放。mpv 官方提供了一個Qt 的demo,可以下載學(xué)習(xí)mpv 的Qt 二次開發(fā)。
(1)QT 官網(wǎng)上下載Qt 5.6.1 mingw32 位安裝包并安裝完成。
(2)配置mpv。
在mpv 官網(wǎng)上下載mpv 開發(fā)包,包含.h 文件、.lib 文件和.dll 文件,在Qt 工程的.pro 文件中添加包含mpv 的.h文件和.lib 文件的路徑。將mpv-1.dll 文件拷貝至Qt 生成的.exe 文件所在的路徑下。
軟件登錄界面設(shè)置了用戶名和密碼輸入窗口,實現(xiàn)對用戶登錄進行權(quán)限管理,保障了軟件使用的安全性,用戶權(quán)限分為以下兩種:
普通用戶:可使用播放器的所有功能
管理員用戶:可使用播放器的所有功能,且可以對普通用戶進行管理,包括增加、修改、刪除用戶等。
播放器主界面如圖1 所示。(1)“文件”可以選擇需要播放的視頻文件夾;
圖1:播放器主界面
(2)“控制”可以選擇文件加載,跳轉(zhuǎn)到文件加載界面,還可以選擇界面布局,等分或主從;
(3)包括“版本信息”,“檢測修復(fù)”和“格式化”;
(4)在管理員賬號下會顯示“管理”菜單,可實現(xiàn)對賬號的增加、修改和刪除操作;
(5)單個播放界面的開始/暫停和停止按鈕;
(6)分別為截圖和視頻截取按鈕,點擊截圖后可自動將當(dāng)前畫面保存為圖片,點擊視頻截取按鈕后會彈出對話框,輸入起始時間實現(xiàn)視頻截取,如圖2 所示。
圖2:視頻截取
(7)等分和主從模式切換按鈕;
(8)跳至上一幀和下一幀;
(9)時間檢索輸入框,在框內(nèi)輸入需要檢索的時間點,按回車鍵后即可跳轉(zhuǎn)至該時間點播放;
(10)選擇播放速度;
(11)備用按鍵,令其他路視頻與第一路同步;
(12)根據(jù)mark 文件進行跳轉(zhuǎn);
(13)根據(jù)shoot 文件進行跳轉(zhuǎn);
(14)音量控制條。
使用mpv 來解碼播放,需要用mpv_node 處理,而Qt中如何轉(zhuǎn)成mpv_node 需要特殊的處理才行,因此自己直接封裝多個接口,傳入的參數(shù)都支持QVariant 類型,提高了兼容性,可以傳入各種不同類型的數(shù)據(jù)參數(shù)。
主要通用接口如下:
封裝完通用接口后就可以通過命令和屬性的調(diào)用來實現(xiàn)視頻的解碼播放和播放控制等,為方便使用,先封裝一個mpv 播放器類和一個視頻顯示窗體類,在mpv 播放器類中封裝一些常用的接口,比如播放、暫停、獲取視頻總長、靜音、截圖等。
解碼播放的流程如下:
(1)調(diào)用mpv_create 創(chuàng)建實例。
(2)調(diào)用mpv_set_option 設(shè)置播放句柄。
(3)調(diào)用mpv_set_property 設(shè)置一些屬性比如啟用鍵盤輸入等。
(4)調(diào)用mpv_set_option 設(shè)置一些參數(shù)比如硬解碼、超時時間等。
(5)調(diào)用mpv_initialize 初始化實例。
(6)調(diào)用mpv_command_async 執(zhí)行命令loadfile 打開文件播放。
(7)調(diào)用mpv_terminate_destroy 釋放實例。
解碼播放的核心代碼如下:
用mpv 來讀取文件的信息以及設(shè)置當(dāng)前播放進度、音量等是通過讀取和設(shè)置屬性來處理的,具體有哪些屬性及各自的含義可以在mpv 官網(wǎng)上查找。
常用的一些屬性:
(1)視頻原始寬度高度width height
(2)視頻保存視頻文件 stream-record 為空則表示停止錄像
(3)暫停播放 pause yes 表示暫停no 表示繼續(xù)
(4)視頻文件時長 duration
(5)靜音 mute yes 表示靜音no 表示非靜音
(6)獲取播放進度 time-pos
(7)設(shè)置播放進度 seek
(8)截圖 screenshot-to-file
登錄及用戶管理通過數(shù)據(jù)庫來實現(xiàn),Qt 中對數(shù)據(jù)庫的操作主要通過QSqlQuery 實現(xiàn),QSqlQuery 提供了執(zhí)行數(shù)據(jù)庫語句的方法,在Qt 中利用QSqlQuery 類實現(xiàn)了執(zhí)行SQL語句。
核心代碼如下:
經(jīng)測試,該播放器可同時流暢播放六路音視頻,播放效果如圖3。
圖3:視頻播放效果圖
本文設(shè)計的音視頻播放器經(jīng)實際使用,能夠滿足前面所提的所有需求,可實現(xiàn)六路音視頻同時播放,可實現(xiàn)播放、暫停、停止、快進、快退、音量調(diào)節(jié)和時間顯示等播放控制功能,支持多種常見的多媒體格式,畫面播放流暢,界面簡潔,操作便捷,占用空間小,完成了預(yù)期的目標(biāo)。