天天看點

QT控制mplayer

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 &gt; /tmp/media &amp;     // 把媒體檔案資料寫入管道一端

•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 &amp;

•使用/tmp/cmd做為指令管道

•echo "pause" &gt; /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 &amp; program, OpenMode mode = ReadWrite )

//執行帶參數

   void start ( const QString &amp; program, const QStringList &amp; arguments, OpenMode   mode = ReadWrite ) 

其中arguments就是參數清單。QStringList重定向了 &lt;&lt;,增加參數用這個重載的操作符。

QStringList arg ;

arg &lt;&lt; "-wid"&lt;&lt; "0x320001f" &lt;&lt;" -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"通知其重新定位播放

繼續閱讀