【全网独家】将 libVLC 视频渲染到 QWidget 中(代码+测试部署)
#include <QApplication>
#include <QWidget>
#include <QVBoxLayout>
#include <QPushButton>
#include <QSlider>
#include <QTimer>
#include <vlc/>
class VideoPlayer : public QWidget {
Q_OBJECT
public:
VideoPlayer(QWidget *parent = nullptr) : QWidget(parent) {
QVBoxLayout *layout = new QVBoxLayout(this);
playButton = new QPushButton("Play", this);
pauseButton = new QPushButton("Pause", this);
slider = new QSlider(Qt::Horizontal, this);
layout->addWidget(playButton);
layout->addWidget(pauseButton);
layout->addWidget(slider);
connect(playButton, &QPushButton::clicked, this, &VideoPlayer::playVideo);
connect(pauseButton, &QPushButton::clicked, this, &VideoPlayer::pauseVideo);
timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, &VideoPlayer::updateSlider);
}
private slots:
void playVideo() {
char const *args[] = {"--no-xlib"};
inst = libvlc_new(sizeof(args) / sizeof(args[0]), args);
mp = libvlc_media_player_new(inst);
WId winId = winId();
libvlc_media_player_set_xwindow(mp, winId);
libvlc_media_t *media = libvlc_media_new_path(inst, "example.mp4");
libvlc_media_player_set_media(mp, media);
libvlc_media_release(media);
libvlc_media_player_play(mp);
timer->start(1000);
}
void pauseVideo() {
if (libvlc_media_player_is_playing(mp)) {
libvlc_media_player_pause(mp);
} else {
libvlc_media_player_play(mp);
}
}
void updateSlider() {
float pos = libvlc_media_player_get_position(mp);
slider->setValue(static_cast<int>(pos * 100));
}
private:
QPushButton *playButton;
QPushButton *pauseButton;
QSlider *slider;
QTimer *timer;
libvlc_instance_t *inst;
libvlc_media_player_t *mp;
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
VideoPlayer player;
player.resize(800, 600);
player.show();
return app.exec();
}