如果是想在QT之外打开一个mplayer窗口就很容易:
const QString mplayerPath("D:/tools/mplayer/mplayer.exe");
QStringList args;
args<<"2.avi";
QProcess* myProcess=new QProcess;
myProcess->start(mplayerPath,args);
如果是想在QT的窗口里用mplayer,就像smplayer那像,这可不是件容易的事。
在网上只找到一上法文的例子:http://doc.qtfr.org/post/2007/03/21/Un-conteneur-pour-MPlayer-utilisation-de-QProcess 用QProcess实现的。可用google英文翻译后阅读。
代码在:http://doc.qtfr.org/public/2007/qt_mplayer.tar.gz
我在windows下实验成功。
也可以研究一下smplayer的源码。大体思想是(别人总结的,跟上面的例子一样):
发现mplayer的参数-wid可以把输出流重定向的指定的窗体,通过winId()得到窗体的id即可,但是我不知道视频流或者说外部显示的数据是怎么在Qwidget上呈现的。
这是那个法国人的例子程序,我加了些comment,注意要把2.avi放到release文件夹下,执行可执行程序,而不是编译后点运行:
#include <QApplication>
#include <QProcess>
#include <QVBoxLayout>
#include <QLayoutItem>
#include <QWidget>
#include <QPaintEvent>
#include <QPainter>
#include <QColor>
#include <QRect>
#include <QLinearGradient>
#include <QSizePolicy>
#include <QPushButton>
#include <QTextEdit>
#include <QSlider>
#include <QCloseEvent>
#include <QTimer>
#ifdef Q_OS_WIN32
const QString mplayerPath("D:/tools/mplayer/mplayer.exe");
#else
const QString mplayerPath("/usr/bin/mplayer");
#endif
const QString movieFile("2.avi");
class PlayerWidget: public QWidget
...{
Q_OBJECT
private:
QPushButton *controller;
QWidget *renderTarget;
QProcess *mplayerProcess; //main thing
bool isPlaying;
QSlider *timeLine;
QTimer *poller;
QTextEdit *log;
public:
PlayerWidget(QWidget *parent =0)
:QWidget(parent), isPlaying(false)
...{
controller = new QPushButton("Play");
renderTarget = new QWidget(this);
renderTarget->setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred));
renderTarget->setAttribute(Qt::WA_OpaquePaintEvent );
renderTarget->setMinimumSize(500, 500);
timeLine = new QSlider(Qt::Horizontal);
log = new QTextEdit;
log->setReadOnly(true);