1.MPlayer 的特殊控制模式
MPlayer 本身是一個指令行的程式,但是他提供了有背景模式(Slave),可以把自己輸出重定向到一個指定的X Windows視窗中,并且可以通過管道向其發送指令來控制,這樣就為GUI程式提供一個簡單的程式設計接口.讓其用圖形界面來控制.Gnome下的 gmplayer其實就是通過這個方法來在圖形界面調用MPlayer.
關于gtk下如何程式設計控制Mplayer可以參考
<a href="http://blog.csdn.net/zhangbinka/archive/2009/07/01/4313057.aspx" target="_blank">http://blog.csdn.net/zhangbinka/archive/2009/07/01/4313057.aspx</a>
關于MPlayer在X86和ARM下如何安裝請參考,我的博文
<a href="http://blog.chinaunix.net/u3/105675/showart_2101453.html" target="_blank">http://blog.chinaunix.net/u3/105675/showart_2101453.html</a>
<a href="http://blog.chinaunix.net/u3/105675/showart_2148571.html" target="_blank">http://blog.chinaunix.net/u3/105675/showart_2148571.html</a>
本文的重點如何在QT來在GUI控制MPlayer
MPlayer 的特殊用法
1.1 通過管道播放視訊
•mkfifo /tmp/media // 建立管道檔案
•cat xxx.mpeg > /tmp/media & // 把媒體檔案資料寫入管道一端
•mplayer /tmp/media –cache 3000 // mplayer在緩充3M資料後開始播放
注意必須建立緩充,以支援讀取資料時的小範圍索引
1.2 slave模式.
slave 播放模式,可以MPlayer在背景執行,并可以通專用的指令管道發送指令來控制MPlayer.
•mkfifo /tmp/cmd
•mplayer -slave -quiet -input file=/tmp/cmd xxx.mpeg &
•使用/tmp/cmd做為指令管道
•echo "pause" > /tmp/cmd
•暫停播放
常用的控制指令可以用如下指令來檢視
mplayer –input cmdlist
程式設計常用到幾個指令
•seek Float [Integer] 跳到指定時間播放
•speed_incr Float 快進
•speed_set Float 設定指定時間
•quit [Integer] 退出
•pause 暫停,再一次表示重新播放
•get_percent_pos 取得百分比表示的進度
•get_time_pos 取得時間進度
1.3 在指定的視窗播放Mplayer
MPlayer是預設全屏播放,但在GUI中一般都是指定區域或者控制來播放.這樣顯得美觀,MPlayer支援在指定的X視窗播放的功能.用-wid參數告訴視窗ID即可.
mplayer test.mpg -wid 0x00029 #0x0029是X ID
在對于正在運作圖形界面視窗,可以用Linux 指令xwininfo來取到其ID,方法是運作這個程式後.螢幕滑鼠變成+,将其拖到指定視窗即可看到其結果。
xwininfo 是X-Windows工具,用來檢視已經打開視窗的X-Windows資訊。
這是在我機器上運作結果
[root@sowhy hxy]# xwininfo
xwininfo: Please select the window about which you
would like information by clicking the
mouse in that window.
xwininfo: Window id: 0x320001f
Absolute upper-left X: 177
Absolute upper-left Y: 49
Relative upper-left X: 5
Relative upper-left Y: 24
Width: 784
Height: 469
Depth: 24
Visual Class: TrueColor
Border width: 0
Class: InputOutput
Colormap: 0x20 (installed)
Bit Gravity State: NorthWestGravity
Window Gravity State: NorthWestGravity
Backing Store State: NotUseful
Save Under State: no
Map State: IsViewable
Override Redirect State: no
Corners: +177+49 --161+49 --161-82 +177-82
-geometry 59x17+172+25
QT的控件都是從QWidget繼承下來,是以它本身也有wid,這樣隻要用 QWidget::winID() 取出WID,即可實作在指定視窗播放視訊的功能。
2.QT控制MPlayer分析
網上一個直接用 QT3的例子控制MPlayer文檔.
<a href="http://doc.qtfr.org/post/2007/03/21/Un-conteneur-pour-MPlayer-utilisation-de-QProcess" target="_blank">http://doc.qtfr.org/post/2007/03/21/Un-conteneur-pour-MPlayer-utilisation-de-QProcess</a>
下載下傳
<a href="http://doc.qtfr.org/public/2007/qt_mplayer.tar.gz" target="_blank">http://doc.qtfr.org/public/2007/qt_mplayer.tar.gz</a>
其原理是建立一個Qt GUI程式。然後用一個frame 控件來播放視屏,用一個進度條顯示播放的進度,用按鍵顯播放,暫停。
然後用一個QProcess在背景執行MPlayer,并把Framer的WID傳給它。 然後把MPlayer的輸入輸出重定向,把原本從标準輸入接收指令變成從GUI的接收指令。
2.1 QProcess 簡要說明
LINUX C用system 執行外部程式
QT是用QProcess(程序類)來執行。建立一個程序後。用start方法來執行.
//執行不帶參數的外部指令。
void start ( const QString & program, OpenMode mode = ReadWrite )
//執行帶參數
void start ( const QString & program, const QStringList & arguments, OpenMode mode = ReadWrite )
其中arguments就是參數清單。QStringList重定向了 <<,增加參數用這個重載的操作符。
QStringList arg ;
arg << "-wid"<< "0x320001f" <<" -queit" ;
QProcess 用write來實作向标準輸入發送資訊
readLine/read來讀取資訊用于分析。
IO重定向使用signal readyReadStandardOutput。
connect(mplayerProcess, SIGNAL(readyReadStandardOutput()),
this, SLOT(catchOutput()));
3.QT4下的實作
0.1 第一個版本。設計基本雙視窗架構,能播放視訊
0.1.1 參考gmplayer,采用播放視窗與工具欄視窗雙視窗機制
0.1.2 播放Mplayer ,使QProcess 執行mplayer,并用-wid參數将其播放到指定視窗
0.1.3 用QFileDialog 來選擇打開檔案
0.2 增加暫停,全屏切換功能
0.2.1 用QProcess::write()發送 "pause/n"給mplayer實作暫停功能
0.2.2 用一個QCheckbox決定是否全屏播放
0.3 增加視訊視窗自動調整大小,時間進度生效
0.3.1 用QProcess::write()發送 "get_video_resolution/n",取視訊大小
0.3.2 用QProcess::write()發送 "get_time_length/n",取視訊時間長度.
0.3.3 捕獲 QProcess::readyReadStandardOutput()信号,把MPlayer标準輸出重定向到catchOutput()分析并更新到界面上。
0.3.4 進度條的更新,采用一個定時器,定時發送"get_time_pos/n",取得結果後更新到進度條
0.3.5 拖動進度條,觸發sliderMoved信号,将反過來向Mplayer發送 "seek/n"通知其重新定位播放