avi录屏

转载 2007年09月29日 09:35:00

软件开发的共享空间

电脑报远程教育中心 唐明理

  笔者染指程序多年,与朋友交流编程心得、在网上漫游搜寻编程资料、品味别人的共享模块,确实收益匪浅。事实上共享软件不仅仅存在于软件的应用阶段,在软件的开发研制中我们早已感到了共享给软件开发带来的好处。

  微软的Windows中给我们开放了成千上万个功能函数、VC的MFC中的类库可以让我们在程序中轻松实现不少的功能;还有在网上你可以找到更多的第三方资源,控件、DLL、类库和有关编程的好文章等等。虽然有些控件、DLL也需要少量的注册费,但人们还是乐意接收它,毕竟少量的钱可以加快自己的项目开发进度。

  笔者在这里给出一个基于VC-MFC的DLL库和使用方法,同时杜撰一些使用这个DLL的编程思路。可能并没有多高的技术含量,也算给新学编程的朋友们一个示范。这个DLL作为共享资源,不含任何标志,欢迎大家使用。

一、DDL的功能:

  一个基于VC-MFC的DLL库 AVIDIB.DLL。内含以下功能函数:

A、位图存取:
1.LPBITMAPINFOHEADER LoadBmp(CString fileName);
//调BMP图形文件:输入文件名,返回图像数据区指针
2.LPBITMAPINFOHEADER LoadTml(CString fileName);
//调自定义压缩图形文件:输入文件名,返回图像数据区指针
3.void SaveBmp(CString fileName,LPBITMAPINFOHEADER bi1);
//存贮BMP图形文件:输入:1文件名,2图像数据区指针
4.void SaveTml(CString fileName, LPBITMAPINFOHEADER bi1,
unsigned long mmio,);
//存贮自定义压缩位图文件:输入: 1存贮文件名,2图像数据区指针,3压缩格式

B、屏幕拷贝
1.LPBITMAPINFOHEADER CopyScreen();
//屏幕拷贝,返回图像数据区指针

C、将DIB位图序列存为AVI:
1.void AviFileOpen(LPCTSTR fileName,int Width,int Height ,
int ColorBits,int fps,unsigned long mmio);
//建立AVI文件:输入:1文件名,2图像宽,3图像高,4颜色深度,5回放速度每秒帧数,6压缩格式 (注:压缩格式为mmioFOURCC('t', 's', 'c', 'c')四字节表达式,mmio=0时为选择方式。)
2.BOOL AddFrame(DWORD mFrame,UCHAR *DataBuffer);
//向AVI中加入帧:输入1序号,2图像数据区指针
3.void AviFileClose();
//关闭建立的AVI文件
D、取AVI中的图:
1. int AviOpen(CString fileName);
//打开AVI文件,返回AVI中的帧数
2. LPBITMAPINFOHEADER AviRead(int mFrame)
//取AVI文件的M帧,返回图像数据区指针
3. void AviExit(); //关闭取图AVI

二、应用思路:
  有点编程经历的人已经看出这个DLL库的用途了。它可以做什么?下面笔者提出一些思路供大家参考。
  1、可以进行屏幕拷贝,并以BMP位图方式保存,还可以用一些压缩方式保存(800*600的一幅16位色位图,选用适当的压缩格式,可以压缩到只有10多K),当然从DLL中看到,还可以直接将屏幕拷贝的图形以AVI文件保存(也可以是压缩的AVI)。这就是现在市面上共享抓图软件的基本功能。微软曾经有一个叫作Microsoft Camcorder的屏幕拷贝程序,它的屏幕拷贝结果是一种特殊压缩格式的AVI,很小。用这个DLL做出来的效果可以和它相当。
  2、可以在现有的AVI文件中取出任意帧作为BMP(或压缩)文件保存;也可以将一序列的BMP文件生成AVI文件。当然还可以选择AVI的压缩方式。例如可以生成现在大家熟悉的高压缩比的MPG4格式的AVI文件。有了这些主要功能,不是可以做一个AVI文件编辑器了?如果你有兴趣,你可以做一个将数码图像组成AVI的家庭版软件。
  3、现在有的的教学软件将屏幕的操作过程抓下来进行回放,但在AVI的画面上叠加文字说明是一件麻烦的事情。用这个DLL的AVI单帧取图的方法在AVI的回放中加文字说明就是一个简单的事情了。
  4、有不少版本和格式的图形资料阅读工具深受人们的欢迎。你可以做一个播放屏幕操作过程的阅读工具,配以各种计算机认证考试的资料,只要你能有几篇做得好的教学辅导资料,相信这个阅读工具是会被人们接收的。

  当然只要动脑筋,这个DLL提供的功能一定可以做很多事的(悄悄话:一个朋友看到这里后说,他想搞一个后台屏幕监视软件,但一直嫌存贮量太大。现在可解决问题了。用一种专为屏幕拷贝图形压缩的TSCC压缩格式做的AVI文件;800*600的屏幕每秒存1帧,一分钟才450Kb ,一小时27000Kb。一秒钟就记录别人一下屏幕情况,还有什么看不到的?)。

  好,有了项目构思,有了关键模块。你可以试着策划你的项目了,别忘了一点,东西要做出来别人喜欢用,才有效益可言。

三、用法简介:

  下面介绍这个DLL的简单用法。黑体字部分是要在你的源程序中加入的。注:这个DLL只能在VC中使用(VB、Delphi中使用的版本容以后提供)。
用VC建立一个对话框模式的工程,例如工程名为Test。将笔者提供的三个文件avidib.dll、avidib.lib和avifile.h拷贝到你的工程目录下。
1.在Test的头文件CtestDlg.h中加入
#include "AviFile.h" //DLL的头文件引用
#pragma comment(lib," avidib.lib") //DLL的连接库引用
再加入公有类数据成员。
public:
CAviFile m_avi; //定义DLL的引用指针
2.在CtestDlg.cpp中加入一段自定义的显示函数
LPBITMAPINFOHEADER buf; //定义全局的图形指针变量
void CTestDlg::xianshi()
{ CClientDC dc(this);
if (buf==NULL) {return;} //没有图形返回
HDRAWDIB hdd = DrawDibOpen(); //打开DrawDib
if(!hdd) return; //失败返回
DrawDibDraw(hdd,dc.m_hDC,10,10,
buf->biWidth, buf->biHeight,
buf,NULL,0,0, buf->biWidth, buf->biHeight,0);
//在当前窗口的x=10,y=10处显示图形
DrawDibClose(hdd); //关闭DrawDib
}
不要忘记在头文件中定义这个函数。
下面我们就可以使用DLL库中的功能函数了。

A、屏幕拷贝:
1)拷贝一屏在当前目录下存为BMP文件
buf =m_avi.CopyScreen(); //拷贝一帧
m_avi.SaveBmp("test.bmp", buf); //存为BMP文件
2)拷贝一屏在当前目录下存为压缩图形文件
bi1=m_avi.CopyScreen();
m_avi.SaveTml("test.tml", buf, //拷贝一帧
mmioFOURCC('d', 'i', 'v', '3'));
//存为mpg4格式压缩文件
注1:在Windows目录下的system.ini文件[drivers32]项中可以看到你的系统已安装的各种视频压缩格式的四字节描述方法。这里选用的压缩格式是mpg4。
VIDC.MRLE=msrle32.dll //这是微软的8位色压缩
vidc.MSVC=msvidc32.dll //这是微软的16位色以上的压缩
vidc.DIV3=DIVXc32.dll //这就是常见的mpg4
vidc.DIV4=DIVXc32f.dll //用于快速画面的mpg4
VIDC.MJPG=Pvmjpg20.dll //这是一个jpg的压缩
VIDC.I263=C:/WINDOWS/SYSTEM/i263_32.drv
………
注2:压缩图形文件为笔者自定义的格式,文件后缀必为tml.
3)一秒钟拷贝一屏,连续拷贝20屏,存为mpg4格式的AVI文件
bi1=m_avi.CopyScreen();//先拷贝一帧,取得当前屏幕的数据
m_avi.AviFileOpen("test.avi", //在当前目录建立AVI文件
buf ->biWidth, //图宽
buf ->biHeight, //图高
buf ->biBitCount,//图色
1, //帧/秒
mmioFOURCC('d', 'i', 'v', '3'));
for(int i=0;i<20;i++) //循环20次
{ buf =m_avi.CopyScreen();//抓屏,返回图形指针
UCHAR *tmp;
tmp=(UCHAR *) buf +40; //数据前移40字节
m_avi.AddFrame(j,tmp); //将本帧图形加入AVI
Sleep(1000); //延时1秒
}
m_avi.AviFileClose(); //完毕,关闭新建的AVI
B、调入文件显示:
1) 调入压缩图形并显示
buf =m_avi.LoadTml("test.tml");//在当前目录调入压缩文件,
//返回图形指针
xianshi(); //调自己定义显示
2)调入AVI文件并显示
int len0=m_avi.AviOpen("test.avi");//在当前目录打开AVI
//文件,返回帧数
for(int i=0;i<len0;i++)
{ buf= m_avi.AviRead(i); //读取一帧
xianshi(); //显示
}
m_avi.AviExit(); //完毕,关闭

注:无论压缩与否的图形和取出的AVI图形,返回的图形数据是解压的与设备无关的DIB图形格式,你也可以用其它的方式在窗口上显示这些图形。

四、获取本文的相关资料:

  本文的三个文件:avidib.dll、avidib.lib、avifile.h
  欢迎大家下载:图形存贮.zip
  欢迎交流,作者信箱:tml@cpcw.com

 

利用ffmpeg压缩屏幕图像为avi(录屏、压制)

看了雷神关于ffmpeg方面的文章,结合自己最近做的一个基与cdc抓屏、vfw压制的录屏工具,就想改为采用ffmpeg来压制avi。 关于如何用ffmpeg压制视频相信大家都有一些见解,这里写这篇文章...
  • dancing_night
  • dancing_night
  • 2015年01月24日 16:01
  • 2772

录屏软件如何录制屏幕上媒体播放器等软件播放的视频

共享一个技巧:录屏软件如何录制屏幕上媒体播放器等软件播放的视频。问题:录屏软件录制屏幕上媒体播放器等软件播放的视频时,出现黑屏。解决方法:把显示属性——设置——高级——疑难解答,里面的硬件加速关闭,就...
  • afei_001
  • afei_001
  • 2006年11月20日 11:55
  • 10494

Unity录屏实现(一)

几天前下载到一个安卓工程,可以把图片合成视频,突然想开坑做一个Unity录屏功能,然后就开始了。 Android代码: package cn.net.xuefei.unityrec; impor...
  • AWNUXCVBN
  • AWNUXCVBN
  • 2016年06月17日 00:47
  • 6745

使用ffmpeg录制屏幕

测试了下使用ffmpeg录制屏幕,很好用。
  • foruok
  • foruok
  • 2017年02月27日 11:11
  • 2514

C/C++系列之如何实现一个avi格式的播放器

1. 首先我们要封装自己的播放dll文件     2. 封装功能即查找文件路径,和播放等等的功能    3. 我使用的是抽象基类    下面是代码     #ifndef _YSDVIDEOI...
  • u014660247
  • u014660247
  • 2016年04月18日 02:53
  • 283

Linux下使用RecordMyDesktop进行屏幕录像

近期我们在评估给用户提供视频教程的可能性,以此来展示某些用视频才能更好表达的教程。在挖掘这个问题的时候,我们发现极丰富的可用于屏幕录像的工具。这些程序大体上特性的区别有:视频质量,性能,兼容性。这在此...
  • dancewjz
  • dancewjz
  • 2014年12月17日 00:01
  • 1463

H264 数据avi文件封装和拆解

为了提高H264的保存效率,抛弃了FFmpeg库的avi封装,直接才源码的方式封装avi文件,源码来源于网络,经改造回馈网络。废话不多说,直接上干货。...
  • zhujinghao09
  • zhujinghao09
  • 2015年03月19日 15:27
  • 3940

ffmpeg制作屏幕录像(一)

原文链接(http://www.dranger.com/ffmpeg/)指导1:制作屏幕录像 源代码:tutorial01.c 概要 电影文件有很多基本的组成部分。首先,文件本身被称为容器Con...
  • zx3517288
  • zx3517288
  • 2016年06月25日 21:08
  • 1403

测试能用的上的录屏软件 不喜勿喷

推荐几款屏幕录制软件和网站   屏幕录像大师  可以翻录课程 https://www.apowersoft.cn/      录屏王   听着名字就不错,编辑视频需配合Apowersoft Video...
  • qq_15000281
  • qq_15000281
  • 2017年03月07日 15:06
  • 733

录屏无声音的终极解决办法(备忘)

所有的电脑录屏软件要实现录制屏幕和内部声音(麦克风接收的仅是外部的声音),必须要使用声卡的混音设备,如果声卡驱动更新依然找不到录音中的混音设备,或许只能考虑安装虚拟声卡来实现声音内录了。     ...
  • cuoban
  • cuoban
  • 2016年01月21日 09:04
  • 2751
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:avi录屏
举报原因:
原因补充:

(最多只允许输入30个字)