Qt使用vlc多窗口播放同一个视频

效果图:

核心代码:

VlcMutPlayer.h
#ifndef VLCMUTPLAYER_H
#define VLCMUTPLAYER_H
#include"vlc/vlc.h"
#include <QObject>
#include<QImage>

class VlcMutPlayer : public QObject
{
    Q_OBJECT
public:
    explicit VlcMutPlayer(QObject *parent = 0);
    void play(QString filename);
    ~VlcMutPlayer();
signals:
    void showImage(QImage img);
public slots:
private:
    libvlc_instance_t *vlcInstance;
    libvlc_media_player_t *mediaPlayer;
    libvlc_media_t *media;
};

#endif // VLCMUTPLAYER_H

实现 VlcMutPlayer.cpp:

#include "VlcMutPlayer.h"
#include<QFile>
#include<QMutex>
#include<QDebug>

// 定义输出视频的分辨率
#define VIDEO_WIDTH   800
#define VIDEO_HEIGHT  600

QMutex g_mutex;
bool   g_isInit = false;

char in_buffer[VIDEO_WIDTH*VIDEO_HEIGHT*4];
char out_buffer[VIDEO_WIDTH*VIDEO_HEIGHT*4];
VlcMutPlayer* _objInstance = NULL;
static void *lock(void *data, void **p_pixels)
{
    Q_UNUSED(data)
    g_mutex.lock();
    *p_pixels = out_buffer;  /*tell VLC to put decoded data to this buffer*/
    return 0; /* picture identifier, not needed here */
}

static void unlock(void *data, void *id, void *const *p_pixels)
{
    Q_UNUSED(data)
    Q_UNUSED(id)
    Q_UNUSED(p_pixels)
    QImage image((unsigned char*)out_buffer,VIDEO_WIDTH,VIDEO_HEIGHT,QImage::Format_RGB32);
    emit _objInstance->showImage(image);

    g_mutex.unlock();
}


static void display(void *data, void *id)
{
    /* do not display the video */
    (void) data;
    Q_UNUSED(id)
}


VlcMutPlayer::VlcMutPlayer(QObject *parent) : QObject(parent)
{
    _objInstance = this;
    // 创建并初始化 libvlc 实例
    vlcInstance = libvlc_new(0, NULL);
}

void VlcMutPlayer::play(QString filename)
{
    if (!QFile::exists(filename)) {
        qDebug()<<"file is not exist:"<<filename;
        return  ;
    }
    media = libvlc_media_new_path(vlcInstance, filename.toStdString().data());
    mediaPlayer = libvlc_media_player_new_from_media(media);
    libvlc_media_release(media);
    libvlc_video_set_callbacks(mediaPlayer, lock, unlock, display, 0);
    libvlc_video_set_format(mediaPlayer, "RV32", VIDEO_WIDTH, VIDEO_HEIGHT, VIDEO_WIDTH *4);
    libvlc_media_player_play(mediaPlayer);
}

VlcMutPlayer::~VlcMutPlayer()
{
    if (mediaPlayer)
    {
        libvlc_media_player_stop(mediaPlayer);    /*stop playing*/
        libvlc_media_player_release(mediaPlayer); /*Free the media_player*/
        mediaPlayer = NULL;
    }
}

完成工程代码:https://download.csdn.net/download/xzpblog/10612631

扩展阅读:Qt封装VLC接口播放视频

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
实现一个基于 QtVLC视频播放器,可以通过以下步骤实现: 1. 在 Qt 中创建一个新的项目,选择 Qt Widgets Application。 2. 在项目中添加 VLC 的头文件和库文件路径。在 .pro 文件中添加以下代码: ``` INCLUDEPATH += /path/to/vlc/include LIBS += -L/path/to/vlc/lib -lvlc ``` 3. 在 Qt Designer 中创建一个主窗口,添加一个 QMediaPlayer 控件和两个 QPushButton 控件。一个用于上一曲,一个用于下一曲。 4. 在主窗口的构造函数中创建一个 QMediaPlayer 对象,并且将其设置到 QVideoWidget 控件中: ``` QMediaPlayer *player = new QMediaPlayer(this); QVideoWidget *videoWidget = new QVideoWidget(this); player->setVideoOutput(videoWidget); ``` 5. 在 QPushButton 的 clicked 信号中,调用 QMediaPlayer 的相应接口进行上一曲和下一曲操作: ``` connect(prevButton, &QPushButton::clicked, [=]() { playlist->previous(); }); connect(nextButton, &QPushButton::clicked, [=]() { playlist->next(); }); ``` 6. 创建一个 QMediaPlaylist 对象,用于管理视频文件列表,并将列表设置到 QMediaPlayer 中: ``` QMediaPlaylist *playlist = new QMediaPlaylist(this); playlist->addMedia(QUrl::fromLocalFile("/path/to/video1.mp4")); playlist->addMedia(QUrl::fromLocalFile("/path/to/video2.mp4")); playlist->addMedia(QUrl::fromLocalFile("/path/to/video3.mp4")); player->setPlaylist(playlist); ``` 7. 最后,播放视频: ``` player->play(); ``` 这样,一个基于 QtVLC视频播放器就完成了,并且可以实现上一曲和下一曲功能。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值