【Qt】使用ffmpeg加载视频第一帧作为图标
环境说明
我这里使用的是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
}
流程分析
大概流程是这样的:
- 使用ffmpeg打开视频文件
- 读取视频第一帧数据
- 对视频帧进行解码,得到图片原始数据
- 对原始数据进行加工处理,转换成我们需要的图片对象
关键代码
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加载视频第一帧作为图标相关推荐
- Unity AVPro Video 加载视频第一秒图片与例子
使用AVPro Video 加载视频第一秒的图片 原理:使用AVPro Video插件的MediaPlayer mediaPlayer.OpenMedia(new MediaPath(url链接, M ...
- node ffmpeg swf转mp4 截取mp4视频第一帧为jpg图片
1.首先在电脑上安装node / ffmpeg (怎么安装百度叭 案例挺多不做介绍) 2.确认安装完成之后: //注意!!!! 方法可以直接复制,前几行这个我就是标注一下以下方法用到了这些插件 con ...
- php ffmpeg截图,php ffmpeg截取视频第一帧保存为图片的方法
php ffmpeg截取视频第一帧保存为图片的方法 $xiangmupath = $this->getxiangmupath(); $filename = 'chengshi'; $cmd = ...
- OpenCV中使用类VideoCapture加载视频和打开摄像头
先直接上示例代码,然后对代码进行讲解. #!/usr/bin/env python # -*- coding: utf-8 -*- # 图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 248 ...
- 在文件管理器中显示图片的缩略图和视频第一帧的缩略图
首先在vender/mediatek/properties/packags/apps/FileManager/src/com/mediatek/filemanager/IconManager.java ...
- 小程序获取视频第一帧
小程序获取视频第一帧 最近有个小程序项目,需要在页面中展示大量的视频,但是不用播放.后来遇到问题,小程序不可以在一个页面中放置超过5个video标签,否则播放视频加载不到. 经过度娘查询找到一篇大佬的 ...
- 前端开发如何获取视频第一帧作为封面
首先说明一下,浏览器或者手机需要支持video标签. 从H5本身来说,这里用到了video的一个属性,poster(规定视频下载时显示的图像,或者在用户点击播放按钮前显示的图像.). 然后还有一个vi ...
- uni-app 获取视频第一帧转换为图片 并展示
话不多说,直接上代码 <template><view class="content"><image v-if="demo != ''&quo ...
- vue 上传视频到腾讯云存储并获取视频第一帧
官网文档链接:https://cloud.tencent.com/document/product/436/6268 需求 项目里之前上传视频是调后端接口,接口将视频保存到服务器,然后返回视频链接. ...
最新文章
- Unet实现图像分割(三)
- linux python开发环境sql数据迁移到mysql_运用Python语言编写获取Linux基本系统信息(三):Python与数据库编程,把获取的信息存入数据库...
- Django的学习(六)————templates过滤器、Django shell、admin
- ubuntu服务器上提示 To run a command as administrator (user “root“), use “sudo <command>“. See “ 解决方案
- Haproxy负载均衡详解,与keepalived的搭配
- 200行Python实现连连看辅助
- 2019年高中数学圆锥曲线解题技巧方法总结及高考试题
- MQL4课程-交易函数平仓及修改止损止盈
- 多台路由器连接,实现全网可达
- 多个日期时间段进行合并计算时长,剔除重叠时间段
- 到底什么是牛逼?什么是傻逼?什么又是装逼?NB,SB,ZB
- [SAP] PP模块 - BOM ( Bill of Material)
- Java、JSP网上问卷调查系统
- c语言 malloc 函数用法
- 淘宝助理导出CSV文件特殊字段详解
- activiti报错 cvc-datatype-valid.1.2.1: ‘‘ 不是 ‘NCName‘ 的有效值。
- 构建规则格网进行体积计算
- PCL最小二乘法拟合平面
- 圆头像 微信小程序 绘图_[微信小程序]授权头像修改圆形
- 前端控制屏幕双屏显示 pos副屏 副屏方案
热门文章
- 商业分析_第五篇 目标群体指数TGI
- Codeforces 1296D Fight with Monsters
- B bit 比特 字节 单位换算 bps Bps Mbps MBps 网络带宽bps Bps
- [计算机组成原理]数据校验的基本原理
- Three.js 使用UV贴图制作地面
- 从Cell学单细胞转录组分析(一):开端
- Eureka开启密码认证
- 【C语言指针】一些易混淆的定义
- 计算机的机械硬盘,高端电脑配置为什么还会卡?机械硬盘惹的祸!
- 【OTFS与信号处理:论文阅读4】OTFS时延多普勒域嵌入导频辅助信道估计