天天看点

Mplayer 嵌入Qt 窗口 制作播放器(嵌入方法)

        众所周知 Mplayer 播放有 -wid + 窗口句柄 的指令,可以让Mplayer嵌入指定窗口播放。

因此只有利用该指令就可以让Mplayer在Qt指定的窗口或控件播放视频,

实现平台 Ubuntu 16.04

QWidget 实现方法:

QWidget可以很简单的获取控件的wid ,因此只需要直接执行命令就可以实现嵌入

void MainWindow::on_pushButton_clicked()
{
    qDebug() << "on touch..." ;
    play = new QProcess;
    QString order = QString("mplayer -quiet  -slave -x 600 -y 300 -wid %1 %2").arg(/*this->winId()*/ui->label->winId()).arg(ui->label_2->text());
    qDebug() << order ;
    play->start(order);
}
           

只需要小小的简单的办法就可以实现Mplayer播放器的嵌入了

效果

Mplayer 嵌入Qt 窗口 制作播放器(嵌入方法)

QML 实现方法:

QML 无法简单的获取窗口句柄,因此需要一些小小的办法,

WId *getQmlWid(QObject *QmlObj)
{
    WId *parent_HWND = new WId;
    QWindow *QmlWindow=qobject_cast<QWindow *>(QmlObj);//获取qml的窗口

    *parent_HWND = QmlWindow->winId();

    qDebug() << "id Get" <<QmlWindow->winId() ;

    return parent_HWND;
}
           

通过上述函数可以获取QML窗口的WID,接着只需要

void playerTest::mplayerPlay()
{
    play = new QProcess;
    QString order = QString("mplayer -quiet -slave -x 600 -y 300 -wid %1 test.mp4").arg(*this->parent_HWND);
    qDebug() << order ;
    play->start(order);
}
           

照样执行Mplayer播放指令就行了,但是QML 目前我还没能实现获取控件的操作句柄,因此,Mplayer 嵌入QML 是直接嵌入整个窗口,如果在该窗口上显示控件的话,会出现控件和视频画面抢刷新的情况,就是控件闪烁,这可能是和QML和Mplayer本身的原因,要解决的话也不是目前我这个级别的人干的,因此,偷偷鸡,直接弄个透明窗口盖在Mplayer窗口上面就完事了

Mplayer 嵌入Qt 窗口 制作播放器(嵌入方法)

这样也是没问题的,还能做成点击才显示操作按钮,炫酷程度还是可以的

 但是肯定有些人又需要Qwidget那样显示在划定的控件中而不是整个窗口,那样的话就得祭出我的最终方案了,有二,但是播放就懒得做了,就是:

QWidget窗口嵌入QML 窗口,这样就可以直接获取QWidget 窗口里面控件的操作句柄,方法如下

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

//======================实例化一个QML界面=============================//
    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/MainQml.qml")));
    if(engine.rootObjects().isEmpty())
        return -1;


    MainWindow w;//实例化一个QWidget界面
     w.winId();//获取winID ,不使用会失败
    w.setAttribute(Qt::WA_NativeWindow);//将其设置为子窗口
   //需要调用QWindow文件
    w.windowHandle()->setParent( qobject_cast<QWindow *>(engine.rootObjects().first())/*父窗口*/);//设置其父窗口

    //显示
   w.show();
   //设置位置
   w.move(20,30);

    //w.show();
    return a.exec();
}
           

QML MainQml.qml

​
import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.12
//import ABC 1.0
import QtQuick.Dialogs 1.1
import QtQuick 2.2
import QtQuick.Controls 1.2
import QtQuick.Layouts 1.1

import QtQuick.Window 2.2
import QtQuick.Controls 2.2


Window{
    id:qmlWindow
    title: "WINDOW"
    width: 1000
    height: 800
    visible: true
    Text {
        id: name
        text: qsTr("THIS IS QML")
    }

}

​
           
Mplayer 嵌入Qt 窗口 制作播放器(嵌入方法)

 Qwidget 我就直接这样了

实现效果如图

Mplayer 嵌入Qt 窗口 制作播放器(嵌入方法)

还有一种就是QML 嵌入QWidget

直接

Mplayer 嵌入Qt 窗口 制作播放器(嵌入方法)

 就完事了,然后设置需要读取的文件

这个好像是不能贴Window 控件的

继续阅读