天天看點

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 控件的

繼續閱讀