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

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

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

來源:求學(xué)問校網(wǎng)     發(fā)表時間:2011-08-31     瀏覽 693

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

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