环境说明

我这里使用的是Qt5环境,当然你可以使用其他环境,原理应该都差不多的。

导入ffmpeg库

首先在Qt的工程文件,就是.pro格式的那个,打开,然后加入下面代码,我这里对windows和mac系统做了一下兼容,你选择其中一个即可,如果是windows系统,那你得改一下INCLUDEPATH 路径为你存放ffmpeg的路径。

win32 {INCLUDEPATH += "F:\\cpppath\\ffmpeg-win64-dev\\include"LIBS += -LF:\cpppath\ffmpeg-win64-dev\lib -lavutil -lavformat -lavcodec -lavfilter -lswscale -lswresample -lopengl32 -luser32
}mac {LIBS += -L/usr/local/lib -lavutil -lavformat -lavcodec -lavfilter -lswscale -lswresample -framework CoreFoundationINCLUDEPATH = /usr/local/include
}

流程分析

大概流程是这样的:

  1. 使用ffmpeg打开视频文件
  2. 读取视频第一帧数据
  3. 对视频帧进行解码,得到图片原始数据
  4. 对原始数据进行加工处理,转换成我们需要的图片对象

关键代码

void MainWindow::createPreviewWidthFile(const char *file){AVFormatContext* fmt_ctx_ = nullptr;//打开视频文件int errCode = avformat_open_input(&fmt_ctx_, file, nullptr, nullptr);if(errCode != 0){qDebug() << "avformat_open_input fail" << errCode;return;}//读取音视频流信息errCode = avformat_find_stream_info(fmt_ctx_, nullptr);if(errCode != 0){qDebug() << "avformat_find_stream_info fail" << errCode;avformat_close_input(&fmt_ctx_);return;}//打印输出视频相关信息av_dump_format(fmt_ctx_, 0, file, 0);AVPacket* pkt = av_packet_alloc();AVFrame* temp_frame = av_frame_alloc();SwsContext* sws_ctx = nullptr;int ret = 0;QImage preview;bool preview_done = false;for (int i=0; i<int(fmt_ctx_->nb_streams) && !preview_done; i++){//只处理视频信息if (fmt_ctx_->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {//查找视频解码器AVCodec* codec = avcodec_find_decoder(fmt_ctx_->streams[i]->codecpar->codec_id);AVCodecContext *codec_ctx = avcodec_alloc_context3(codec);//根据提供的编解码器参数的值填充编解码器上下文avcodec_parameters_to_context(codec_ctx, fmt_ctx_->streams[i]->codecpar);//打开解码器avcodec_open2(codec_ctx, codec, nullptr);//读取帧数据while (av_read_frame(fmt_ctx_, pkt) >= 0){av_frame_unref(temp_frame);//对视频帧数据进行解码while ((ret = avcodec_receive_frame(codec_ctx, temp_frame)) == AVERROR(EAGAIN)){ret = avcodec_send_packet(codec_ctx, pkt);if (ret < 0) {qCritical() << "Failed to send packet to decoder." << ret;break;}}if(ret < 0 && ret != AVERROR_EOF){qDebug() << "Failed to receive packet from decoder." << ret;continue;}//等比例缩放int dstH = 240;int dstW = qRound(dstH * (float(temp_frame->width)/float(temp_frame->height)));//消除可能的告警dstH = (dstH >> 4) << 4;dstW = (dstW >> 4) << 4;sws_ctx = sws_getContext(temp_frame->width,temp_frame->height,static_cast<AVPixelFormat>(temp_frame->format),dstW,dstH,static_cast<AVPixelFormat>(AV_PIX_FMT_RGBA),SWS_FAST_BILINEAR,nullptr,nullptr,nullptr);int linesize[AV_NUM_DATA_POINTERS];linesize[0] = dstW*4;//生成图片preview = QImage(dstW, dstH, QImage::Format_RGBA8888);uint8_t* data = preview.bits();sws_scale(sws_ctx,temp_frame->data,temp_frame->linesize,0,temp_frame->height,&data,linesize);sws_freeContext(sws_ctx);avcodec_close(codec_ctx);avcodec_free_context(&codec_ctx);preview_done = true;break;}}}//释放资源av_frame_free(&temp_frame);av_packet_free(&pkt);avformat_close_input(&fmt_ctx_);//使用该图片,贴图到textlabelif(preview_done){ui->label->setPixmap(QPixmap::fromImage(preview));}
}

该代码只是完成了一个基本的功能,而且可能并不完善,具体使用需要自己完善了。

效果:

完整代码

【Qt】使用ffmpeg加载视频第一帧作为图标相关推荐

  1. Unity AVPro Video 加载视频第一秒图片与例子

    使用AVPro Video 加载视频第一秒的图片 原理:使用AVPro Video插件的MediaPlayer mediaPlayer.OpenMedia(new MediaPath(url链接, M ...

  2. node ffmpeg swf转mp4 截取mp4视频第一帧为jpg图片

    1.首先在电脑上安装node / ffmpeg (怎么安装百度叭 案例挺多不做介绍) 2.确认安装完成之后: //注意!!!! 方法可以直接复制,前几行这个我就是标注一下以下方法用到了这些插件 con ...

  3. php ffmpeg截图,php ffmpeg截取视频第一帧保存为图片的方法

    php ffmpeg截取视频第一帧保存为图片的方法 $xiangmupath = $this->getxiangmupath(); $filename = 'chengshi'; $cmd = ...

  4. OpenCV中使用类VideoCapture加载视频和打开摄像头

    先直接上示例代码,然后对代码进行讲解. #!/usr/bin/env python # -*- coding: utf-8 -*- # 图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 248 ...

  5. 在文件管理器中显示图片的缩略图和视频第一帧的缩略图

    首先在vender/mediatek/properties/packags/apps/FileManager/src/com/mediatek/filemanager/IconManager.java ...

  6. 小程序获取视频第一帧

    小程序获取视频第一帧 最近有个小程序项目,需要在页面中展示大量的视频,但是不用播放.后来遇到问题,小程序不可以在一个页面中放置超过5个video标签,否则播放视频加载不到. 经过度娘查询找到一篇大佬的 ...

  7. 前端开发如何获取视频第一帧作为封面

    首先说明一下,浏览器或者手机需要支持video标签. 从H5本身来说,这里用到了video的一个属性,poster(规定视频下载时显示的图像,或者在用户点击播放按钮前显示的图像.). 然后还有一个vi ...

  8. uni-app 获取视频第一帧转换为图片 并展示

    话不多说,直接上代码 <template><view class="content"><image v-if="demo != ''&quo ...

  9. vue 上传视频到腾讯云存储并获取视频第一帧

    官网文档链接:https://cloud.tencent.com/document/product/436/6268 需求 项目里之前上传视频是调后端接口,接口将视频保存到服务器,然后返回视频链接. ...

最新文章

  1. Unet实现图像分割(三)
  2. linux python开发环境sql数据迁移到mysql_运用Python语言编写获取Linux基本系统信息(三):Python与数据库编程,把获取的信息存入数据库...
  3. Django的学习(六)————templates过滤器、Django shell、admin
  4. ubuntu服务器上提示 To run a command as administrator (user “root“), use “sudo <command>“. See “ 解决方案
  5. Haproxy负载均衡详解,与keepalived的搭配
  6. 200行Python实现连连看辅助
  7. 2019年高中数学圆锥曲线解题技巧方法总结及高考试题
  8. MQL4课程-交易函数平仓及修改止损止盈
  9. 多台路由器连接,实现全网可达
  10. 多个日期时间段进行合并计算时长,剔除重叠时间段
  11. 到底什么是牛逼?什么是傻逼?什么又是装逼?NB,SB,ZB
  12. [SAP] PP模块 - BOM ( Bill of Material)
  13. Java、JSP网上问卷调查系统
  14. c语言 malloc 函数用法
  15. 淘宝助理导出CSV文件特殊字段详解
  16. activiti报错 cvc-datatype-valid.1.2.1: ‘‘ 不是 ‘NCName‘ 的有效值。
  17. 构建规则格网进行体积计算
  18. PCL最小二乘法拟合平面
  19. 圆头像 微信小程序 绘图_[微信小程序]授权头像修改圆形
  20. 前端控制屏幕双屏显示 pos副屏 副屏方案

热门文章

  1. 商业分析_第五篇 目标群体指数TGI
  2. Codeforces 1296D Fight with Monsters
  3. B bit 比特 字节 单位换算 bps Bps Mbps MBps 网络带宽bps Bps
  4. [计算机组成原理]数据校验的基本原理
  5. Three.js 使用UV贴图制作地面
  6. 从Cell学单细胞转录组分析(一):开端
  7. Eureka开启密码认证
  8. 【C语言指针】一些易混淆的定义
  9. 计算机的机械硬盘,高端电脑配置为什么还会卡?机械硬盘惹的祸!
  10. 【OTFS与信号处理:论文阅读4】OTFS时延多普勒域嵌入导频辅助信道估计