若该文为原创文章,未经允许不得转载
原博主博客地址:https://blog.csdn.net/qq21497936
原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/108416332
红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)

Qt开发专栏:项目实战(点击传送门)

Qt开发专栏:三方库开发技术

需求

  打开检测摄像头工具,包括分辨率和帧率。

Demo

  

  

体验下载地址

  CSDN:https://download.csdn.net/download/qq21497936/12815691
  QQ群:1047134658(点击“文件”搜索“ffmpegCameraTool”,群内与博文同步更新)

涉及其他技术

  QCameraInfo打开摄像头偶尔拿不到摄像头;
  QCamera动态切换分辨率会导致崩溃;
  QCamera处理高分辨率存在卡顿问题;
  OpenCV无法拿取摄像头;
  OpenCV设置高分辨率存在帧率跟不上,卡顿问题;
  OpenCV保存高分辨率视频需要修改源码,否则限制mat上限大小为0xFFFF;
  OpenCV保存高分辨率修改源码后存储视频会导致通道混乱,需要手动矫正颜色通道。

相关博客

  《项目实战:Qt+Ffmpeg+OpenCV相机程序(打开摄像头、支持多种摄像头、分辨率调整、翻转、旋转、亮度调整、拍照、录像、回放图片、回放录像)》
  《项目实战:Qt+ffmpeg摄像头检测工具》
  《项目实战:使用OpenCV库操作摄像头拍照、调节参数和视频录制》
  《项目实战:使用OpenCV库的视频播放器(支持播放器操作,如暂停、恢复、停止、时间、进度条拽托等)》
  《OpenCV开发专栏》
  《OpenCV开发笔记(四):OpenCV图片和视频数据的读取与存储》
  《OpenCV开发笔记(五):OpenCV读取与操作摄像头》

  《FFmpeg开发笔记(一):ffmpeg介绍、windows开发环境搭建(mingw和msvc)》

v1.0.0功能

  • 程序启动打开计算机默认第一个摄像头,最高分辨率最高帧率打开;
  • 支持动态切换分辨率和帧率;
  • 支持原图显示,等比例显示;
  • 多个设备终端测试可用;

本文章博客地址:https://blog.csdn.net/qq21497936/article/details/108416332

核心代码

FfmpegCameraManager.h

#ifndef FFMPEGCAMERAMANAGER_H
#define FFMPEGCAMERAMANAGER_H/************************************************************\* 控件名称: FfmpegCameraManager, ffmpeg管理类(用于摄像头操作)* 控件描述:*          1.打开摄像头*          2.支持动态切换分辨率* 作者:红模仿    联系方式:QQ21497936* 博客地址:https://blog.csdn.net/qq21497936*       日期                版本               描述*    2018年09年14日     v1.0.0         ffmpeg模块封装空类*    2020年09年05日     v1.1.0         ffmpeg打开摄像头,支持的动态分辨率切换
\************************************************************/#include <QObject>
#include <QString>
#include <QDebug>
#include <QTimer>
#include <QThread>
#include <QImage>
#include <QProcess>
#include <QMessageBox>extern "C" {#include "libavcodec/avcodec.h"#include "libavformat/avformat.h"#include "libswscale/swscale.h"#include "libavdevice/avdevice.h"#include "libavformat/version.h"#include "libavutil/time.h"#include "libavutil/mathematics.h"#include "libavformat/avformat.h"#include "libswscale/swscale.h"#include "libswresample/swresample.h"#include "errno.h"#include "error.h"
}#define LOG qDebug()<<__FILE__<<__LINE__class FfmpegCameraManager : public QObject
{Q_OBJECT
public:public:explicit FfmpegCameraManager(QObject *parent = nullptr);signals:void signal_captureOneFrame(QImage image);public:static QString getAvcodecConfiguration();public:bool init();bool openUsbCamera();QString getUsbCameraName();QList<QString> getUsbCameraInfo();public slots:void slot_start();void slot_stop();void slot_setSizeFps(int index);protected slots:void slot_captureOneFrame();signals:public slots:private:static bool _init;AVFormatContext *_pAVFormatContext;         // 全局上下文AVInputFormat *_pAVInputFormat;AVDictionary* _pAVDictionary;               // 打开编码器的配置AVCodecContext *_pAVCodecContextForAudio;   // 音频解码器上下文AVCodecContext *_pAVCodecContextForVideo;   // 视频解码器上下文(不带音频)AVCodec * _pAVCodecForAudio;                // 音频解码器AVCodec * _pAVCodecForVideo;                // 视频解码器(不带音频)int _streamIndexForAudio;                   // 音频流序号int _streamIndexForVideo;                   // 视频流序号SwrContext *_pSwrContextForAudio;           // 音频转换上下文bool _running;bool _first;bool _opened;uint8_t *_pOutBuffer;AVFrame * _pFrame;AVFrame * _pFrameRGB;AVPacket *_pAVPacket;SwsContext *_pSwsContext;int _videoIndex;QString _cameraDescription;QList<QSize> _listSize;QList<int> _listFps;QList<QString> _listSizeFpsInfo;int _currentSuzeFpsIndex;
};#endif // FfmpegCameraManager_H

FfmpegCameraManager.cpp

...
void FfmpegCameraManager::slot_captureOneFrame()
{if(_first){// 读取一个媒体文件的数据包以获取流信息if(avformat_find_stream_info(_pAVFormatContext, NULL) < 0){LOG << "Couldn't find stream information";}else{LOG << "Success find stream information";}// 循环查找数据包包含的流信息,直到找到视频类型的流//  便将其记录下来 保存到videoStream变量中_videoIndex = -1;for(int index = 0; index < _pAVFormatContext->nb_streams; index++){if(_pAVFormatContext->streams[index]->codec->codec_type == AVMEDIA_TYPE_VIDEO){_videoIndex = index;break;}}if(_videoIndex == -1){LOG << "Couldn't find a video stream";}else{LOG << "Success find a video stream";}_pAVCodecContextForVideo = _pAVFormatContext->streams[_videoIndex]->codec;_pAVCodecForVideo = avcodec_find_decoder(_pAVCodecContextForVideo->codec_id);//软编码
//       _pAVCodecForVideo = avcodec_find_encoder(AV_CODEC_ID_H264);//硬编码
//       _pAVCodecForVideo = avcodec_find_encoder_by_name("nvenc_h264");if(_pAVCodecForVideo == NULL){qDebug() << ("Codec not found.\n");}else{qDebug() << "Codec found Successfuly!\n";}if(avcodec_open2(_pAVCodecContextForVideo, _pAVCodecForVideo, NULL) < 0)//打开解码器{LOG << "Failed to  open codec";}else{LOG << "Success open codec";}//分配一个AVFrame并将其字段设置为默认值if(_pFrame == 0){_pFrame = av_frame_alloc();}if(_pFrameRGB == 0){_pFrameRGB = av_frame_alloc();}//分配和返回一个SwsContext你需要它来执行使用swsscale()的缩放/转换操作_pSwsContext = sws_getContext(_pAVCodecContextForVideo->width,_pAVCodecContextForVideo->height,_pAVCodecContextForVideo->pix_fmt,_pAVCodecContextForVideo->width,_pAVCodecContextForVideo->height,AV_PIX_FMT_RGB32,SWS_BICUBIC,NULL,NULL,NULL);int numBytes = avpicture_get_size(AV_PIX_FMT_RGB32,_pAVCodecContextForVideo->width,_pAVCodecContextForVideo->height);LOG << "numBytes:" << numBytes;_pOutBuffer = (uint8_t *) av_malloc(numBytes * sizeof(uint8_t));avpicture_fill((AVPicture *)_pFrameRGB,_pOutBuffer,AV_PIX_FMT_RGB32,_pAVCodecContextForVideo->width,_pAVCodecContextForVideo->height);//根据指定的图像参数和提供的图像数据缓冲区设置图像域int ySize = _pAVCodecContextForVideo->width * _pAVCodecContextForVideo->height;LOG;//分配一个packetif(_pAVPacket == 0){LOG;_pAVPacket = (AVPacket *)malloc(sizeof(AVPacket));//分配packet的数据av_new_packet(_pAVPacket, ySize);}else{LOG;av_free_packet(_pAVPacket);av_new_packet(_pAVPacket, ySize);LOG;}_first = false;}// 解码压缩if(av_read_frame(_pAVFormatContext, _pAVPacket) < 0){LOG << "解码失败";return;}if(_pAVPacket->stream_index == _videoIndex){int gotPicture;// 解码一帧视频数据int ret = avcodec_decode_video2(_pAVCodecContextForVideo, _pFrame, &gotPicture, _pAVPacket);if(ret < 0){LOG << "decode error";}if(gotPicture){// 缩放图像切片,并将得到的缩放切片放在pFrameRGB->data图像中sws_scale(_pSwsContext,(uint8_t const * const *)_pFrame->data,_pFrame->linesize,0,_pAVCodecContextForVideo->height,_pFrameRGB->data,_pFrameRGB->linesize);QImage tmpImg((uchar *)_pOutBuffer,_pAVCodecContextForVideo->width,_pAVCodecContextForVideo->height,QImage::Format_RGB32);QImage image = tmpImg.copy();LOG << "get a pciture";emit signal_captureOneFrame(image);QTimer::singleShot(10, this, SLOT(slot_captureOneFrame()));}}
}
...

原博主博客地址:https://blog.csdn.net/qq21497936
原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/108416332

项目实战:Qt+ffmpeg摄像头检测工具相关推荐

  1. Kaggle深度学习与卷积神经网络项目实战-猫狗分类检测数据集

    Kaggle深度学习与卷积神经网络项目实战-猫狗分类检测数据集 一.相关介绍 二.下载数据集 三.代码示例 1.导入keras库,并显示版本号 2.构建网络 3.数据预处理 4.使用数据增强 四.使用 ...

  2. 【网络通信 -- 直播】项目实战记录 -- 弱网模拟工具

    [网络通信 -- 直播]项目实战记录 -- 弱网模拟工具 [1]Windows 系统中弱网模拟工具 Windows 系统中可以使用 Clumsy 工具模拟弱网环境 Lag(延迟),把数据包缓存一段时间 ...

  3. android 摄像头检测工具,检摄app下载-检摄软件(检测摄像头)下载 v1.0.7安卓版_5577安卓网...

    检摄app推荐给大家,很多人担心在商场.酒店或是其他其他地方隐藏摄像头来偷窥自己的隐私,那怎么办?小编分享这款检摄软件给你们使用,进入房间之前开启,利用磁力传感器功能来感应周围的摄像头,一起来下载使用 ...

  4. 【项目实战】IPC摄像头在线状态ping检测与告警邮件发送项目总结

    目录 1.项目背景与需求 2.技术实现思路 3.libcurl开源库的编译 3.1.尝试使用现成的libcurl库</

  5. c++ opencv 通过网络连接工业相机_OpenCV项目实战之零件缺陷检测(上)

    导 语 在流水线上,上位机软件以一定的频率通过工业摄像机拍摄图片,然后检查图片中的零件质量,然后把零件质量用特定编码以串口通信方式发送给硬件,硬件收到信号后将有缺陷的零件过滤,以实现零件质量把控的目的 ...

  6. 唐宇迪学习笔记10:项目实战-交易数据异常检测

    目录 一.任务目标解读 信用卡欺诈检测 任务流程: 主要解决问题: 二.项目挑战与解决方案制定 1.导入我们的工具包 2.数据读取 3.数据标签分布 三.数据标准化处理 四.下采样数据集制作 五.交叉 ...

  7. kaggle项目实战——猫狗分类检测

    主要参考:<深度学习--caffe之经典模型详解与实战> kaggle数据集下载链接:https://www.kaggle.com/c/dogs-vs-cats-redux-kernels ...

  8. 正点原子imx6ull开发板视频监控项目实战系列5: 摄像头(V4L2)和声卡(ALSA)接口简介

    1.摄像头: 1).对于不同的摄像头,有不同的接口方式,eg:USB,CMOS等,但是他们都遵循同样的标准-V4L2. 所以,不同的APP可以使用同样的API访问不同硬件接口的摄像头. 2).摄像头参 ...

  9. Opencv项目实战:01 文字检测OCR(2)

    1,相关函数的讲解 image_to_data()的输出结果是表格形式,输出变量的类型依旧是字符串. 你会得到一个这样的列表['level', 'page_num', 'block_num', 'pa ...

  10. 项目实战-自动生成文档工具

    1.pom 文件 <dependency><groupId>cn.smallbun.screw</groupId><artifactId>screw-c ...

最新文章

  1. SAP WM中阶Storage Type的Capacity Check – Check based on palletization according to SUT 1
  2. go语言 rlock() defer runlock()_Go并发编程之美-读写锁
  3. 【CV秋季划】模型算法与落地很重要,如何循序渐进地学习好?
  4. python爬取主播信息
  5. 你知道socket.io中connect事件和connection事件的区别吗?
  6. 五:二叉树中和为某一直的路径
  7. IDEA、Sublime、Eclipse、VSCode 常用快捷键整合
  8. Nginx支持比Apache高并发的原因
  9. 计算机学不学工程制图,大一,马上要考试了,不想再学工程制图了?
  10. LinkedList源码阅分析
  11. 基于 jmeter 的分布式性能测试实战
  12. 【poj3375】 Network Connection
  13. Golang 任意类型切片的增删改查
  14. bzoj 4498: 魔法的碰撞(DP+组合数)
  15. 聊聊这两天刷屏的OpenAI新作,你注意到CLIP了吗
  16. 有感于Oracle 9i的QueryHints
  17. Visual Studio 2015离线版msdn下载和安装
  18. 京东架构专家分享京东架构之路
  19. 对角占优矩阵(Diagonally-dominant Matrix)
  20. Oracle官网 JDK下载 注册登录公共账号和密码

热门文章

  1. java毕业设计对外汉语教学辅助平台Mybatis+系统+数据库+调试部署
  2. wps里面函数怎么使用_在WPS表格中怎么使用函数?WPS表格中使用函数公式的教程...
  3. dsm加密linux,DSM 6.2.2最新引导修改版,支持3615xs,已更新下载链接
  4. 【AR开发】ARCore简介
  5. mapboxgl 互联网地图纠偏插件(三)
  6. JPype入门篇 -- Python调用Java代码并执行“Hello World”
  7. CMD命令提示符大全
  8. 利用CMD命令关闭进程
  9. 【知易行难】RS485组网连接示意图
  10. 软件工程在线画图工具