目录

一:效果展示

二:源码分享


一:效果展示

二:源码分享

videodecode.h .cpp [解码线程的封装]

#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
#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();}

【Qt学习】 FFmpeg 解码播放本地视频相关推荐

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

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

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

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

  3. 【Qt+FFMPEG】 - 解码播放本地视频

    目录 一:结果 二:代码 videodecode.h .cpp videoplaywin.h .cpp indexwin.h .cpp 一:结果 二:代码 videodecode.h .cpp 本文福 ...

  4. Qt编写的RTSP播放器+视频监控(ffmpeg版本)

    最新版请移步:https://blog.csdn.net/feiyangqingyun/article/details/97565652 记得四年前就写了个简易版本的,当时写得非常粗糙,代码实在惨不忍 ...

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

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

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

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

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

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

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

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

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

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

最新文章

  1. .NET Core 2.1的重大缺陷延长了.NET Core 2.0的寿命
  2. mysql collectset_005.hive列转行 (collect_set() 去重)
  3. Galgame研发日志:那么,怎么才能回本呢?
  4. java异常处理试题答案_JAVA异常处理试题及答案
  5. 汇编语言(三十四)之输出中文
  6. CPU acceleration status:HAXM must be updated(version 1.1.16.0.1)
  7. 苹果macmac效率工具:Alfred
  8. AXURE母版事件(Raised-events)
  9. 51 单片机晶振电路原理
  10. 如何删除IE8收藏夹栏中的网址
  11. 纯干货分享:LoRa物联网各行业应用案例
  12. Windows账户设置指南
  13. 瓦片地图面面观之缩放级别
  14. DDOS防护如何建设?
  15. 远端服务器无响应请检查网络,连接远程服务器超时请检查网络连接
  16. 支付账户体系(分账接口)的9大价值
  17. java对接支付宝当面付
  18. Jmeter 安装历史版本
  19. 海康威视硬件对接介绍
  20. 文件同步详细操作(NFS,rsync)

热门文章

  1. 电子制造企业如何做好生产管理?从这4个方面入手就够了
  2. 前端做CRM管理系统是做什么_企业部署crm客户管理系统的意义是什么?
  3. 用菲教切入下沉市场,51TALK会成为在线教育的拼多多吗?
  4. 【阿冈看超女】阿冈与叶凡超女6进5决赛全感受!
  5. VBScript DateSerial 函数(返回本月第一天,最后一天)
  6. 剧透 报名 | 蚂蚁金服ATEC城市峰会·上海即将开幕 1
  7. 移动端实现淡入淡出、旋转、缩放动画
  8. 使用eclipse创建的第一个jsp项目
  9. 【ChatGPT】Open AI 公司CEO:Sam Altman 的创业手册—— 了解一下 ChatGPT是怎样被创造出来的?
  10. cmake添加动态库