http://blog.csdn.net/songjinshi/article/details/6521319
1.MPlayer 的特殊控制模式
MPlayer 本身是一個命令列的程式,但是他提供了有後台模式(Slave),可以把自己輸出重新導向到一個指定的X Windows視窗中,並且可以通過管道向其發送命令來控制,這樣就為GUI程式提供一個簡單的編程介面.讓其用圖形介面來控制.Gnome下的 gmplayer其實就是通過這個方法來在圖形介面調用MPlayer.
關於gtk下如何編程式控制制Mplayer可以參考
http://blog.csdn.net/zhangbinka/archive/2009/07/01/4313057.aspx
關於MPlayer在X86和ARM下如何安裝請參考,我的博文
http://blog.chinaunix.net/u3/105675/showart_2101453.html
http://blog.chinaunix.net/u3/105675/showart_2148571.html
本文的重點如何在QT來在GUI控制MPlayer
MPlayer 的特殊用法
1.1 通過管道播放視頻
•mkfifo /tmp/media // 建立管道檔案
•cat xxx.mpeg > /tmp/media & // 把媒體檔案資料寫入管道一端
•mplayer /tmp/media –cache 3000 // mplayer在緩充3M資料後開始播放
注意必須建立緩充,以支援讀取資料時的小範圍索引
本例裡沒有用這個功能,但是很多LINUX的網路播放器也是用這個方法來這現的.有興趣可以參考一下gtk-sopcast(http://code.google.com/p/gsopcast/ )這個開源項目,這個軟體相信很多人用它的WINDOWS版本看過球.
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文檔.
http://doc.qtfr.org/post/2007/03/21/Un-conteneur-pour-MPlayer-utilisation-de-QProcess
下載
http://doc.qtfr.org/public/2007/qt_mplayer.tar.gz
其原理是建立一個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"通知其重新置放播放
http://blog.csdn.net/songjinshi/article/details/6521319
1.MPlayer 的特殊控制模式
MPlayer 本身是一個命令列的程式,但是他提供了有後台模式(Slave),可以把自己輸出重新導向到一個指定的X Windows視窗中,並且可以通過管道向其發送命令來控制,這樣就為GUI程式提供一個簡單的編程介面.讓其用圖形介面來控制.Gnome下的 gmplayer其實就是通過這個方法來在圖形介面調用MPlayer.
關於gtk下如何編程式控制制Mplayer可以參考
http://blog.csdn.net/zhangbinka/archive/2009/07/01/4313057.aspx
關於MPlayer在X86和ARM下如何安裝請參考,我的博文
http://blog.chinaunix.net/u3/105675/showart_2101453.html
http://blog.chinaunix.net/u3/105675/showart_2148571.html
本文的重點如何在QT來在GUI控制MPlayer
MPlayer 的特殊用法
1.1 通過管道播放視頻
•mkfifo /tmp/media // 建立管道檔案
•cat xxx.mpeg > /tmp/media & // 把媒體檔案資料寫入管道一端
•mplayer /tmp/media –cache 3000 // mplayer在緩充3M資料後開始播放
注意必須建立緩充,以支援讀取資料時的小範圍索引
本例裡沒有用這個功能,但是很多LINUX的網路播放器也是用這個方法來這現的.有興趣可以參考一下gtk-sopcast(http://code.google.com/p/gsopcast/ )這個開源項目,這個軟體相信很多人用它的WINDOWS版本看過球.
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文檔.
http://doc.qtfr.org/post/2007/03/21/Un-conteneur-pour-MPlayer-utilisation-de-QProcess
下載
http://doc.qtfr.org/public/2007/qt_mplayer.tar.gz
其原理是建立一個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"通知其重新置放播放