zoukankan      html  css  js  c++  java
  • QT控制mplayer .

    转载来自: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 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"通知其重新定位播放

  • 相关阅读:
    【STSRM12】整除
    【STSRM12】夏令营
    【BZOJ】1954: Pku3764 The xor-longest Path
    Faster-rcnn实现目标检测
    反向传播算法的理解
    人工智能发展的看法
    FCN的理解
    卷积神经网络的部分知识理解
    不常见算法的介绍
    如何对模型进行优化
  • 原文地址:https://www.cnblogs.com/start530/p/3834405.html
Copyright © 2011-2022 走看看