Qt实现avi格式录制视频
声明:刚刚接触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格式录制视频相关推荐
- AVI音视频封装格式学习(四)——linux系统C语言AVI格式音视频封装应用
拖了很久的AVI音视频封装实例,花了一天时间终于调完了,兼容性不是太好,但作为参考学习使用应该没有问题.RIFF和AVI以及WAV格式,可以参考前面的一些文章.这里详细介绍将一个H264视频流和一个2 ...
- 如何使用JiaoZiVideoPlayer(饺子视频播放器)播放avi格式的视频
如何使用JiaoZiVideoPlayer(饺子视频播放器)播放avi等原生不支持的格式的视频 1.为什么使用JiaoZiVideoPlayer播放AVI格式的视频 有的同学可能会发现,部分.avi文 ...
- IjkVideoView播放视频(支持avi格式的视频)
上一篇 Ijkplayer播放视频(支持AVI格式的视频) 讲了,Ijkplayer和SurfaceView结合,播放视频.这一篇我们把Ijkpayer和SurfaceView进行封装,封装成Ij ...
- 如何将AVI格式的视频转换为MP4?用嗨格式试试看
如何将AVI格式的视频转换为MP4?MP4是目前最为常见且兼容性好的视频格式之一,但有时候遇到的视频格式是AVI的,怎么才能将其转换器MP4格式呢?下面就给你分享一个好用的方法. 首先在电脑上下载并运 ...
- MATLAB实现将图片转化为avi格式的视频
MATLAB实现将图片转化为avi格式的视频 视频就是将一系列连续的图片进行播放的效果.所以将图片转换为AVI格式的视频就是将一系列连续的图片保存到AVI格式的文件中. 转换的通用格式: %% 保 ...
- 怎么把avi格式的视频转换成gif动态图
随着gif动态图越来越火爆,制作gif动态图的小伙伴也越来越多,在制作gif时我们经常会在互联网下载视频作为制作素材,而下载的诸多视频格式中avi格式作为流行的视频格式被大量下载.那怎么用迅捷视频转换 ...
- android flv格式的视频文件,android-如何运行mkv,flv,avi格式的视频文件?
我正在制作一个项目,使用使用videoview的简单代码,我可以播放3gp amd mp4格式的视频文件 vv = (VideoView) findViewById(R.id.videoView); ...
- html embed页面无法播放视频播放,用embed标签在网页中嵌入avi格式的视频不能播放...
制作HTML网页插入视频Mp 4格式可以播放,AVI格式不可以播放的原因是因为引入的参数错误,如下正确的使用方式: objecthttp://activex.microsoft.com/activex ...
- 截取AVI格式的视频C语言代码
首先在阅读本代码之前百度一下avi,虽然经过我验证上面有部分错误,但是不影响阅读.因为有些变量的注释我没有写,所以请读者自行搜索吧.下面是c语言文件,编译之后能够直接运行,用来截取开始时间(单位s)后 ...
最新文章
- 「模型解读」“不正经”的卷积神经网络
- 如何优雅的使用 phpStorm 开发工具
- 零基础学JAVA]Java SE基础部分-01. Java发展及JDK配置
- 【EventBus】发布-订阅模式 ( Android 中使用 发布-订阅模式 进行通信 )
- 我的世界有宠物系统的服务器,我的世界1.6.4宠物战争服务器客户端
- 全球最大多人在线创作游戏Roblox暂时关闭 官方称将尽快恢复运行
- 神经网络的 Delta 学习规则(learning rule)
- 算法 python_最全 Python 算法实现资源汇总!
- Lottie动画测试工具
- Android各控件绚丽Dome下载
- 鸿蒙大陆v2.8正式版,鸿蒙大陆正式版地图下载-鸿蒙大陆下载 V2.22--pc6下载站
- 7.计算机系统包括,windows7分几个版本_windows7有哪些版本
- 厦门大学计算机专业录取分数线2019,厦门大学录取分数线2019年各省及各专业分数线...
- 直播间实时在线人数方案
- 计算机网速单位是什么,计算机存储单位和网络网速单位
- 【Ubuntu18.04】实现redis+lua+nginx动态黑名单封禁
- Java 和 MySQL 数据类型对照表
- 我以过来人的身份告诉你手工测试人员如何转测试开发?
- 源码分析 RocketMQ DLedger 多副本存储实现,泛微网络java面试题
- 文献阅读笔记:Homogeneous ice nucleation in an ab initio machine-learning model of water