声明:刚刚接触qt开发,觉得qt真的很强大,也正是因为它的强大,所以在这条路上还有很远很远的路要走,希望大家多多指教,多多交流共同进步。另外由于本人不是系统的从头开始学qt,主要是在实战需求中来实现功能,所以博文更偏向于功能模块的实现。

先看一张效果图(界面简陋请自动忽略):

主要基于avilib这个开源的录屏源码,利用 Qt编写来实现录屏操作。

以下是代码文件的结构:

这里.pro文件中调用的user32.lib这个动态库是windows下面自带的动态库文件,不用去网上下载了,在自己电脑C盘里搜索一下就可以找到的,我的工程中已经直接放到里面了,不需要自己找了。

head.cpp中是三个C接口实现的方法,分别是录屏相机的初始化、开始和停止。

head.cpp:

#include "head.h"
#include "windows.h"
#include "mywin.h"
#include <QDebug>
MyWin*       g_myWin       = NULL;
std::wstring g_processName = L"ScreenRecord";
std::wstring g_parentName  = L"ScreenRecord";
std::string  g_pathName    = "ScreenRecord";
int          g_fps         = 10;
bool         isStarted     = NULL;
int CameraInit()
{if (!g_myWin){g_myWin = new MyWin(g_processName, g_parentName, g_pathName, g_fps);}return 1;
}
int CameraStart()
{if (!isStarted){if (g_myWin){g_myWin->Start();isStarted = true;return 1;}}return 0;
}
int CameraStop()
{if (isStarted){if (g_myWin){g_myWin->Stop();g_myWin = NULL;isStarted = false;return 1;}}return 0;
}

mywin.cpp中主要是初始化一些参数,像保存视频文件的路径以及录屏窗口的大小,这里的窗口大小主要是根据屏幕分辨率来设置的。从Timer()中就可以知道,其实录制视频本质上就是抓取窗口一张张的照片,按顺序保存起来,经过算法的压缩转换成.avi格式的视频。至于这个转换的算法,怕脑子不够用,我没有去研究。。。

mywin.cpp

#include "mywin.h"
#include <QApplication>
#include <QScreen>
#include <QDesktopWidget>
#include <QBuffer>
#include <QFile>
#include <QDebug>
#include <windows.h>
#include <QDateTime>
MyWin::MyWin(std::wstring _processName, std::wstring _parentName, std::string _pathName, int _fps)
{m_processName = _processName;m_parentName  = _parentName;m_pathName    = _pathName;m_fps         = _fps;m_timer       = new QTimer;m_hwnd        = 0;connect(m_timer, SIGNAL(timeout()), this, SLOT(Timer()));
}
MyWin::~MyWin()
{if (m_avi){AVI_close(m_avi);}
}
void MyWin::Start()
{//get window handle.m_hwnd = FindWindow(NULL, m_processName.c_str());//use system time and file name to creat file.m_pathName = "./" + m_pathName + " " + QDateTime::currentDateTime().toString("yyyy-MM-dd hh-mm-ss").toStdString() + ".avi";m_avi = AVI_open_output_file(const_cast<char*>(m_pathName.c_str()));//adjust the screenshot size.RECT rect;::GetWindowRect(m_hwnd, &rect);AVI_set_video(m_avi, rect.right - rect.left, rect.bottom - rect.top, m_fps, "mjpg");//screenshot 1000/m_fps times per second.m_timer->start(1000 / m_fps);
}
void MyWin::Stop()
{m_timer->stop();AVI_close(m_avi);
}
void MyWin::Timer()
{//get window wid.QScreen *screen = QApplication::primaryScreen();QPixmap map     = screen->grabWindow(WId(m_hwnd));//begin screenshot.QByteArray ba;QBuffer    bf(&ba);if (!map.save(&bf, "jpg")){exit(0);}//write in file.AVI_write_frame(m_avi, ba.data(), ba.size(), 1);
}

写的不好请多多指教,有什么问题希望大家多多提出来共同交流共同进步。

源工程代码下载链接:https://download.csdn.net/download/qq_37179269/10342020

Qt实现avi格式录制视频相关推荐

  1. AVI音视频封装格式学习(四)——linux系统C语言AVI格式音视频封装应用

    拖了很久的AVI音视频封装实例,花了一天时间终于调完了,兼容性不是太好,但作为参考学习使用应该没有问题.RIFF和AVI以及WAV格式,可以参考前面的一些文章.这里详细介绍将一个H264视频流和一个2 ...

  2. 如何使用JiaoZiVideoPlayer(饺子视频播放器)播放avi格式的视频

    如何使用JiaoZiVideoPlayer(饺子视频播放器)播放avi等原生不支持的格式的视频 1.为什么使用JiaoZiVideoPlayer播放AVI格式的视频 有的同学可能会发现,部分.avi文 ...

  3. IjkVideoView播放视频(支持avi格式的视频)

    上一篇   Ijkplayer播放视频(支持AVI格式的视频) 讲了,Ijkplayer和SurfaceView结合,播放视频.这一篇我们把Ijkpayer和SurfaceView进行封装,封装成Ij ...

  4. 如何将AVI格式的视频转换为MP4?用嗨格式试试看

    如何将AVI格式的视频转换为MP4?MP4是目前最为常见且兼容性好的视频格式之一,但有时候遇到的视频格式是AVI的,怎么才能将其转换器MP4格式呢?下面就给你分享一个好用的方法. 首先在电脑上下载并运 ...

  5. MATLAB实现将图片转化为avi格式的视频

    MATLAB实现将图片转化为avi格式的视频   视频就是将一系列连续的图片进行播放的效果.所以将图片转换为AVI格式的视频就是将一系列连续的图片保存到AVI格式的文件中. 转换的通用格式: %% 保 ...

  6. 怎么把avi格式的视频转换成gif动态图

    随着gif动态图越来越火爆,制作gif动态图的小伙伴也越来越多,在制作gif时我们经常会在互联网下载视频作为制作素材,而下载的诸多视频格式中avi格式作为流行的视频格式被大量下载.那怎么用迅捷视频转换 ...

  7. android flv格式的视频文件,android-如何运行mkv,flv,avi格式的视频文件?

    我正在制作一个项目,使用使用videoview的简单代码,我可以播放3gp amd mp4格式的视频文件 vv = (VideoView) findViewById(R.id.videoView); ...

  8. html embed页面无法播放视频播放,用embed标签在网页中嵌入avi格式的视频不能播放...

    制作HTML网页插入视频Mp 4格式可以播放,AVI格式不可以播放的原因是因为引入的参数错误,如下正确的使用方式: objecthttp://activex.microsoft.com/activex ...

  9. 截取AVI格式的视频C语言代码

    首先在阅读本代码之前百度一下avi,虽然经过我验证上面有部分错误,但是不影响阅读.因为有些变量的注释我没有写,所以请读者自行搜索吧.下面是c语言文件,编译之后能够直接运行,用来截取开始时间(单位s)后 ...

最新文章

  1. 「模型解读」“不正经”的卷积神经网络
  2. 如何优雅的使用 phpStorm 开发工具
  3. 零基础学JAVA]Java SE基础部分-01. Java发展及JDK配置
  4. 【EventBus】发布-订阅模式 ( Android 中使用 发布-订阅模式 进行通信 )
  5. 我的世界有宠物系统的服务器,我的世界1.6.4宠物战争服务器客户端
  6. 全球最大多人在线创作游戏Roblox暂时关闭 官方称将尽快恢复运行
  7. 神经网络的 Delta 学习规则(learning rule)
  8. 算法 python_最全 Python 算法实现资源汇总!
  9. Lottie动画测试工具
  10. Android各控件绚丽Dome下载
  11. 鸿蒙大陆v2.8正式版,鸿蒙大陆正式版地图下载-鸿蒙大陆下载 V2.22--pc6下载站
  12. 7.计算机系统包括,windows7分几个版本_windows7有哪些版本
  13. 厦门大学计算机专业录取分数线2019,厦门大学录取分数线2019年各省及各专业分数线...
  14. 直播间实时在线人数方案
  15. 计算机网速单位是什么,计算机存储单位和网络网速单位
  16. 【Ubuntu18.04】实现redis+lua+nginx动态黑名单封禁
  17. Java 和 MySQL 数据类型对照表
  18. 我以过来人的身份告诉你手工测试人员如何转测试开发?
  19. 源码分析 RocketMQ DLedger 多副本存储实现,泛微网络java面试题
  20. 文献阅读笔记:Homogeneous ice nucleation in an ab initio machine-learning model of water

热门文章

  1. 小汪的vue学习笔记
  2. 【自动驾驶模拟器AirSim快速入门 | 04】推理预测及模拟器运行
  3. rustwasmyew前端开发教程
  4. 收藏:中国FPGA芯片技术解析
  5. Excel 2010 VBA 入门 007 创建和使用数字证书签名
  6. 博通被阻收购高通:项庄舞剑意在哪
  7. JDBC:JAVA连接Mysql实现增删改查
  8. [ 新出漏洞篇 ] 核弹级漏洞 Log4j2 RCE 漏洞爆出,开发圈苦逼,安全圈过年,你赶上了吗 ?(外行都能看懂的漏洞分析)
  9. 少儿学编程系列---使用递归画雪花
  10. Google搜索为什么不能无限分页?