亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        嵌入式Linux平臺(tái)下MPlayer圖形用戶(hù)界面的實(shí)現(xiàn)

        2014-11-20 08:18:16張?jiān)龌?/span>
        電視技術(shù) 2014年5期
        關(guān)鍵詞:圖形用戶(hù)界面開(kāi)發(fā)板嵌入式

        張?jiān)龌ⅲ?博,郭 銳

        (中北大學(xué)電子與計(jì)算機(jī)科學(xué)技術(shù)學(xué)院,山西太原030051)

        隨著信息技術(shù)的發(fā)展,嵌入式設(shè)備越來(lái)越多地走進(jìn)人們的日常生活。MPlayer是一款可在各主流操作系統(tǒng)上使用的多媒體播放器,也支持嵌入式Linux平臺(tái)。它是一款功能強(qiáng)大的多媒體播放器,支持所有主流的多媒體文件格式。美中不足的是,它的操作是基于命令行界面的,在嵌入式Linux平臺(tái)下還沒(méi)有一款圖形用戶(hù)界面,操作起來(lái)十分不方便。針對(duì)這個(gè)問(wèn)題,決定為其開(kāi)發(fā)一款基于Qt框架的圖形用戶(hù)界面[1-2]。Qt是一個(gè)跨平臺(tái)的C++應(yīng)用程序開(kāi)發(fā)框架,廣泛用于開(kāi)發(fā)GUI程序。在基于S3C6410微處理器和嵌入式Linux操作系統(tǒng)的軟硬件平臺(tái)上設(shè)計(jì)和實(shí)現(xiàn)了一款GUI軟件,該GUI軟件可以實(shí)現(xiàn)對(duì)MPlayer常用的控制功能,基本滿(mǎn)足了使用需要。本文即闡述了這款圖形用戶(hù)界面的設(shè)計(jì)和實(shí)現(xiàn)過(guò)程。

        1 Qt編程相關(guān)技術(shù)

        1.1 圖形用戶(hù)界面

        Qt的圖形用戶(hù)界面的基礎(chǔ)是QWidget。Qt中所有類(lèi)型的GUI組件如按鈕、標(biāo)簽、滑動(dòng)條等都派生自QWidget,而QWidget本身則為QObject的子類(lèi)。Widget負(fù)責(zé)接收鼠標(biāo)、鍵盤(pán)、觸摸屏和來(lái)自窗口系統(tǒng)的其他事件,并在屏幕上描繪了自身顯示。每一個(gè)GUI組件都是一個(gè)Widget,Widget還可以作為容器,在其內(nèi)包含其他Widget。

        QWidget不是一個(gè)抽象類(lèi)型,并且可以被放置在一個(gè)已存在的用戶(hù)界面中。若是Widget沒(méi)有指定父Widget,當(dāng)它顯示時(shí)就是一個(gè)獨(dú)立的視窗或是一個(gè)頂層Widget。Qt提供一種托管機(jī)制,當(dāng)Widget于創(chuàng)建時(shí)指定父對(duì)象,就可把自己的生命周期交給上層對(duì)象管理,當(dāng)上層對(duì)象被釋放時(shí),自己也被釋放,確保對(duì)象不再使用時(shí)都會(huì)被刪除。

        1.2 信號(hào)與槽

        信號(hào)與槽機(jī)制[3]是Qt的核心機(jī)制,同時(shí)也是Qt特有的機(jī)制。Qt利用信號(hào)與槽(signals/slots)機(jī)制取代傳統(tǒng)的callback來(lái)進(jìn)行對(duì)象之間的溝通。當(dāng)操作事件發(fā)生的時(shí)候,對(duì)象會(huì)發(fā)提交一個(gè)信號(hào)(signal);而槽(slot)則是一個(gè)函數(shù)接受特定信號(hào)并且運(yùn)行槽本身設(shè)置的動(dòng)作。信號(hào)與槽之間,則通過(guò)QObject的靜態(tài)方法connect來(lái)鏈接。信號(hào)在任何運(yùn)行點(diǎn)上皆可發(fā)射,甚至可以在槽里再發(fā)射另一個(gè)信號(hào),信號(hào)與槽的鏈接不限定為一對(duì)一的鏈接,一個(gè)信號(hào)可以鏈接到多個(gè)槽或多個(gè)信號(hào)鏈接到同一個(gè)槽,甚至信號(hào)也可連接到信號(hào)。

        1.3 布局管理

        布局管理類(lèi)型[4]用于描述一個(gè)應(yīng)用程序的用戶(hù)界面中的Widget是如何放置的。當(dāng)視窗縮放時(shí),布局管理器會(huì)自動(dòng)調(diào)整Widget的大小、位置或是字號(hào),確保它們相對(duì)的排列和用戶(hù)界面整體仍然保有可用性。

        Qt自帶的布局管理類(lèi)型有:QHBoxLayout、QVBoxLayout和QGridLayout。這些類(lèi)型繼承自QLayout,但QLayout非繼承自QWidget而是直接源于QObject。它們負(fù)責(zé)Widget的幾何管理。想要?jiǎng)?chuàng)建更復(fù)雜的布局管理,可以繼承QLayout來(lái)自定義布局管理類(lèi)型。

        QHBoxLayout:配置Widget成橫向一列;

        QVBoxLayout:配置Widget成垂直一行;

        QGridLayout:配置Widget在平面網(wǎng)格。

        2 開(kāi)發(fā)平臺(tái)的搭建

        本文的研究目的是設(shè)計(jì)實(shí)現(xiàn)一款嵌入式Linux平臺(tái)[5-6]下的MPlayer圖形用戶(hù)界面,需要主機(jī)PC平臺(tái)和嵌入式開(kāi)發(fā)板平臺(tái)。主機(jī)平臺(tái)上安裝的操作系統(tǒng)是Ubuntu 12.04,這是一款主流的GNU/Linux操作系統(tǒng)。開(kāi)發(fā)軟件為Qt Creator,它是Qt官方提供的一款輕量級(jí)的Qt/C++IDE開(kāi)發(fā)環(huán)境。嵌入式開(kāi)發(fā)板平臺(tái)采用Arm-Linux體系結(jié)構(gòu),硬件平臺(tái)以S3C6410處理器[2]為核心,操作系統(tǒng)版本為L(zhǎng)inux-3.0.1。要想在嵌入式平臺(tái)上運(yùn)行Qt程序,必須將Qt庫(kù)移植到嵌入式平臺(tái)中。在Qt官網(wǎng)上下載Qt libraries源碼包,按如下配置選項(xiàng)對(duì)Qt Libraries進(jìn)行配置:

        配置完成后進(jìn)行編譯,這樣編譯出來(lái)的就是Arm-Linux平臺(tái)下支持觸摸屏的Qt運(yùn)行庫(kù)。將編譯完成后的Qt庫(kù)放入嵌入式開(kāi)發(fā)板的文件系統(tǒng)中,并將Qt的環(huán)境變量添加到系統(tǒng)環(huán)境變量中。至此,開(kāi)發(fā)平臺(tái)搭建成功。

        3 圖形用戶(hù)界面的實(shí)現(xiàn)

        GUI程序啟動(dòng)后顯示主界面,主界面按功能分為兩個(gè)部分:播放顯示區(qū)和播放控制區(qū),其中播放顯示區(qū)占了屏幕的絕大部分。播放控制區(qū)內(nèi)分布著時(shí)間顯示標(biāo)簽、播放進(jìn)度條、音量調(diào)節(jié)條和所有的播放控制按鈕。主界面啟動(dòng)后,當(dāng)按下按鈕或拖動(dòng)滑動(dòng)條時(shí),就會(huì)實(shí)現(xiàn)相應(yīng)的功能。

        3.1 主界面

        主界面類(lèi)mainWidget繼承自QWidget,利用構(gòu)造函數(shù)對(duì)類(lèi)對(duì)象進(jìn)行初始化。主界面的實(shí)現(xiàn)原理是在一個(gè)父Widget上添加按鈕、標(biāo)簽、滑動(dòng)條等部件作為子Widget。類(lèi)mainWidget的構(gòu)造函數(shù)部分代碼如下:

        mainWidget::mainWidget(QWidget*parent)

        :QWidget(parent)

        {

        QWidget::setGeometry(QRect(0,0,800,480));

        //設(shè)置主界面大小;

        ……

        paceSlider=new QSlider(this);

        //添加播放進(jìn)度條;

        paceSlider- > setGeometry(QRect(42,450,716,5));

        //設(shè)置播放進(jìn)度條的位置和大小;

        paceSlider- >setOrientation(Qt::Horizontal);

        //設(shè)置進(jìn)度條為水平方向;

        connect(paceSlider,SIGNAL(sliderReleased()),this,SLOT(pacesliderreleased()));

        //關(guān)聯(lián)進(jìn)度條拖動(dòng)釋放信號(hào)和相應(yīng)槽函數(shù);

        …...

        playButton=new QPushButton("",this);

        //新建開(kāi)始按鈕;playButton - > setGeometry(QRect(42,455,25,25));

        //設(shè)置開(kāi)始按鈕的位置和大小;

        playButton->setIcon(icon_play);

        //設(shè)置開(kāi)始按鈕的圖標(biāo);

        connect(playButton,SIGNAL(clicked()),this,SLOT(play()));

        //關(guān)聯(lián)開(kāi)始按鈕按下信號(hào)和相應(yīng)槽函數(shù);

        ……

        }

        3.2 選擇文件功能

        播放開(kāi)始前必須先選擇播放文件。當(dāng)還沒(méi)有選擇好播放文件時(shí),按下開(kāi)始按鈕,會(huì)打開(kāi)選擇文件對(duì)話(huà)框。選擇文件對(duì)話(huà)框繼承自QDialog,對(duì)話(huà)框上的主要部件為播放文件列表、“添加”和“移除”按鈕。點(diǎn)擊“添加”按鈕會(huì)進(jìn)入文件目錄選擇文件,選中的文件會(huì)添加到播放文件列表中,點(diǎn)擊“移除”按鈕會(huì)移除播放列表中被選中的文件。雙擊播放列表中的一個(gè)文件或選中一個(gè)文件后按下對(duì)話(huà)框上的播放按鈕,就會(huì)開(kāi)始播放。選擇文件對(duì)話(huà)框如圖1所示。

        圖1 選擇文件對(duì)話(huà)框示意圖(截圖)

        3.3 播放文件功能

        播放文件時(shí),圖形用戶(hù)界面程序通過(guò)新建一個(gè)QProcess進(jìn)程來(lái)調(diào)用作為后端的MPlayer進(jìn)行播放。QProcess類(lèi)可以啟動(dòng)一個(gè)外部程序并與之進(jìn)行通信。MPlayer[7]啟動(dòng)后,QProcess進(jìn)程通過(guò)標(biāo)準(zhǔn)輸入輸出與之進(jìn)行通信交互。播放文件功能的實(shí)現(xiàn)代碼為

        QString program;//聲明一個(gè)外部程序;

        QStringList args;//聲明程序的運(yùn)行參數(shù);

        playProcess=new QProcess(this);

        //新建一個(gè)QProcess進(jìn)程來(lái)調(diào)用MPlayer;

        program="/usr/local/mplayer/bin/mplayer";

        //指定MPlayer程序路徑;

        args<<"-slave"<<"-quiet";

        //使MPlayer運(yùn)行于slave模式;

        args<<"-x"<<"800"<<"-y"<<"450";

        //指定MPlayer播放窗口的大小;

        args< <"-vo"< <"fbdev";

        //指定視頻輸出驅(qū)動(dòng)為FrameBuffer;

        args< <fileName;

        //指定播放文件;

        playProcess- >start(program,args);

        //啟動(dòng)MPlayer開(kāi)始播放;

        在播放進(jìn)行中,QProcess可以通過(guò)標(biāo)準(zhǔn)輸入對(duì)MPlayer發(fā)出指令,也可以通過(guò)標(biāo)準(zhǔn)輸出獲取播放文件的信息。用戶(hù)可以通過(guò)圖形用戶(hù)界面上的各個(gè)功能按鈕實(shí)現(xiàn)暫停/播放、停止、快進(jìn)(退)、上(下)一個(gè)、播放列表的顯示(隱藏)和音量調(diào)節(jié)等功能。按鈕控制的實(shí)現(xiàn)原理是信號(hào)與槽機(jī)制,點(diǎn)擊按鈕會(huì)觸發(fā)此按鈕的clicked()信號(hào),clicked()信號(hào)被觸發(fā)后,與之鏈接的槽函數(shù)會(huì)被執(zhí)行,只要在槽函數(shù)中加入相應(yīng)的功能代碼,就會(huì)實(shí)現(xiàn)相應(yīng)的控制功能。下面以快進(jìn)功能為例,介紹按鈕功能的實(shí)現(xiàn)方法。

        在定義快進(jìn)按鈕的時(shí)候鏈接快進(jìn)按鈕的clicked()信號(hào)和快進(jìn)功能槽函數(shù)forward():

        connect(forwardButton,SIGNAL(clicked()),this,SLOT(forward()));

        MPlayer快進(jìn)10 s的命令為“seek 10 0”,要想實(shí)現(xiàn)快進(jìn)10 s功能,就要在槽函數(shù)forward()中通過(guò)QProcess將這條命令發(fā)送給MPlayer。QProcess通過(guò)write()函數(shù)在標(biāo)準(zhǔn)輸入發(fā)送命令。forward()函數(shù)源碼如下:

        void mainWidget::forward()

        {

        playProcess- >write("seek 10 0n");

        }

        3.4 顯示時(shí)間功能

        GUI程序不僅能通過(guò)QProcess向MPlayer寫(xiě)入命令,還能通過(guò)QProcess獲取播放文件的媒體信息。在創(chuàng)建播放進(jìn)程playProcess的同時(shí),將playProcess的readyRead-StandardOutput()信號(hào)與槽函數(shù)dataRecieve()鏈接。play-Process進(jìn)程通過(guò)標(biāo)準(zhǔn)輸入向MPlayer發(fā)送獲取媒體信息的命令,MPlayer接收命令后會(huì)將媒體信息返回到標(biāo)準(zhǔn)輸出中,當(dāng)標(biāo)準(zhǔn)輸出中的數(shù)據(jù)信息可讀時(shí),會(huì)觸發(fā)playProcess的readyReadStandardOutput()信號(hào),與其關(guān)聯(lián)的槽函數(shù)dataRecieve()會(huì)被執(zhí)行。dataRecieve()讀取標(biāo)準(zhǔn)輸出中的數(shù)據(jù)信息后,經(jīng)過(guò)轉(zhuǎn)化顯示在GUI界面上。利用這個(gè)原理可以實(shí)現(xiàn)當(dāng)前播放時(shí)間和文件時(shí)間長(zhǎng)度的顯示。

        獲取文件時(shí)長(zhǎng)的命令為“get_time_length”,當(dāng)play-Process啟動(dòng)MPlayer以后,隨即通過(guò)playProcess->write("get_time_lengthn")指令向MPlayer發(fā)送命令獲取時(shí)長(zhǎng)。MPlayer返回的時(shí)長(zhǎng)信息以“ANS_LENGTH”開(kāi)頭,隨后為以秒為單位的時(shí)間數(shù)據(jù)。槽函數(shù)dataRecieve()讀取信息后會(huì)把以秒為單位的時(shí)間數(shù)據(jù)轉(zhuǎn)化成“分:秒”的形式顯示在GUI界面上。

        當(dāng)前時(shí)間的顯示需要每秒更新1次。通過(guò)在MPlayer啟動(dòng)時(shí)建立1個(gè)QTimer類(lèi)定時(shí)器,定時(shí)時(shí)間為1 s。每隔1 s定時(shí)器就會(huì)觸發(fā)一次時(shí)間截止信號(hào)timeout(),與timeout()信號(hào)鏈接的槽函數(shù)timeok()會(huì)讓playProcess發(fā)送一條獲取當(dāng)前時(shí)間的指令“get_time_pos”給MPlayer,返回的當(dāng)前時(shí)間以“ANS_TIME_POSITION”開(kāi)頭。這樣,dataRecieve()就能每隔1秒更新1次GUI界面上當(dāng)前時(shí)間標(biāo)簽。

        3.5 中文字體支持

        首先將文泉驛字體wenquanyi_120_50.qpf放到開(kāi)發(fā)板上Qt目錄中的lib/fonts文件夾下,“120”表示是12號(hào)字體,“50”表示細(xì)體。有了字體文件后,就可以在GUI界面的主程序中選擇使用中文字體,其實(shí)現(xiàn)代碼為:

        QApplication app(argc,argv);//聲明程序

        QFont font0;//聲明一個(gè)字體font0

        font.setFamily(("wenquanyi"));//設(shè)置font0字體家族為文泉驛

        font.setPointSize(12);//設(shè)置font0字體字號(hào)為12

        font.setBold(false);

        app.setFont(font);//設(shè)置程序所用字體為font0

        4 軟件運(yùn)行測(cè)試

        全部程序編寫(xiě)完成以后,首先進(jìn)行qmake讓其自動(dòng)生成Makefile文件,再進(jìn)行make就生成了開(kāi)發(fā)板上的可執(zhí)行文件,將可執(zhí)行文件和圖標(biāo)文件一起放到開(kāi)發(fā)板的相應(yīng)文件夾下。經(jīng)過(guò)在開(kāi)發(fā)板平臺(tái)上的運(yùn)行測(cè)試,結(jié)果表明,該圖形用戶(hù)界面在嵌入式Linux平臺(tái)上能穩(wěn)定運(yùn)行,各項(xiàng)設(shè)計(jì)的功能都能實(shí)現(xiàn)且性能良好。運(yùn)行測(cè)試效果圖如圖2所示。

        圖2 播放文件示意圖(截圖)

        5 結(jié)束語(yǔ)

        本文設(shè)計(jì)并實(shí)現(xiàn)了一款嵌入式Linux平臺(tái)下的MPlayer圖形用戶(hù)界面,該圖形用戶(hù)界面基于Qt框架開(kāi)發(fā),利用了MPlayer的slave模式并通過(guò)QProcess進(jìn)程控制MPlayer,實(shí)現(xiàn)了選擇文件、播放控制等常用功能,成功地解決了MPlayer在嵌入式Linux平臺(tái)下沒(méi)有圖形用戶(hù)界面的問(wèn)題,具有很高的實(shí)用性。經(jīng)過(guò)測(cè)試,該界面程序運(yùn)行穩(wěn)定、操作良好,滿(mǎn)足了設(shè)計(jì)要求。

        [1]于幫偉,鄧華秋.基于Qt/Embedded的嵌入式數(shù)字監(jiān)控系統(tǒng)控制界面的實(shí)現(xiàn)[J].電視技術(shù),2011,35(24):25-28.

        [2]雷豐中,劉鵬.基于S3C6410的多媒體系統(tǒng)設(shè)計(jì)[J].電視技術(shù),2011,35(11):24-27.

        [3] Qt Project Group.Qt開(kāi)發(fā)官方參考文檔[EB/OL].[2013-05-25].http://qt-project.org/doc/qt-4.8/.

        [4]蔡志明,盧傳富,李立夏.精通Qt4編程[M].北京:電子工業(yè)出版社,2011.

        [5]吳燕燕.基于ARM9平臺(tái)上Qt/Embedded的移植與開(kāi)發(fā)[J].液晶與顯示,2013,28(2):261-264.

        [6]閔華松,王娜,譚金鑫.嵌入式多媒體播放器通用控制系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程與科學(xué),2009,31(2):153-155.

        [7] MPlayer-電影播放器[EB/OL].[2013-05-25].http://www.mplayerhq.hu.

        猜你喜歡
        圖形用戶(hù)界面開(kāi)發(fā)板嵌入式
        圖形用戶(hù)界面外觀(guān)設(shè)計(jì)專(zhuān)利保護(hù)問(wèn)題探析——以“奇虎訴江民案”為例
        淺談圖形用戶(hù)界面(GUI)技術(shù)專(zhuān)利現(xiàn)狀
        搭建基于Qt的嵌入式開(kāi)發(fā)平臺(tái)
        Microchip最新推出兩款PIC32 Curiosity開(kāi)發(fā)板
        圖形用戶(hù)界面法律保護(hù)問(wèn)題與對(duì)策
        淺析單片機(jī)開(kāi)發(fā)板的設(shè)計(jì)與制作
        電子制作(2017年22期)2017-02-02 07:10:14
        嵌入式軟PLC在電鍍生產(chǎn)流程控制系統(tǒng)中的應(yīng)用
        Mouser為您呈上開(kāi)發(fā)關(guān)鍵之STMicroelectronics Nucleo開(kāi)發(fā)板
        Arduino和Atmel發(fā)布Arduino Zero開(kāi)發(fā)板
        Altera加入嵌入式視覺(jué)聯(lián)盟
        91九色视频在线国产| 国产伦精品一区二区三区免费| 成人无码一区二区三区网站| av深夜福利在线| 在线一区二区三区视频观看| 亚洲中文乱码在线观看| 日产精品高潮一区二区三区5月| 成人免费无码视频在线网站| 草草浮力地址线路①屁屁影院| 欧美午夜精品久久久久久浪潮| 国产成人精品人人做人人爽| 蜜桃视频网址在线观看| 国产精品久久久免费精品| 麻豆婷婷狠狠色18禁久久| 韩国精品一区二区三区无码视频 | 国产午夜鲁丝片av无码| 日韩成人无码一区二区三区| 国产伦码精品一区二区| 九九久久精品一区二区三区av| 可免费观看的av毛片中日美韩| 成午夜精品一区二区三区| 日本免费人成视频播放| 亚洲 国产 韩国 欧美 在线| 国产偷闻女邻居av在线观看| 丰满女人猛烈进入视频免费网站| 久久久久亚洲av成人网人人网站| 放荡的闷骚娇妻h| 人妻av午夜综合福利视频| 一本色道久久综合亚洲精品不| 欧美日韩在线视频| 无码福利写真片视频在线播放| 国产精品爽爽va在线观看网站| 国产精品三级1区2区3区| 成人自拍小视频在线看| 国产在线精品一区二区三区直播| 成人网站免费大全日韩国产| 亚洲av午夜成人片精品| 亚洲a级视频在线播放| 豆国产96在线 | 亚洲| 国产乱色精品成人免费视频| 久久久久久久国产精品电影|