武漢電腦培訓(xùn)資訊:基于 QT 和 mplayer 的 MP4播放器設(shè)計(jì)

武漢
當(dāng)前位置:求學(xué)問(wèn)校網(wǎng)首頁(yè)>武漢資訊>武漢電腦培訓(xùn)資訊

基于 QT 和 mplayer 的 MP4播放器設(shè)計(jì)

來(lái)源:求學(xué)問(wèn)校網(wǎng)     發(fā)表時(shí)間:2011-08-31     瀏覽 699

作者:武漢華嵌技術(shù)部
 
一、環(huán)境搭建
1、開(kāi)發(fā)環(huán)境
主機(jī)環(huán)境:ubuntu8.04
編譯工具:gcc-4.2.4
界面工具:qt4
 
2、主機(jī)端安裝 mplayer,將MPlayer-1.0rc2.tar.bz2、libmad-0.15.1b.tar.gz(1 個(gè)mp3 音頻解碼庫(kù))拷貝到 linux 系統(tǒng)中,如:/home/linux/mplayer 目錄下。
   (1)安裝 libmad-0.15.1b.tar.gz
        #tar xvfz libmad-0.15.1b.tar.gz
         #cd libmad-0.15.1b
         #./configure
         #make
         #mkdir /lib/lib
         #mkdir /lib/include
         #cp mad.h /lib/include
         #cp .libs/libmad.a /lib/lib
   (2)安裝 mplayer
         #tar xvfj MPlayer-1.0.rc2.tar.bz2
         #cd MPlayer-1.0rc2
         #./configure --with-extraincdir=/lib/include
            --with-extralibdir=/lib/lib
         #make
         #make install
 
 此時(shí)可以試著播放一下 mp3、avi 等文件了
         # mplayer -ac mad 1.mp3
        # mplayer -ac mad 2.avi
 
二、實(shí)現(xiàn)原理
      利用mplayer的slave模式來(lái)實(shí)現(xiàn)播放器的功效。所謂的 slave 模式,就是 mplayer在運(yùn)行過(guò)程中能夠接收用戶的輸入命令行,具體支持哪些命令行,能夠通過(guò) mplayer -input cmdlist 這條命令來(lái)得到,在 Mplayer 源碼的 slave.txt 中也有對(duì)這些命令有詳細(xì)的講解。Slave 模式下工作的 Mplayer 可以和系統(tǒng)的標(biāo)準(zhǔn)輸入、輸出進(jìn)行信息交互。我們可以用 linux C 編程來(lái)完成對(duì) slave 模式工 作的 Mplayer 進(jìn)行控制和信息獲取。
如:
mkfifo(“/tmp/fifo”񫧉);
可以使用 popen()來(lái)打開(kāi) Mplayer
FILE* mp;
mp=popen(“mplyer /home/linux/1.mp3 -quiet –slave –input file=/tmp/fifo,”r”); 可以通過(guò)管道/tmp/fifo 給 mplayer 發(fā)送命令,通過(guò) mp 獲取 mplay 的返回?cái)?shù)據(jù) 如:system(“echo \”mute 0\” > /tmp/fifo”);//寫(xiě)命令
fgets(buf񫪨,mp);//讀取 mplay 返回?cái)?shù)據(jù)
 
而 Qt 給我們提供了更方便的實(shí)現(xiàn)方法。
通過(guò)定義一個(gè) QProcess 對(duì)象調(diào)用已編譯好的 Mplayer。
QProcess *process = new QProcess();
process->setProcessChannelMode(QProcess::MergedChannels); Process->start(“mplayer –ac mad xxxxx”);
在命令中添加 -slave 和 -quiet 就可以通過(guò)命令設(shè)置 Mplayer 實(shí)現(xiàn)相應(yīng)的功能。在mplayer 源碼中的,slave.txt 中對(duì)這些命令有
詳細(xì)的講解。
Process->start(“mplayer –slave –quiet –ac mad xxxxx”);
 
1、暫停功能
    通過(guò)如下代碼可以設(shè)置 Mplayer 暫停。
    process->write(“pause\n”);
    執(zhí)行這段代碼的時(shí)候如果是播放狀態(tài)就會(huì)暫停,暫停狀態(tài)時(shí)就會(huì)繼續(xù)播放。
 
2、獲取播放文件的總時(shí)間和當(dāng)前播放進(jìn)度
     執(zhí)行下面代碼時(shí),Mplayer 將時(shí)間輸出在標(biāo)準(zhǔn)輸出顯示。
     process->write("get_time_pos\n");
     process->write("get_time_length\n");
    通過(guò)如下代碼即可讀出我們需要的信息:
    connect(process,SIGNAL(readyReadStandardOutput()),this,SLOT(back_message_slots()));
    process 有可讀取的信息時(shí),發(fā)出信號(hào),在槽函數(shù) back_message_slots()中讀取信息。
   void MPlayer::back_message_slots()
   {
       while(process->canReadLine())
      {
          QString message(process->readLine());
         //message 即為讀取的信息我們可以根據(jù)需要取我們要的信息如
         //文件總時(shí)間為:ANS_LENGTH=23.00
         //當(dāng)前時(shí)間為:ANS_TIME_POSITION=23.00
       }
    }

3、快進(jìn)功能
    seek <value> [type]
    Seek to some place in the movie.
    0 is a relative seek of +/- <value> seconds (default).
    1 is a seek to <value> % in the movie.
    2 is a seek to an absolute position of <value> seconds.
    下面代碼即可實(shí)現(xiàn)快進(jìn)功能:
      process->write(“seek ** 1\n”);

4、音量調(diào)節(jié)
     volume <value> [abs]
     Increase/decrease volume or set it to <value> if [abs] is nonzero.
     下面代碼即可實(shí)現(xiàn)快進(jìn)功能:
     Process->write(“volume -1\n”);        //音量減小
     Process->write(“volume +1\n”);       //音量增加

5、靜音功能
     mute [value]
    Toggle sound output muting or set it to [value] when [value] >= 0 (1 == on, 0 == off).
    下面代碼即可實(shí)現(xiàn)快進(jìn)功能:
     process->write("mute 0\n");      //開(kāi)啟靜音
     process->write("mute 1\n");      //關(guān)閉靜音

6、定位視頻窗口
      通過(guò)上面的代碼基本功能實(shí)現(xiàn)了,可是播放視頻的時(shí)候發(fā)現(xiàn)又彈出一個(gè)窗口。并沒(méi)有出現(xiàn)在我們的窗口里。 如下代碼即可  時(shí)間窗口的定位。
    QString command = "mplayer -slave -quiet -ac mad -zoom movie/" + file_name + "-wid " + QString::number(widget->winId());
     process->start(command);
    紅色部分實(shí)現(xiàn)窗口的定位。Widget 是一個(gè) QWidget 對(duì)象。通過(guò) winId 可以獲得一 個(gè)數(shù)字,-wid 既將視頻輸出定位到widget 窗體部件中。
    注意:-wid 參數(shù)只在 X11、directX 和 OpenGL 中適用。
 
三、制作界面和代碼的實(shí)現(xiàn)
     (代碼省略)
 
四、功能體驗(yàn)
    制作好界面和實(shí)現(xiàn)代碼后,來(lái)看下自制播放器的播放效果。