QT开发中文网

使用qt调用libmpv实现视频播放

在Qt中调用libmpv实现视频播放需要以下步骤:

  1. 在Qt项目中引入libmpv库文件和头文件。

  2. 创建一个QWidget对象作为视频窗口。

  3. 初始化libmpv,设置视频输出。

  4. 加载视频文件或网络地址。

  5. 设置视频播放状态、音量等参数。

  6. 控制视频播放,比如暂停、快进等操作。

下面是一个简单的示例代码:

#include <QObject>
#include <QWidget>
#include <QVBoxLayout>
#include <QTime>

#include <mpv/client.h>
#include <mpv/qthelper.hpp>

class VideoPlayer : public QWidget
{
    Q_OBJECT

public:
    VideoPlayer(QWidget *parent = nullptr);
    ~VideoPlayer();

private:
    mpv::qt::Handle mpv;
    QVBoxLayout *layout;
    QWidget *videoWidget;
    bool isPlaying;
    qint64 duration;

    void initMpv();
    void setVolume(int vol);

protected:
    void mouseDoubleClickEvent(QMouseEvent *event);

signals:
    void videoDuration(qint64);

public slots:
    void play(QString filePath);
    void pause();
    void stop();
    void seek(qint64 pos);
    void setSpeed(double speed);
    void setLoop(bool loop);
    void setFullScreen(bool fullScreen);
    void setAspectRatio(QString ratio);
};

VideoPlayer::VideoPlayer(QWidget *parent)
    : QWidget(parent)
{
    layout = new QVBoxLayout(this);
    layout->setMargin(0);

    videoWidget = new QWidget(this);
    layout->addWidget(videoWidget);

    isPlaying = false;

    initMpv();
}

VideoPlayer::~VideoPlayer()
{
    mpv.terminate_destroy();
}

void VideoPlayer::initMpv()
{
    // 创建mpv实例
    mpv = mpv::qt::Handle{ new mpv::qt::MPV{ this } };

    // 设置视频输出
    mpv.setOption("vo", "gpu");

    // 设置视频窗口
    mpv.setOption("wid", (void *)videoWidget->winId());

    // 监听视频播放事件
    mpv.observe_property("duration", mpv::qt::ObservePropertyCallback{
        [this](auto, QVariant value) {
            duration = value.toLongLong();
            emit videoDuration(duration);
        }
    });
}

void VideoPlayer::play(QString filePath)
{
    // 加载视频文件或网络地址
    mpv.command(QStringList() << "loadfile" << filePath);

    // 设置播放状态
    isPlaying = true;
    mpv.setPause(false);
}

void VideoPlayer::pause()
{
    // 暂停或恢复播放
    isPlaying = !isPlaying;
    mpv.setPause(!isPlaying);
}

void VideoPlayer::stop()
{
    // 停止播放
    isPlaying = false;
    mpv.command("stop");
}

void VideoPlayer::seek(qint64 pos)
{
    // 快进、快退
    mpv.command(QStringList() << "seek" << QString::number(pos / 1000.0));
}

void VideoPlayer::setSpeed(double speed)
{
    // 设置播放速度
    mpv.setOption("speed", speed);
}

void VideoPlayer::setLoop(bool loop)
{
    // 循环播放
    mpv.setOption("loop-file", loop ? "inf" : "no");
}

void VideoPlayer::setFullScreen(bool fullScreen)
{
    // 全屏播放
    setWindowState(fullScreen ? Qt::WindowFullScreen : windowState() & ~Qt::WindowFullScreen);
}

void VideoPlayer::setAspectRatio(QString ratio)
{
    // 设置视频比例
    mpv.setOption("video-aspect-override", ratio.toStdString());
}

void VideoPlayer::mouseDoubleClickEvent(QMouseEvent *event)
{
    // 双击全屏
    if (event->button() == Qt::LeftButton) {
        setFullScreen(!isFullScreen());
    }
}

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

    VideoPlayer player;
    player.show();

    return app.exec();
}

使用时,只需要创建一个VideoPlayer对象,调用相应的方法即可实现视频播放,例如:

VideoPlayer player;
player.play("/path/to/video.mp4");
player.pause();
player.seek(5000);
player.setSpeed(1.5);
player.setLoop(true);
player.setFullScreen(true);
player.setAspectRatio("16:9");

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://qt.0voice.com/?id=599

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?