在Qt中调用libmpv实现视频播放需要以下步骤:
在Qt项目中引入libmpv库文件和头文件。
创建一个QWidget对象作为视频窗口。
初始化libmpv,设置视频输出。
加载视频文件或网络地址。
设置视频播放状态、音量等参数。
控制视频播放,比如暂停、快进等操作。
下面是一个简单的示例代码:
#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");