QT控制mplayer

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"通知其重新定位播放

时间: 2024-11-09 00:31:08

QT控制mplayer的相关文章

c++播放器-qt基于mplayer的多路视频播放器

问题描述 qt基于mplayer的多路视频播放器 主要功能是同步播放最多四路视频,也可以放大某一通道进行单路回放,如果单纯只为了播放就没有问题,但是在多路回放的时候我要实时显示播放进度以及进度条的跟进和进度条拉动进行视频的跳转不好实现,如果是单一通道播放就没问题,求大神指教,其他只要是基于c++的开发工具都可以,求条明路,如果可以的话,大神加我qq941290482或者留下您的QQ!

Qt 控制watchdog app hacking

/************************************************************************** * Qt 控制watchdog app hacking * 声明: * 本文主要是为了查看之前朋友留下的Qt控制watchdog软件运作机制. * * 2015-12-31 深圳 南山平山村 曾剑锋 *************************************************************************/

基于QT的mplayer播放器

一.项目概述 Mplayer.它支持大量的多媒体文件格式,像常见的音频文件如mp3/wav/mid,常见的视频文件如avi/vcd/dvd/rm等等,各种视频编/解码方式也是应有尽有. 我们项目的目标是在liunx下,用QT做一个MPlayer皮肤,能够实现播放器的常见 功能,如:播放.停止.快进.快退.上/下一曲等.并把程序移植到ARM平台上. 二.功能体验 本节主要目的是让大家在学习具体实现过程前,先体验下播放器的功能. 1.PC端功能体验 将"项目代码/工程代码"目录下的mpla

mplayer编程模式控制命令

slave模式协议------------------- 关于slave模式,MPlayer为后台运行其他程序.不再截获键盘事件,MPlayer会从标准输入读一个换行符(/n)分隔开的命令. 要动手尝试slave模式,运行   mplayer -slave -quiet <movie> 并在控制台窗口输入slave命令. 您也可以使用一个fifo文件(命名管道):   mkfifo /tmp/fifofile  mplayer -slave -input file=/tmp/fifofile

qt gstreamer怎么通过sink单元控制其音量大小

问题描述 qt gstreamer怎么通过sink单元控制其音量大小 gstreamer怎么通过sink单元控制其音量大小 在开发中我已经知道怎么用gstreamer创建管道进行媒体的播放,但没找到怎么控制该管道的音量大小的方法,在线求高手解答!!!

qt移植 环境搭建-arm上的qt鼠标与触摸屏共存情况下,使用触摸屏控制qt界面,指针会飘?

问题描述 arm上的qt鼠标与触摸屏共存情况下,使用触摸屏控制qt界面,指针会飘? 运行环境:2440+linux2.6.22.6+qt4.7.3 目前问题:qt已经移植到arm板子上面,这是关于qt界面指针的驱动设置:export QWS_MOUSE_PROTO=""Tslib:/dev/event1 mouseman:/dev/mice"",我希望既能够使用触摸屏来操作qt界面也能够使用鼠标来操作,通过以上设置,发现使用鼠标没问题,可以操作,但是触摸屏使用的时候

控制-QT如何实现链接交换机?

问题描述 QT如何实现链接交换机? 我想实现一个简单控制交换机的小窗口,主要是给交换机发命令,它能接收到并处理发回我处理信息,可是试过好多种方法都不可以,telnet和plink都试过了~各种错误. 要么在linux下可以,win下不可以! 求大神们指导一下~ QProcess也试过了,请问那位大神有过类似的demo,可以贴出来参考一下吗? 或者是给交换机发一大串字符串它能执行即可,不要界面.只要实现功能即可.在此先谢过了! 求大师讲解. 解决方案 UP求助!求大神帮忙给一个思路!

控制-main.cpp在QT中起到的作用是什么?

问题描述 main.cpp在QT中起到的作用是什么? 是可以控制项目中其他窗口程序的执行先后顺序么? 还有有办法让 QVector val(100000); int n; double y; while(n<100000) { y=val[n]; n++ } double型的参数能直接从Qvector里被赋值么?上面的赋值对不对? 解决方案 main() 函数是程序的入口点. 几乎总是这样,在使用Qt时,main() 函数仅仅被用来完成一些初始化工作在将控制权交给Qt前. 参数 argc 为命令

Qt之输出控制

简述 在Qt项目开发过程中,往往需要对程序的一些信息进行控制,比如:打印日志.调试信息等,便于我们后期查找.跟踪及定位问题. 下面,我们来分享下常用的几种方式.   简述 示例代码 应用程序输出 控制台输出 重定向至文件   示例代码 我们简单地写一些测试代码,用qDebug输出一些基本信息. #include <QApplication> #include <QWidget> #include <qDebug> int main(int argc, char *arg