【全网独家】将 libVLC 视频渲染到 QWidget 中(代码+测试部署)

时间:2025-03-29 08:11:46
#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(); }