开发环境:MinGW+QT5.9+FFMPEG20190212

一、开发环境搭建

FFMPEG的开发环境部署比如容易,在官网下载库文件,然后在QT里面指定路径,把相关dll文件放到exe目录下就可以了,不需要根据开发工具重新编译。

(1)下载工具

在https://ffmpeg.zeranoe.com/builds/下载对应版本。链接方式有三种,

Static:这个版本只包含了ffmpeg.exe、ffplay.exe、ffprobe.exe三个可执行程序,没有头文件和库文件。

Shared:这个版本包含了ffmpeg.exe、ffplay.exe、ffprobe.exe三个可执行程序和相关动态库文件。

Dev:开发版,这个包含了头文件和库文件。

我们需要下载Shared和Dev两个版本,Dev有我们程序开发需要的头文件和库文件,这里面包含的库是动态调用的,所依赖的动态库在Shared这个版本里面,所以两个版本都要下载。

(2)添加库

将下载的文件解压缩,然后新建一个QT工程,在pro添加lib目录和include目录的路径。

INCLUDEPATH +="E:\\Lib\\ffmpeg\\include"LIBS += -LE:\Lib\ffmpeg\lib -lavutil -lavformat -lavcodec -lavdevice -lavfilter -lpostproc -lswresample -lswscale

然后将shared下的动态库添加到exe目录下。

二、代码实现播放功能

在界面上放置一个QLabel和QPushButton控件,当点击按钮时实现以下功能:

#include <QTime>
extern "C"{
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#include <libavutil/imgutils.h>
}
void Delay(int msec)
{QTime dieTime = QTime::currentTime().addMSecs(msec);while( QTime::currentTime() < dieTime )QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}void MainWindow::on_btnPlay_clicked()
{AVFormatContext    *pFormatCtx;int                i, videoindex;AVCodecContext    *pCodecCtx;AVCodec            *pCodec;AVFrame    *pFrame, *pFrameRGB;unsigned char *out_buffer;AVPacket *packet;int ret, got_picture;struct SwsContext *img_convert_ctx;char filepath[] = "E:\\media\\1.avi";//初始化编解码库
    av_register_all();//创建AVFormatContext对象,与码流相关的结构。pFormatCtx = avformat_alloc_context();//初始化pFormatCtx结构if (avformat_open_input(&pFormatCtx, filepath, NULL, NULL) != 0){printf("Couldn't open input stream.\n");return ;}//获取音视频流数据信息if (avformat_find_stream_info(pFormatCtx, NULL) < 0){printf("Couldn't find stream information.\n");return ;}videoindex = -1;//nb_streams视音频流的个数,这里当查找到视频流时就中断了。for (i = 0; i < pFormatCtx->nb_streams; i++)if (pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO){videoindex = i;break;}if (videoindex == -1){printf("Didn't find a video stream.\n");return ;}//获取视频流编码结构pCodecCtx = pFormatCtx->streams[videoindex]->codec;//查找解码器pCodec = avcodec_find_decoder(pCodecCtx->codec_id);if (pCodec == NULL){printf("Codec not found.\n");return ;}//用于初始化pCodecCtx结构if (avcodec_open2(pCodecCtx, pCodec, NULL) < 0){printf("Could not open codec.\n");return ;}//创建帧结构,此函数仅分配基本结构空间,图像数据空间需通过av_malloc分配pFrame = av_frame_alloc();pFrameRGB = av_frame_alloc();//创建动态内存,创建存储图像数据的空间//av_image_get_buffer_size获取一帧图像需要的大小out_buffer = (unsigned char *)av_malloc(av_image_get_buffer_size(AV_PIX_FMT_RGB32, pCodecCtx->width, pCodecCtx->height, 1));av_image_fill_arrays(pFrameRGB->data, pFrameRGB->linesize, out_buffer,AV_PIX_FMT_RGB32, pCodecCtx->width, pCodecCtx->height, 1);packet = (AVPacket *)av_malloc(sizeof(AVPacket));//Output Info-----------------------------printf("--------------- File Information ----------------\n");//此函数打印输入或输出的详细信息av_dump_format(pFormatCtx, 0, filepath, 0);printf("-------------------------------------------------\n");//初始化img_convert_ctx结构img_convert_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height, pCodecCtx->pix_fmt,pCodecCtx->width, pCodecCtx->height, AV_PIX_FMT_RGB32, SWS_BICUBIC, NULL, NULL, NULL);//av_read_frame读取一帧未解码的数据while (av_read_frame(pFormatCtx, packet) >= 0){//如果是视频数据if (packet->stream_index == videoindex){//解码一帧视频数据ret = avcodec_decode_video2(pCodecCtx, pFrame, &got_picture, packet);if (ret < 0){printf("Decode Error.\n");return ;}if (got_picture){sws_scale(img_convert_ctx, (const unsigned char* const*)pFrame->data, pFrame->linesize, 0, pCodecCtx->height,pFrameRGB->data, pFrameRGB->linesize);QImage img((uchar*)pFrameRGB->data[0],pCodecCtx->width,pCodecCtx->height,QImage::Format_RGB32);ui->label->setPixmap(QPixmap::fromImage(img));Delay(40);}}av_free_packet(packet);}sws_freeContext(img_convert_ctx);av_frame_free(&pFrameRGB);av_frame_free(&pFrame);avcodec_close(pCodecCtx);avformat_close_input(&pFormatCtx);
}

以上就是QT显示视频图像的简单例子,对于对FFMPEG感兴趣想学习更多内容的,推荐看看下面博主的博文,对FFMPEG的介绍非常详细:

https://blog.csdn.net/leixiaohua1020/article/details/15811977

转载于:https://www.cnblogs.com/WushiShengFei/p/10837264.html

QT+FFMPEG实现视频播放相关推荐

  1. Qt FFmpeg 音视频播放器

    使用FFmpeg库实现 本地和rtp 音视频播放器,使用qt绘制视频. 本demo环境为 qt5.12 vs2019-32位 .pro的qt工程 FFmpeg版本位3.4.8 vs2092-32位 本 ...

  2. QT + FFmpeg 5.x + x264 + x265 + SDL2 音视频播放器

    QT + FFmpeg 5.x + x264 + x265 + SDL2 音视频播放器 使用了QT的QML设计界面,人机交互; 使用了FFmpeg 5.x + x264 + x265 + SDL2 完 ...

  3. QT软件开发-基于FFMPEG设计视频播放器-解码音频(三)

    QT软件开发-基于FFMPEG设计视频播放器-CPU软解视频(一) https://xiaolong.blog.csdn.net/article/details/126832537 QT软件开发-基于 ...

  4. Qt + FFmpeg 视频播放器

    一. 环境搭建 1. 下载 QT:window 5.7.0版本 FFmpeg: ffmpeg-20200522-38490cb-win32-dev 注意:这里下载 32位dev版本,要和编译器对应(我 ...

  5. QT软件开发-基于FFMPEG设计视频播放器-软解图像(一)

    QT软件开发-基于FFMPEG设计视频播放器-CPU软解视频(一) https://xiaolong.blog.csdn.net/article/details/126832537 QT软件开发-基于 ...

  6. QT软件开发-基于FFMPEG设计视频播放器-GPU硬解、OpenGL渲染、解码音频完整例子(六)

    QT软件开发-基于FFMPEG设计视频播放器-CPU软解视频(一) https://xiaolong.blog.csdn.net/article/details/126832537 QT软件开发-基于 ...

  7. QT软件开发-基于FFMPEG设计视频播放器-GPU硬解、OpenGL渲染(四)

    QT软件开发-基于FFMPEG设计视频播放器-CPU软解视频(一) https://xiaolong.blog.csdn.net/article/details/126832537 QT软件开发-基于 ...

  8. FFmpeg开发(四)——Qt实现一个视频播放器(参考了暴风影音、迅雷影音)

    FFmpeg开发(四)--Qt实现一个视频播放器(参考了暴风影音.迅雷影音) 本系列文章目录: FFmpeg开发(一)一Qt Creator配置FFmpeg FFmpeg开发(二)--(FFmpeg基 ...

  9. 某牛的QT+ffmpeg 播放器 的readme

    http://download.csdn.net/source/2802201 write by :lbwave@sina.com QT+ffmpeg 大名顶顶的QT ffmpeg 我就不用说了.看看 ...

最新文章

  1. android log4,GitHub - oronno/log4android: Log4Android - Simple Logging Wrapper Library for Android
  2. C/C++ / 函数调用规则汇总
  3. 关于navicat提权的方法
  4. ffplay.c学习-2-数据读取线程
  5. 色彩的狂欢:看嘎玛·多吉次仁的画展
  6. 自定义控件(视图)2期笔记13:View的滑动冲突之 内部拦截法
  7. 明年Wi-Fi手机销量5亿 无线技术助移动互联网爆发
  8. 安川机器人PROFINET 配置流程
  9. 中国地区2012年第二季度 网络安全威胁报告
  10. java生成背景透明的png图片,Java生成背景透明的png图片
  11. 从教女儿下棋谈启蒙教育
  12. if else 的使用
  13. 第四篇--关于device
  14. LTE小区搜索过程及SCH/BCH设计
  15. java计算机毕业设计校园共享单车系统源代码+系统+数据库+lw文档
  16. 螺旋探索与自适应混合变异的麻雀搜索-附代码
  17. Pycharm 配置 Autopep8
  18. echart hightchart 区别
  19. 想做倒卖生意,现在有两万启动资金,倒卖什么比较好?
  20. Ansys学习-Ansys workbench-暂态传热问题仿真尝试-水泥盒子

热门文章

  1. cocos 新工程遇到的问题
  2. GridView+ZedGraph【转】
  3. 找呀志_ContentResolver操作ContentProvider数据
  4. Gradle: 警告:编码 GBK 的不可映射字符
  5. Maven+Mybatis+Spring配置
  6. 分布式设计与开发(一)------宏观概述
  7. css3加载图片淡入效果
  8. 通俗讲清楚为什么使用信息熵增益比而不是信息熵增益?
  9. 固态+机械(uefi类型的bios),用easybcd安装win10+ubuntu16.04双系统
  10. lcd取模如何取16位_两种方式实现取16位变量的高低8位, 不严谨对比