• 10279阅读
  • 6回复

[讨论]在Qml中嵌入mplayer进行视频播放 [复制链接]

上一主题 下一主题
离线zamxqun
 

只看楼主 倒序阅读 楼主  发表于: 2014-04-24


我实现了Qquick1.1下在qml中嵌入mplayer进行播放的功能, 代码公开如下.   希望有大家能共同出力,在Qquick2.0环境下也能实现类似的功能.
#include "qtquick1applicationviewer.h"
#include <QApplication>
#include <QScopedPointer>
#include <QDeclarativeView>
#include <QDeclarativeContext>
#include "applicationdata.h"
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
        QDeclarativeView viewer;
        qDebug() << &viewer;
        ApplicationData *data = new ApplicationData();
        data->setView(&viewer);
        viewer.rootContext()->setContextProperty("applicationData", data);
        viewer.rootContext()->setContextProperty("view", &viewer);
        viewer.setSource(QUrl("qrc:///mymain.qml"));
        viewer.show();
    return app.exec();
}

#ifndef APPLICATIONDATA_H
#define APPLICATIONDATA_H
#include <QObject>
#include <QGraphicsView>
#include <QLabel>
#include <QDebug>
#include <QProcess>
#include <QTimer>
#include <QDateTime>
#include <QCoreApplication>
class ApplicationData : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QGraphicsView* view WRITE setView)
public:
    Q_INVOKABLE QDateTime getCurrentDateTime() const {
         return QDateTime::currentDateTime();
    }
    Q_INVOKABLE void play() {
        play(m_view);
    }
    Q_INVOKABLE void play(QGraphicsView *view) {
        qDebug() << view;
        QString file("c:/laoshujianu.rmvb");
        m_view = view;
        if (video)
            delete video;
        video = new QWidget(m_view);
        new QLabel(getCurrentDateTime().toString(), video);
        video->setGeometry(0,0,300,300);
        video->raise();
        video->show();
        video->setWindowOpacity(0.4);

        if (process) {
            process->write("q\n");
            process->waitForFinished();
            delete process;
        }
        QStringList args;
        args.append("-slave");
        args.append("-vo");
        args.append("direct3d");
        args << "-wid" << QString::number((ulong) video->winId());
        args << "-colorkey" << "0x020202";
        args << file;
        process = new QProcess(this);
        qDebug()<<args;
        process->start("mplayer.exe", args);
    }
    ApplicationData(QObject *parent = 0) : QObject(parent), video(0), process(0) {
        QTimer::singleShot(1000, this, SIGNAL(dataChanged()));
    }
    void setView(QGraphicsView *view) {
        m_view = view;
    }
Q_SIGNALS:
    void dataChanged();
public:
    QWidget *video;
    QProcess *process;
private:
    QGraphicsView *m_view;
};
#endif // APPLICATIONDATA_H

import QtQuick 1.1
Rectangle {
    width: 360
    height: 360
    z: 1
    color: "red"
    Text {
        id: xx
        text: applicationData.getCurrentDateTime()
        anchors.centerIn: parent
        Connections {
            target: applicationData
            onDataChanged: console.log("The application data changed!")
        }
    }
    MouseArea {
        anchors.fill: parent
        onClicked: {
            xx.text = applicationData.getCurrentDateTime()
            applicationData.play(view)
        }
    }
}
离线彩阳

只看该作者 1楼 发表于: 2014-04-27
我看看哈。
能不能将mplayer的源代码也利用起来编成一个可行的项目?
单纯地调用mplayer.exe,的确显得简单了一些。
看看Qt的例子:QML video example,用到了multimedia库,没有额外的依赖,很强大。
上海Qt开发联盟,热忱地欢迎你的加入!
离线zamxqun

只看该作者 2楼 发表于: 2014-04-30
回 彩阳 的帖子
彩阳:我看看哈。
能不能将mplayer的源代码也利用起来编成一个可行的项目?
单纯地调用mplayer.exe,的确显得简单了一些。
看看Qt的例子:QML video example,用到了multimedia库,没有额外的依赖,很强大。 (2014-04-27 21:25) 

QML video example的例子支持的格式实在是太少了。mplayer几乎支持所有的视频格式,而且支持视频流。所以才会想到把qml和mplayer结合起来。这个做成的话,是一件大大的好事啊。
离线彩阳

只看该作者 3楼 发表于: 2014-05-01
回 zamxqun 的帖子
zamxqun:QML video example的例子支持的格式实在是太少了。mplayer几乎支持所有的视频格式,而且支持视频流。所以才会想到把qml和mplayer结合起来。这个做成的话,是一件大大的好事啊。 (2014-04-30 12:16) 

使用QProcess调用mplayer.exe,不跨平台。可以看看别人整合Qt和FFMPEG的成果。
上海Qt开发联盟,热忱地欢迎你的加入!
离线zamxqun

只看该作者 4楼 发表于: 2014-05-04
回 彩阳 的帖子
彩阳:使用QProcess调用mplayer.exe,不跨平台。可以看看别人整合Qt和FFMPEG的成果。 (2014-05-01 11:29) 

其实mplayer也是可以跨平台的。有FFMPEG整合到qml中的例子吗?哪里有呢
离线l20074765

只看该作者 5楼 发表于: 2015-02-25
我试了下你的demo mplayer能运行 但是不能再qml 中显示。。。
离线qyvlik

只看该作者 6楼 发表于: 2015-08-17
做过,将ffmpeg的源码通过c++集成到Qt中,然后注册到qml系统中,进行播放。
使用ffmpeg进行解码,QPaintItem进行视频画面的绘制。
ubiboot
快速回复
限100 字节
 
上一个 下一个