Qt播放视频

主要调用Qt的QMediaPlay来进行播放,首先步骤是打开对应的mp4视频文件,之后点击播放即可打开,主要代码如下:

#include "dialog.h"
#include "ui_dialog.h"
#include<QDebug>
#include <QMediaPlayer>
#include<QFileDialog>
#include<QVideoWidget>
#include<QVBoxLayout>
#include<QFile>
#include<QMessageBox>
#include<QMediaPlaylist>

QVBoxLayout* layout_video;//布局
QMediaPlayer* player;   //播放器
QVideoWidget* widget;   //视频播放控件
//播放状态,true为播放,false为暂停
bool play_state;
//是否重新载入视频
bool if_reload=false;
Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    ui->pushButton_play->setEnabled(false);
//    QString directory = QFileDialog::getOpenFileName(
//                    this,
//                    tr("选择文件"),
//                    "/",
//                    "(*.png);;All files(*.*)");
//        if (!directory.isEmpty())
//        {

//          qDebug() << directory;
//         }

//    QMediaPlayer qtaudioPlayer;
//    qtaudioPlayer.setMedia(QUrl::fromLocalFile(directory));
//    qtaudioPlayer.play();
//    QVideoWidget *m_videoW = new QVideoWidget(this);
//          //将QVideoWidget 对象添加到布局
//          m_layout->addWidget(m_videoW);
//          //设置页面布局
//          this->setLayout(m_layout);
//          //设置媒体文件输出
//          m_player->setVideoOutput(m_videoW);
//          //显示m_videoW
//          m_videoW->show();
//          //播放视频
//          m_player->play();
}

Dialog::~Dialog()
{
    delete ui;
}

void Dialog::on_pushButton_open_clicked()
{
     QString filename = QFileDialog::getOpenFileName(this,tr("选择视频文件"),".",tr("视频格式(*.avi *.mp4 *.flv *.mkv)"));
     QFile file(filename);
     qDebug()<<filename;
     if(!file.open(QIODevice::ReadOnly))
         {
             QMessageBox::information(NULL, "Title", "Content", QMessageBox::Ok, QMessageBox::Ok);
             printf("111111111111111111111\n");
             return;
         }
     if(if_reload)
     {//重新加载视频时,重置以下变量
         delete layout_video;
         delete player;
         delete widget;
         //delete timer;
     }
     if_reload = true;
     layout_video = new QVBoxLayout;
     player = new QMediaPlayer;
     widget = new QVideoWidget;
     layout_video->setMargin(1);

     //ui->label_mp4->setMargin(1);
     widget->resize(ui->label_mp4->size());
     layout_video->addWidget(widget);
     //layout()->addWidget(widget);
     ui->label_mp4->setLayout(layout_video);
     player->setVideoOutput(widget);

     player->setMedia(QUrl::fromLocalFile(filename));
     play_state=true;
     ui->pushButton_play->setEnabled(true);
     ui->pushButton_play->setText("暂停");
     player->play();

}



void Dialog::on_pushButton_play_clicked()
{
    if(play_state)
    {
        player->pause();
        ui->pushButton_play->setText("播放");
    }
    else
    {
        player->play();
        ui->pushButton_play->setText("暂停");
    }
    play_state=!play_state;
}
效果图如下:


主页上https://download.csdn.net/download/qq_42981739/11375793有整个工程的源码可以下载,如果有什么疑问,可以评论。

在OpenGL中播放视频通常需要借助于OpenGL外的一些库,因为OpenGL本身不提供处理媒体数据的功能。如果你想在使用OpenGL的QT应用程序中播放视频,可以通过以下步骤来实现: 1. 使用Qt的媒体框架:Qt提供了Qt Multimedia模块,其中包含用于播放视频的类,比如`QMediaPlayer`和`QVideoWidget`。你可以将这些类与`QOpenGLWidget`结合使用来在OpenGL上下文中播放视频。 2. 使用OpenGL渲染视频帧:`QMediaPlayer`可以播放视频,而`QVideoWidget`可以显示视频,但是`QVideoWidget`是基于QWidget的,如果想要在OpenGL上下文中显示视频,你可以通过读取`QMediaPlayer`中的每一帧数据,并使用OpenGL的纹理功能将其渲染到屏幕上。 3. 使用第三方库:例如使用FFmpeg库来解码视频流,然后使用OpenGL来渲染视频帧。你需要将FFmpeg解码后的帧数据上传到GPU,并通过OpenGL的纹理管理来显示它们。 以下是一个简化的流程示例: - 初始化Qt Multimedia模块,创建`QMediaPlayer`和`QVideoOutput`实例。 - 连接`QMediaPlayer`的`frameReady`信号到一个槽函数,该槽函数获取当前帧并准备渲染。 - 在槽函数中,使用OpenGL来创建纹理,并将视频帧数据上传到GPU。 - 使用OpenGL命令将纹理渲染到屏幕上,比如绘制一个四边形,并使用相应的纹理坐标。 示例代码片段如下(注意这只是一个非常简化的示例,实际应用中需要更多的错误处理和资源管理): ```cpp // 初始化QMediaPlayer和QVideoOutput QMediaPlayer *player = new QMediaPlayer(); QVideoWidget *videoWidget = new QVideoWidget(); player->setVideoOutput(videoWidget); // 连接信号和槽 QObject::connect(player, &QMediaPlayer::frameReady, this, [this](const QVideoFrame &frame) { // 将QVideoFrame转换为OpenGL可以使用的格式 // ... // 绑定纹理 glBindTexture(GL_TEXTURE_2D, textureId); // 上传帧数据到GPU // ... // 使用OpenGL渲染纹理到屏幕上 // ... }); // 播放视频 player->setMedia(QUrl::fromLocalFile("video.mp4")); player->play(); ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值