基于QT前端的Mplayer播放器項目之功能體驗
一、項目概述
Mplayer,它支持大量的多媒體文件格式,像常見的音頻文件如mp3/wav/mid,常見的視頻文件如avi/vcd/dvd/rm等等,各種視頻編/解碼方式也是應(yīng)有盡有。
我們項目的目標(biāo)是在liunx下,用QT做一個MPlayer皮膚,能夠?qū)崿F(xiàn)播放器的常見功能,如:播放、停止、快進(jìn)、快退、上/下一曲等。并把程序移植到ARM平臺上。
二、功能體驗
本節(jié)主要目的是讓大家在學(xué)習(xí)具體實現(xiàn)過程前,先體驗下播放器的功能。
1、PC端功能體驗
將“項目代碼\工程代碼”目錄下的mplayer.tar.gz拷貝linux系統(tǒng)中(主機(jī)環(huán)境配置好以后,參照第四節(jié)的實現(xiàn)過程)。
- #tar xvfz mplayer.tar.gz
- #./mplayer
2、目標(biāo)平臺功能體驗
(1)將“項目代碼\工程鏡像”文件夾中的zImage、rootfs.cramfs燒寫到目標(biāo)板(或者采用nfs方式)。分區(qū)情況為:
- Boot: 0 - 40000 size=0x40000
- Kernel:40000 – 240000 size=0x200000
- Rootfs: 240000 -3740000 size=0x3500000
- setenv root=1f02 init=/linuxrc rootfstype=cramfs console=ttySAC0,115200 display=sam240
- setenv bootcmd setenv bootcmd nand read 30008000 40000 200000 \; go 30008000
(2)啟動系統(tǒng)后運(yùn)行:
- #. ./Qtopia.sh
- #cd mymplayer
- #./mymplayer -qws
三、實現(xiàn)原理
先來考慮考慮如何為mplayer編寫前端界面的問題。有兩種思路,一種是把mplayer解剖,直接修改他里面的代碼,這樣我們做得界面就能夠和mplayer一體了(當(dāng)然也能夠通過link mplayer用到的任何的庫和.o文檔,把他無縫的集成在程式里面);第二種方法就是mplayer所謂的slave模式。
- mplayer '/home/linux/1.mp3' -quiet -slave
現(xiàn)在來探討一下slave模式:所謂的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”,0777);
- 可以使用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,1000,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”);
#p#
1、暫停功能
通過如下代碼可以設(shè)置Mplayer暫停。
- process->write(“pause ”);
執(zhí)行這段代碼的時候如果是播放狀態(tài)就會暫停,暫停狀態(tài)時就會繼續(xù)播放。
2、獲取播放文件的總時間和當(dāng)前播放進(jìn)度
執(zhí)行下面代碼時,Mplayer將時間在標(biāo)準(zhǔn)輸出顯示。
- process->write("get_time_pos ");
- process->write("get_time_length ");
通過如下代碼即可讀出我們需要的信息:
- 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 ”);
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 ”); //音量減小
- Process->write(“volume +1 ”); //音量增加
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 "); //開啟靜音
- process->write("mute 1 "); //關(guān)閉靜音
6、定位視頻窗口
通過上面的代碼基本功能實現(xiàn)了,可是播放視頻的時候發(fā)現(xiàn)又彈出一個窗口。并沒有出現(xiàn)在我們的窗口里。
如下代碼即可時間窗口的定位。
- QString common = "mplayer -slave -quiet -ac mad -zoom movie/" + file_name + " -wid " + QString::number(widget->winId());
- process->start(common);
紅色部分實現(xiàn)窗口的定位。Widget是一個QWidget對象。通過winId可以獲得一個數(shù)字,-wid既將視頻輸出定位到widget窗體部件中。
注意:-wid參數(shù)只在X11、directX和OpenGL中適用。
本文章主要介紹了mplayer的基本概念,功能體驗,實現(xiàn)原理,那么下節(jié)將會深入講解實現(xiàn)原理。
【編輯推薦】