目录

一:结果

二:代码

videodecode.h .cpp

videoplaywin.h .cpp

indexwin.h .cpp

一:结果

二:代码

videodecode.h .cpp

本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg webRTC rtmp hls rtsp ffplay srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

#ifndef VIDEODECODE_H
#define VIDEODECODE_H#include <QObject>
#include<QThread>//使用线程
#include<QImage>//当前C++兼容C语言
extern "C"
{
//avcodec:编解码(最重要的库)
#include <libavcodec/avcodec.h>
//avformat:封装格式处理
#include <libavformat/avformat.h>
//swscale:视频像素数据格式转换
#include <libswscale/swscale.h>
//avdevice:各种设备的输入输出
#include <libavdevice/avdevice.h>
//avutil:工具库(大部分库都需要这个库的支持)
#include <libavutil/avutil.h>
}class videoDecodeThread : public QThread//利用线程基类
{Q_OBJECT
public://    explicit videoDecodeThread(QObject *parent = 0);videoDecodeThread(QString videoname);QString videoname;//视频文件上下文格式AVFormatContext* avformat_context;//编解码器上下文格式AVCodecContext* avcodec_context;//解码器上下文格式AVCodec* avcodec;AVPacket* av_packet;//流的标志位int av_stream_index;//线程函数的引入void run();virtual ~videoDecodeThread();//定义停止的标志位bool m_stop;void videoStop();AVFrame *pFramein;AVFrame *pFrameRGB;uint8_t * pOutbuffer;signals://发送信号数据void SendOneData(int num);void sigGetOneFrame(QImage image);public slots:};#endif // VIDEODECODE_H
#include "videodecode.h"
#include<QDebug>
#include<QCoreApplication>
#include<QThread>
#include<QImage>//解码初始化操作
//1.注册所有组件
//2.打开视频输入文件
//3.查找视频流信息
//4.查找解码器
//5.打开解码器//videoDecode::videoDecode(QObject *parent) : QObject(parent)
//{
//}videoDecodeThread::videoDecodeThread(QString videoname)
{//初始线程未启动this->m_stop = false;qDebug()<<"1.注册所有组件";av_register_all();qDebug()<<"2.打开视频输入文件";QString filename = QCoreApplication::applicationDirPath();qDebug()<<"获取程序运行目录 "<<filename;QString cinputFilePath = "test.avi";  //本地视频文件放入程序运行目录avformat_context = avformat_alloc_context();//参数一:封装格式上下文->AVFormatContext->包含了视频信息(视频格式、大小等等...)//参数二:打开文件(入口文件)->urlqDebug()<<"打开"<<videoname<<"视频文件进行播放";int avformat_open_result = avformat_open_input(&avformat_context,videoname.toStdString().c_str(),NULL,NULL);if (avformat_open_result != 0){//获取异常信息char* error_info = new char[32];av_strerror(avformat_open_result, error_info, 1024);qDebug()<<QString("异常信息 %1").arg(error_info);};qDebug()<<"3.查找视频流信息";//参数一:封装格式上下文->AVFormatContext//参数二:配置//返回值:0>=返回OK,否则失败int avformat_find_stream_info_result = avformat_find_stream_info(avformat_context, NULL);if (avformat_find_stream_info_result < 0){//获取失败char* error_info = new char[32];av_strerror(avformat_find_stream_info_result, error_info, 1024);qDebug()<<QString("异常信息 %1").arg(error_info);}qDebug()<<"4.查找解码器";//第一点:获取当前解码器是属于什么类型解码器->找到了视频流//音频解码器、视频解码器、字幕解码器等等...//获取视频解码器流引用av_stream_index = -1;for (int i = 0; i < avformat_context->nb_streams; ++i) {//循环遍历每一流//视频流、音频流、字幕流等等...if (avformat_context->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO){//找到了av_stream_index = i;break;}}if (av_stream_index == -1){qDebug()<<QString("没有找到视频流");}//第二点:根据视频流->查找到视频解码器上下文->视频压缩数据//编解码器上下文avcodec_context = avformat_context->streams[av_stream_index]->codec;//第三点:根据解码器上下文->获取解码器IDavcodec = avcodec_find_decoder(avcodec_context->codec_id);if (avcodec == NULL){qDebug()<<QString("没有找到视频解码器");}qDebug()<<"5.打开解码器";int avcodec_open2_result = avcodec_open2(avcodec_context,avcodec,NULL);if (avcodec_open2_result != 0){char* error_info = new char[32];av_strerror(avformat_find_stream_info_result, error_info, 1024);qDebug()<<QString("异常信息 %1").arg(error_info);}qDebug()<<"视频详细信息输出";//此函数自动打印输入或输出的详细信息av_dump_format(avformat_context, 0, cinputFilePath.toStdString().c_str(), 0);qDebug()<<"----------------解码准备工作完成-----------------";}void videoDecodeThread::run()
{qDebug()<<"----------------开始循环解码操作-----------------";qDebug()<<"6.循环解码";//读取帧数据换成到哪里->缓存到packet里面av_packet = (AVPacket*)av_malloc(sizeof(AVPacket));//输入->环境一帧数据->缓冲区->类似于一张图pFramein = av_frame_alloc();//输出->帧数据->数据格式->RGBpFrameRGB = av_frame_alloc();//只有指定了AVFrame的像素格式、画面大小才能真正分配内存//缓冲区分配内存pOutbuffer = (uint8_t *)av_malloc(avpicture_get_size(AV_PIX_FMT_RGB32, avcodec_context->width, avcodec_context->height));//初始化缓冲区 类似于memsetavpicture_fill((AVPicture *)pFrameRGB, pOutbuffer,AV_PIX_FMT_RGB32, avcodec_context->width, avcodec_context->height);//解码的状态类型(0:表示解码完毕,非0:表示正在解码)//    int current_frame_index = 0;//用于转码(缩放)的参数,转之前的宽高,转之后的宽高,格式等//准备一个视频像素数据格式上下文//参数一:输入帧数据宽//参数二:输入帧数据高//参数三:输入帧数据格式//参数四:输出帧数据宽//参数五:输出帧数据高//参数六:输出帧数据格式->AV_PIX_FMT_RGB32//参数七:视频像素数据格式转换算法类型//参数八:字节对齐类型(C/C++里面)->提高读取效率SwsContext* pSwsContext = sws_getContext(avcodec_context->width,avcodec_context->height,avcodec_context->pix_fmt,avcodec_context->width,avcodec_context->height,AV_PIX_FMT_RGB32,SWS_BICUBIC,NULL,NULL,NULL);int ret;//解码的状态类型(0:表示解码完毕,非0:表示正在解码)int current_frame_index = 0;while (m_stop == false){//>=0:说明有数据,继续读取   <0:说明读取完毕,结束//从视频文件上下文中读取包--- 有数据就一直读取if (av_read_frame(avformat_context,av_packet) >= 0){//解码什么类型流(视频流、音频流、字幕流等等...)if (av_packet->stream_index == av_stream_index){//解码一帧视频数据avcodec_send_packet(avcodec_context, av_packet);//接收一帧数据->解码一帧ret = avcodec_receive_frame(avcodec_context,pFramein);if (ret == 0){//图片的转换  输入 输出sws_scale(pSwsContext, (const unsigned char* const*)pFramein->data, pFramein->linesize, 0, avcodec_context->height,pFrameRGB->data,  pFrameRGB->linesize);QImage  *tmpImg  = new QImage((uchar *)pOutbuffer, avcodec_context->width,avcodec_context->height,QImage::Format_RGB32);QImage image=tmpImg->copy();qDebug()<<"接收图片信号"<<image;emit sigGetOneFrame(image);//                    qDebug()<<tmpImg;//遍历每一帧的信息进行打印current_frame_index++;//发送信号emit SendOneData(current_frame_index);//延时操作  1秒显示25帧--1000/25=40QThread::msleep(40);//获取的视频信息qDebug()<<QString("当前遍历第 %1 帧").arg(current_frame_index);}}}av_free_packet(av_packet);}//    qDebug()<<"7.关闭所有解码组件";//    av_packet_free(&av_packet);//    //关闭流//    avcodec_close(avcodec_context);//    avformat_free_context(avformat_context);
}videoDecodeThread::~videoDecodeThread()
{qDebug()<<"7.关闭所有解码组件";av_packet_free(&av_packet);//关闭流avcodec_close(avcodec_context);avformat_free_context(avformat_context);}void videoDecodeThread::videoStop()
{m_stop = true;
}

videoplaywin.h .cpp

#ifndef VIDEOPLAYWIN_H
#define VIDEOPLAYWIN_H#include <QWidget>
#include<QVBoxLayout>
#include<QPushButton>
#include<QLabel>
#include"videodecode.h"
#include<QPainter>class VideoPlayWin : public QWidget
{Q_OBJECT
public:explicit VideoPlayWin(QString videoname,QWidget *parent = 0);QPushButton *playBtn;QLabel *showLab;videoDecodeThread *playThread;//重绘事件void paintEvent(QPaintEvent *event);int temp;QImage tempimage;signals:public slots:void videoPlaySlot();void ReceOneData(int num);void ReceOneImage(QImage img);
};#endif // VIDEOPLAYWIN_H
#include "videoplaywin.h"
#include<QDebug>VideoPlayWin::VideoPlayWin(QString videoname, QWidget *parent) : QWidget(parent)
{this->setWindowTitle(videoname);this->setGeometry(200,200,800,500);QVBoxLayout *layout = new QVBoxLayout(this);showLab = new QLabel();playBtn = new QPushButton();layout->addWidget(showLab);layout->addWidget(playBtn);playBtn->setText("暂停");QString cinputFilePath = videoname+".avi";playThread = new videoDecodeThread(cinputFilePath);//类之间的数据传递 -- 信号槽机制connect(playThread,SIGNAL(SendOneData(int)),this,SLOT(ReceOneData(int)));connect(playThread,SIGNAL(sigGetOneFrame(QImage)),this,SLOT(ReceOneImage(QImage)));connect(playBtn,SIGNAL(clicked(bool)),this,SLOT(videoPlaySlot()));}void VideoPlayWin::paintEvent(QPaintEvent *event)
{//    showLab->setText(QString("接收%1帧数据").arg(temp));QPainter painter(this);if(tempimage.isNull()){return ;}if(tempimage.size().width()<=0) return;QImage img=tempimage.scaled(showLab->size(),Qt::KeepAspectRatio);
//    painter.drawImage(0,20,img);showLab->setPixmap(QPixmap::fromImage(img));}void VideoPlayWin::videoPlaySlot()
{static int inum = 0;inum++;if(inum % 2 == 0){playBtn->setText("暂停");//停止线程自己定义playThread->videoStop();}else{playBtn->setText("开始");//启动线程playThread->start();playThread->m_stop = false;}
}void VideoPlayWin::ReceOneData(int num)
{temp = num;qDebug()<<"接收"<<num<<"帧数据";//对收到的数据做出及时更新update();}void VideoPlayWin::ReceOneImage(QImage img)
{tempimage = img;update();}

indexwin.h .cpp

#ifndef INDEXWIN_H
#define INDEXWIN_H#include <QWidget>
#include<QVBoxLayout>//垂直布局
#include<QHBoxLayout>//水平布局
#include<QPushButton>
#include<QLineEdit>
#include<QLabel>
#include<QListWidget>//制作视频页面列表class IndexWin : public QWidget
{Q_OBJECT
public:explicit IndexWin(QWidget *parent = 0);QWidget *leftwin;         //左边窗口QWidget *topwin;          //顶部窗口QWidget *indexwin;QWidget *rightwin;        //右边窗口QLineEdit *searchEdit;    //搜索编辑框QPushButton *userBtn;     //用户按钮QPushButton *vipBtn;      //会员按钮QPushButton *recordBtn;   //观看记录按钮QPushButton *downloadBtn; //下载视频记录按钮QPushButton *likeBtn;     //喜欢按钮QPushButton *shrinkBtn;   //缩小按钮QPushButton *enlargeBtn;  //放大按钮QPushButton *closeBtn;    //关闭按钮QPushButton *searchBtn;   //搜索按钮QLabel *logo1Lab;         //视频logoQPushButton *return1Btn;  //返回登录界面按钮QPushButton *cutBtn;      //最小化按钮QListWidget *videowinlist;//制作视频页面列表signals:public slots:void returnLoginSlot();   //回到登录界面void goNewwinSlot();      //点击不同的按钮做出不同的响应void GetItemName(QListWidgetItem *item);  //获取图片名字void enlargeImage(QListWidgetItem *item); //放大显示图片void videoWidgetShowSlot(QListWidgetItem*item);};#endif // INDEXWIN_H

本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg webRTC rtmp hls rtsp ffplay srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

#include "indexwin.h"
#include<QStringList>//一次添加多个控件
#include<QDebug>     //测试信号槽功能是否实现
#include<QMessageBox>//弹窗功能使用
#include<QListWidget>//多个按钮显示在某个窗口布局,点击按钮进入观看视频
#include<QDir>       //查找路径
#include<QPixmap>    //放置图片
#include<QListView>  //设置图片的模式 上面图片下面名字
#include "widget.h"  //登录窗口
#include"imagewin.h" //显示放大图片的窗口
#include"testthread.h"
#include"videodecode.h"
#include"videoplaywin.h"IndexWin::IndexWin(QWidget *parent) : QWidget(parent)
{this->resize(1500,800);//设置该窗口尺寸setWindowFlags(Qt::FramelessWindowHint);   //无边框setAttribute(Qt::WA_TranslucentBackground);//背景透明leftwin = new QWidget();topwin = new QWidget();//indexwin = new QWidget();rightwin = new QWidget();//QListWidget类 列表框控件用来加载并显示多个列表项videowinlist = new QListWidget();          //制作一个视频列表//设置背景颜色leftwin->setStyleSheet("background-color: rgb(252,157,154)");topwin->setStyleSheet("background-color: rgb(252,157,154)");//videowinlist->setStyleSheet("background-color: rgb(252,157,154)");//在下面setStyleSheet中实现//鼠标经过列表每一项有选中的动态效果videowinlist->setStyleSheet(                            //设置背景颜色"QListWidget{background-color: rgb(252,157,154)}""QListWidget{border:none; color:black;outline:0px; }""QListWidget::Item{padding-left:0px;padding-top:20px; padding-bottom:4px;color:black}""QListWidget::Item:hover{background:lightgray; color:green;}""QListWidget::item:selected{background:lightgray; color:green; }");//设置显示模式--上面图片下面名称 设置显示模式为图标显示videowinlist->setViewMode(QListView::IconMode);//设置图片模式--上面图片下面名称 设置显示模式为列表显示//videowinlist->setViewMode(QListView::ListMode);//设置列表每一项不可移动videowinlist->setMovement(QListView::Static);//设置大小自动适应videowinlist->setResizeMode(QListView::Adjust);//设置单个Icon大小videowinlist->setIconSize(QSize(125,125));//从左到右videowinlist->setFlow(QListView::LeftToRight);//最初进入视频播放器时候的显示 - image目录下的所有图片//获取视频图片路径 -                 从当前目录下往下找QString videopath = QDir::currentPath()+"/image";qDebug()<<videopath;QDir dir(videopath);//确定路径 从此dir路径下往下找QStringList moviename;//存放所有.png图片moviename << "*.png"; //查找所有.png图片//entryList--类似打开目录文件夹的操作                 文件         可读     排序按照名字排序QStringList files = dir.entryList(moviename,QDir::Files|QDir::Readable,QDir::Name);qDebug()<<files; //查找.png图片名for(int i=0;i<files.size();i++){//显示所有的.png图片及名称//QListWidgetItem类 就是列表项类QListWidgetItem *newitem = new QListWidgetItem(          //自适应列表项中的图片大小QIcon(QPixmap(videopath+"/"+files.at(i)).scaled(QSize(100,100))),files.at(i));//设置列表项中的图片大小videowinlist->setIconSize(QSize(100,100));//设置列表项整体的尺寸newitem->setSizeHint(QSize(250,190));//设置列表项中的文字对齐方式:水平居中newitem->setTextAlignment(Qt::AlignHCenter);//在列表框中添加列表项videowinlist->addItem(newitem);}connect(videowinlist,SIGNAL(itemClicked(QListWidgetItem*)),this,SLOT(videoWidgetShowSlot(QListWidgetItem*)));//控件布局//方法一:自定义所有控件//控件水平布局  顶部窗口放置水平布局QHBoxLayout *hboxlayout = new QHBoxLayout(topwin);logo1Lab = new QLabel();searchEdit = new QLineEdit();searchBtn = new QPushButton();return1Btn = new QPushButton();userBtn = new QPushButton();vipBtn = new QPushButton();recordBtn = new QPushButton();downloadBtn = new QPushButton();likeBtn = new QPushButton();shrinkBtn = new QPushButton();enlargeBtn = new QPushButton();cutBtn = new QPushButton();closeBtn = new QPushButton();logo1Lab->setFixedSize(170,110);logo1Lab->setPixmap(QPixmap(":/image/0510.png").scaled(logo1Lab->size()));//编辑框的大小位置设置searchEdit->setFixedSize(600,35);//按钮控件大小设置searchBtn->setFixedSize(40,40);searchBtn->setIcon(QIcon(QPixmap(":/image/050909.png")));searchBtn->setIconSize(QSize(40,40));return1Btn->setFixedSize(40,40);return1Btn->setIcon(QIcon(QPixmap(":/image/051001.png")));return1Btn->setIconSize(QSize(40,40));userBtn->setFixedSize(40,40);userBtn->setIcon(QIcon(QPixmap(":/image/050901.png")));userBtn->setIconSize(QSize(40,40));vipBtn->setFixedSize(40,40);vipBtn->setIcon(QIcon(QPixmap(":/image/050902.png")));vipBtn->setIconSize(QSize(40,40));recordBtn->setFixedSize(40,40);recordBtn->setIcon(QIcon(QPixmap(":/image/050903.png")));recordBtn->setIconSize(QSize(40,40));downloadBtn->setFixedSize(40,40);downloadBtn->setIcon(QIcon(QPixmap(":/image/050904.png")));downloadBtn->setIconSize(QSize(40,40));likeBtn->setFixedSize(40,40);likeBtn->setIcon(QIcon(QPixmap(":/image/050905.png")));likeBtn->setIconSize(QSize(40,40));shrinkBtn->setFixedSize(40,40);shrinkBtn->setIcon(QIcon(QPixmap(":/image/050906.png")));shrinkBtn->setIconSize(QSize(40,40));enlargeBtn->setFixedSize(40,40);enlargeBtn->setIcon(QIcon(QPixmap(":/image/050907.png")));enlargeBtn->setIconSize(QSize(40,40));cutBtn->setFixedSize(40,40);cutBtn->setIcon(QIcon(QPixmap(":/image/051101.png")));cutBtn->setIconSize(QSize(40,40));closeBtn->setFixedSize(40,40);closeBtn->setIcon(QIcon(QPixmap(":/image/050908.png")));closeBtn->setIconSize(QSize(40,40));//加空白 - 将控件右置 - 界面整体美观hboxlayout->addStretch();hboxlayout->addWidget(logo1Lab);hboxlayout->addWidget(searchEdit);hboxlayout->addWidget(searchBtn);hboxlayout->addWidget(return1Btn);hboxlayout->addWidget(userBtn);hboxlayout->addWidget(vipBtn);hboxlayout->addWidget(recordBtn);hboxlayout->addWidget(downloadBtn);hboxlayout->addWidget(likeBtn);hboxlayout->addWidget(shrinkBtn);hboxlayout->addWidget(enlargeBtn);hboxlayout->addWidget(cutBtn);hboxlayout->addWidget(closeBtn);//方法二:动态创建所有控件//按钮控件垂直  左边窗口放置一个垂直布局QVBoxLayout *vboxlayout1 = new QVBoxLayout(leftwin);QStringList funBtnlist;funBtnlist<<"推荐"<<"电视剧"<<"电影"<<"综艺"<<"儿童"<<"动漫"<<"游戏"<<"纪录片"<<"体育";for(int i=0;i<funBtnlist.size();i++){QPushButton *newBtn = new QPushButton(funBtnlist.at(i));//多个按钮绑定同一个槽                       点击不同的按钮做出不同的响应connect(newBtn,SIGNAL(clicked(bool)),this,SLOT(goNewwinSlot()));//布局中添加控件vboxlayout1->addWidget(newBtn);}//加空白 -- 将按钮上置//vboxlayout1->addStretch();//窗口布局//右半部分的布局放置顶部窗口和(视频列表)主窗口  两个窗口垂直QVBoxLayout *rightboxlayout = new QVBoxLayout(rightwin);rightboxlayout->addWidget(topwin);       //顶部窗口//rightboxlayout->addWidget(indexwin);rightboxlayout->addWidget(videowinlist); //视频列表//左边窗口和前面两个窗口垂直的部分 进行水平的放置//this指代最大布局QHBoxLayout *mainlayout = new QHBoxLayout(this);mainlayout->addWidget(leftwin);           //放置窗口//mainlayout->addLayout(rightboxlayout);  //放置布局mainlayout->addWidget(rightwin);//返回按钮回到登录界面connect(return1Btn,SIGNAL(clicked(bool)),this,SLOT(returnLoginSlot()));//关闭按钮关闭窗口connect(closeBtn,SIGNAL(clicked(bool)),this,SLOT(close()));//还原按钮的实现connect(shrinkBtn,SIGNAL(clicked(bool)),this,SLOT(showNormal()));//最大化按钮的实现connect(enlargeBtn,SIGNAL(clicked(bool)),this,SLOT(showMaximized()));//最小化按钮的实现connect(cutBtn,SIGNAL(clicked(bool)),this,SLOT(showMinimized()));//列表项双击itemDoubleClicked信号 - 获取图片名字//connect(videowinlist,SIGNAL(itemDoubleClicked(QListWidgetItem*)),this,//      SLOT(GetItemName(QListWidgetItem *)));//列表项双击信号 - 放大显示图片connect(videowinlist,SIGNAL(itemDoubleClicked(QListWidgetItem*)),this,SLOT(enlargeImage(QListWidgetItem *)));
}//回到登录界面
void IndexWin::returnLoginSlot()
{//Widget - 登录窗口Widget *re1 = new Widget;re1->show();this->hide();
}//视频播放器界面中左边窗口的不同的按钮实现不同的响应
//更新视频列表 - 分文件管理
void IndexWin::goNewwinSlot()
{//获取点击按钮的文本信息 - sender -对QPushButton对象进行操作QPushButton *btn = (QPushButton *)sender();//按钮对象文本信息的获取和保存QString btnName = btn->text();//qDebug()<<btn->text();//根据获取到的文本信息进行判断 - 根据文本信息进行区分不同的按钮 - 不同的按钮做出不同的响应//更新列表    分文件管理if(btnName == "推荐"){//先清空之前列表 再进行更新videowinlist->clear();//更新推荐列表//获取推荐中图片的路径 -                     从当前目录下往下找QString videopath = QDir::currentPath()+"/image/推荐";qDebug()<<videopath;QDir dir(videopath);//确定路径 从此dir路径下往下找QStringList moviename;//存放所有.png图片moviename << "*.png"; //查找所有.png图片//entryList--类似打开目录文件夹的操作                 文件         可读     排序按照名字排序QStringList files = dir.entryList(moviename,QDir::Files|QDir::Readable,QDir::Name);qDebug()<<files; //查找.png图片名for(int i=0;i<files.size();i++){//显示所有的.png图片及名称//QListWidgetItem类 就是列表项类QListWidgetItem *newitem = new QListWidgetItem(QIcon(QPixmap(videopath+"/"+files.at(i)).scaled(QSize(100,100))),files.at(i));//设置列表项中的图片大小videowinlist->setIconSize(QSize(100,100));//设置列表项的尺寸newitem->setSizeHint(QSize(250,190));//设置文字对齐方式:水平居中newitem->setTextAlignment(Qt::AlignHCenter);//在列表框中添加列表项videowinlist->addItem(newitem);}//   弹窗            对话框悬空在上面-NULLQMessageBox::information(NULL,"推荐",btn->text());}if(btnName == "电视剧"){videowinlist->clear();//更新电视剧列表//获取电视剧图片路径 -                    从当前目录下往下找QString videopath = QDir::currentPath()+"/image/电视剧";qDebug()<<videopath;QDir dir(videopath);//确定路径 从此dir路径下往下找QStringList moviename;//存放所有.png图片moviename << "*.png"; //查找所有.png图片//entryList--类似打开目录文件夹的操作                 文件         可读     排序按照名字排序QStringList files = dir.entryList(moviename,QDir::Files|QDir::Readable,QDir::Name);qDebug()<<files; //查找.png图片名for(int i=0;i<files.size();i++){//显示所有的.png图片及名称//QListWidgetItem类 就是列表项类QListWidgetItem *newitem = new QListWidgetItem(QIcon(QPixmap(videopath+"/"+files.at(i)).scaled(QSize(100,100))),files.at(i));//设置列表项中的图片大小videowinlist->setIconSize(QSize(100,100));//设置列表项的尺寸newitem->setSizeHint(QSize(250,190));//设置文字对齐方式:水平居中newitem->setTextAlignment(Qt::AlignHCenter);//在列表框中添加列表项videowinlist->addItem(newitem);}QMessageBox::information(NULL,"电视剧",btn->text());}if(btnName == "电影"){videowinlist->clear();//更新电影列表//获取电影图片路径 -                     从当前目录下往下找QString videopath = QDir::currentPath()+"/image/电影";qDebug()<<videopath;QDir dir(videopath);//确定路径 从此dir路径下往下找QStringList moviename;//存放所有.png图片moviename << "*.png"; //查找所有.png图片//entryList--类似打开目录文件夹的操作                 文件         可读     排序按照名字排序QStringList files = dir.entryList(moviename,QDir::Files|QDir::Readable,QDir::Name);qDebug()<<files; //查找.png图片名for(int i=0;i<files.size();i++){//显示所有的.png图片及名称//QListWidgetItem类 就是列表项类QListWidgetItem *newitem = new QListWidgetItem(QIcon(QPixmap(videopath+"/"+files.at(i)).scaled(QSize(100,100))),files.at(i));//设置列表项中的图片大小videowinlist->setIconSize(QSize(100,100));//设置列表项的尺寸newitem->setSizeHint(QSize(250,190));//设置文字对齐方式:水平居中newitem->setTextAlignment(Qt::AlignHCenter);//在列表框中添加列表项videowinlist->addItem(newitem);}QMessageBox::information(NULL,"电影",btn->text());}if(btnName == "综艺"){videowinlist->clear();//更新综艺列表//获取综艺图片路径 -                     从当前目录下往下找QString videopath = QDir::currentPath()+"/image/综艺";qDebug()<<videopath;QDir dir(videopath);//确定路径 从此dir路径下往下找QStringList moviename;//存放所有.png图片moviename << "*.png"; //查找所有.png图片//entryList--类似打开目录文件夹的操作                 文件         可读     排序按照名字排序QStringList files = dir.entryList(moviename,QDir::Files|QDir::Readable,QDir::Name);qDebug()<<files; //查找.png图片名for(int i=0;i<files.size();i++){//显示所有的.png图片及名称//QListWidgetItem类 就是列表项类QListWidgetItem *newitem = new QListWidgetItem(QIcon(QPixmap(videopath+"/"+files.at(i)).scaled(QSize(100,100))),files.at(i));//设置列表项中的图片大小videowinlist->setIconSize(QSize(100,100));//设置列表项的尺寸newitem->setSizeHint(QSize(250,190));//设置文字对齐方式:水平居中newitem->setTextAlignment(Qt::AlignHCenter);//在列表框中添加列表项videowinlist->addItem(newitem);}QMessageBox::critical(NULL,"综艺",btn->text());}if(btnName == "儿童"){QMessageBox::question(NULL,"儿童",btn->text());QString cinputFilePath = "test.avi";
//        videoDecodeThread *p = new videoDecodeThread(cinputFilePath);
//        p->start();//        //线程的创建
//        testthread *t = new testthread;
//        //线程的启动
//        t->start();}if(btnName == "动漫"){QMessageBox::warning(NULL,"动漫",btn->text());}if(btnName == "游戏"){QMessageBox::about(NULL,"游戏",btn->text());}if(btnName == "纪录片"){QMessageBox::information(NULL,"纪录片",btn->text());}if(btnName == "体育"){QMessageBox::information(NULL,"体育",btn->text());}
}//QListWidget获取Item信号槽 - 点击图片获取图片名称
void IndexWin::GetItemName(QListWidgetItem *item)
{QMessageBox::about(NULL,"视频列表",item->text());qDebug()<<item->text();
}//通过自定义的窗口显示图片
void IndexWin::enlargeImage(QListWidgetItem *item)
{QRect rect = this->geometry();//获取当前窗口坐标及大小 x、y、w、h//通过自定义的窗口显示图片imageWin *showImageWidget = new imageWin(item , QRect(rect.x(), rect.y()+rect.y()*1/4, rect.width(), rect.height()*2/3));showImageWidget->show();
}void IndexWin::videoWidgetShowSlot(QListWidgetItem *item)
{qDebug()<<item->text()<<"界面创建";QStringList list = item->text().split(".");//QString字符串分割函数qDebug()<<list[0];//视频文件名称后缀:.avi//QString cinputFilePath = list[0]+".avi";VideoPlayWin *videowin = new VideoPlayWin(list[0]);videowin->show();//    videoDecodeThread *p = new videoDecodeThread(cinputFilePath);//新建视频播放界面
//    p->start();}

如果你对音视频开发感兴趣,觉得文章对您有帮助,别忘了点赞、收藏哦!或者对本文的一些阐述有自己的看法,有任何问题,欢迎在下方评论区讨论!

本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg webRTC rtmp hls rtsp ffplay srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

【Qt+FFMPEG】 - 解码播放本地视频相关推荐

  1. 【Qt学习】 FFmpeg 解码播放本地视频

    目录 一:效果展示 二:源码分享 一:效果展示 二:源码分享 videodecode.h .cpp [解码线程的封装] #ifndef VIDEODECODE_H #define VIDEODECOD ...

  2. 【Qt+FFmpeg】鼠标滚轮放大、缩小、移动——解码播放本地视频(三)

    上一期我们实现了播放.暂停.重播.倍速功能,这期来谈谈如何实现鼠标滚轮放大缩小和移动:如果还没看过上期,请移步 [Qt+FFmpeg]解码播放本地视频(一)_logani的博客-CSDN博客[Qt+F ...

  3. 【Qt+FFmpeg】解码播放本地视频(二)——实现播放、暂停、重播、倍速功能

    目录 一.FFmpeg解码流程图 二.播放.暂停.重播.倍速功能实现 1.创建播放.重播和倍速按钮 2.设置布局.样式.没有播放完毕前隐藏重播按钮 3.绑定信号槽 4.实现槽函数 (1)暂停和播放 ( ...

  4. 假期之不务正业—— Qt+FFmpeg+百度api进行视频的语音识别

    假期之不务正业--Qt+FFmpeg+百度api进行视频的语音识别 一.前言 二.FFmpeg进行音频提取和重采样 三.对音频分段 四.百度api调用 五.Qt编程的一些补充 六.结语 一.前言 现在 ...

  5. Vue 媒体处理(摄像头,截图,播放本地视频)

    Vue 媒体处理(摄像头,截图,播放本地视频) 一. 打开摄像头 ```javascriptthis.constraint = {// video属性设置video: {width: 300,heig ...

  6. PP视频如何播放本地视频文件

    今天小编给广大用户分享PP视频如何播放本地视频文件.PP视频手机版是一款装机必备的手机视频播放软件,用户可在线观看PP视频全部免费高清正版视频,海量内容,高清画质,自由点播,配合先进的P2P下载技术, ...

  7. 如视VR显示连不上服务器,HTC Vive播放本地视频图文教程(附常见问题解决办法)...

    由于需要连接电脑设备,因而部分新手用户不懂如何使用HTC Vive播放本地视频.实际上整个操作并不复杂,只需要用到Vive Cinema播放器即可.Vive Cinema是HTC VR New Tec ...

  8. android实现本地视频播放功能,Android开发 MediaPlayer入门_播放本地视频

    前言 MediaPlayer,可以播放视频/音频,并且它支持本地和网络文件的播放.本片博客作为入门教程,先以最通俗的方式解释播放文件本地视频. 实现流程 获取权限 保持屏幕常亮 初始化SurfaceV ...

  9. opencv | A02 播放本地视频 调用摄像头

    前言 VideoCapture:视频捕获相关类 代码实现 1.播放本地视频 #include <opencv2\opencv.hpp> #include <iostream>u ...

最新文章

  1. PCIE4.0 简单介绍
  2. 如何把本地项目上传到Github
  3. 【OpenCV】邻域滤波:方框、高斯、中值、双边滤波
  4. Docker Windows 安装
  5. 排序——选择排序、快速排序
  6. axios的安装和使用
  7. 用链表编写教师信息管理系统
  8. IcedTea6版本1.7.1
  9. Oracle 锁详解(lock)
  10. stalk词组_let.stalk是什么意思
  11. 模型优化中的过拟合与欠拟合
  12. AutoService+javaPoet+maven+注解自动生成java代码
  13. RocketChip
  14. Red Team后漏洞利用秘籍:如何使用C#语言实现系统调用
  15. ugui 转轮_(搬运工)unity3D的FingerGestures插件
  16. Open3D键盘切换上下帧显示点云
  17. 吉林大学计网真题以及期末题汇总
  18. 【RTOS训练营】课程学习方法和C语言知识(指针、结构体、函数指针、链表)和学员问题
  19. 计算机应用基础10000字论文,计算机应用基础毕业论文.doc
  20. 关于淘宝直通车优化的一点感悟

热门文章

  1. SQL Server数据库碎片整理
  2. 处理器如何实现原子操作
  3. Matlab解非线性规划问题(fmincon)
  4. 从小红书app开启逆向之旅(1)
  5. 计算机英语一般会出现那些问题,计算机专业英语教学存在的问题与改进措施
  6. 【Flink】flink on k8s 部署方案
  7. 酷派7295a官方底包优化刷机包 加入root权限省电稳定
  8. 算法:主宰这个世界的10大算法
  9. 2,Java语言基础-Java语言基本程序设计知识
  10. nvm介绍、nvm下载安装及使用