TVideoCapture类的源码,继承TCustomPanel,用于视频捕获(用到了SendMessage和SetWindowPos等API)good
- unit VideoCapture;
- interface
- uses
- Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
- Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.Imaging.jpeg;
- type
- TVideoCapture = class(TCustomPanel)
- private
- hWndC: THandle;
- CapturingAVI: bool;
- procedure WMSize(var Message: TWMSize); message WM_SIZE;
- protected
- { Protected declarations }
- public
- constructor Create(AOwner: TComponent); override;
- destructor Destroy; override;
- procedure OpenVideo(handle: THandle);
- procedure CloseVideo;
- procedure GrabFrame;
- procedure StartVideo;
- procedure StopVideo;
- procedure SaveBitMap(filename: TFileName);
- procedure SaveJpeg(filename: TFileName; compressibility: Integer);
- procedure SavetoJpegStream(var JpegStream: TMemoryStream; compressibility: Integer);
- function StartAvi(filename: TFileName): Boolean;
- procedure StopAvi;
- procedure SetVideoFormat;
- procedure SetSource;
- procedure SetStretch(TrueorFalse: Boolean = true);
- procedure SetCompression;
- published
- property Align;
- end;
- procedure Register;
- implementation
- const
- WM_CAP_START = WM_USER;
- WM_CAP_GET_CAPSTREAMPTR = (WM_CAP_START + 1);
- WM_CAP_SET_CALLBACK_ERROR = (WM_CAP_START + 2);
- WM_CAP_SET_CALLBACK_STATUS = (WM_CAP_START + 3);
- WM_CAP_SET_CALLBACK_YIELD = (WM_CAP_START + 4);
- WM_CAP_SET_CALLBACK_FRAME = (WM_CAP_START + 5);
- WM_CAP_SET_CALLBACK_VIDEOSTREAM = (WM_CAP_START + 6);
- WM_CAP_SET_CALLBACK_WAVESTREAM = (WM_CAP_START + 7);
- WM_CAP_GET_USER_DATA = (WM_CAP_START + 8);
- WM_CAP_SET_USER_DATA = (WM_CAP_START + 9);
- WM_CAP_DRIVER_CONNECT = (WM_CAP_START + 10);
- WM_CAP_DRIVER_DISCONNECT = (WM_CAP_START + 11);
- WM_CAP_DRIVER_GET_NAME = (WM_CAP_START + 12);
- WM_CAP_DRIVER_GET_VERSION = (WM_CAP_START + 13);
- WM_CAP_DRIVER_GET_CAPS = (WM_CAP_START + 14);
- WM_CAP_FILE_SET_CAPTURE_FILE = (WM_CAP_START + 20);
- WM_CAP_FILE_GET_CAPTURE_FILE = (WM_CAP_START + 21);
- WM_CAP_FILE_ALLOCATE = (WM_CAP_START + 22);
- WM_CAP_FILE_SAVEAS = (WM_CAP_START + 23);
- WM_CAP_FILE_SET_INFOCHUNK = (WM_CAP_START + 24);
- WM_CAP_FILE_SAVEDIB = (WM_CAP_START + 25);
- WM_CAP_EDIT_COPY = (WM_CAP_START + 30);
- WM_CAP_SET_AUDIOFORMAT = (WM_CAP_START + 35);
- WM_CAP_GET_AUDIOFORMAT = (WM_CAP_START + 36);
- WM_CAP_DLG_VIDEOFORMAT = (WM_CAP_START + 41);
- WM_CAP_DLG_VIDEOSOURCE = (WM_CAP_START + 42);
- WM_CAP_DLG_VIDEODISPLAY = (WM_CAP_START + 43);
- WM_CAP_GET_VIDEOFORMAT = (WM_CAP_START + 44);
- WM_CAP_SET_VIDEOFORMAT = (WM_CAP_START + 45);
- WM_CAP_DLG_VIDEOCOMPRESSION = (WM_CAP_START + 46);
- WM_CAP_SET_PREVIEW = (WM_CAP_START + 50);
- WM_CAP_SET_OVERLAY = (WM_CAP_START + 51);
- WM_CAP_SET_PREVIEWRATE = (WM_CAP_START + 52);
- WM_CAP_SET_SCALE = (WM_CAP_START + 53);
- WM_CAP_GET_STATUS = (WM_CAP_START + 54);
- WM_CAP_SET_SCROLL = (WM_CAP_START + 55);
- WM_CAP_GRAB_FRAME = (WM_CAP_START + 60);
- WM_CAP_GRAB_FRAME_NOSTOP = (WM_CAP_START + 61);
- WM_CAP_SEQUENCE = (WM_CAP_START + 62);
- WM_CAP_SEQUENCE_NOFILE = (WM_CAP_START + 63);
- WM_CAP_SET_SEQUENCE_SETUP = (WM_CAP_START + 64);
- WM_CAP_GET_SEQUENCE_SETUP = (WM_CAP_START + 65);
- WM_CAP_SET_MCI_DEVICE = (WM_CAP_START + 66);
- WM_CAP_GET_MCI_DEVICE = (WM_CAP_START + 67);
- WM_CAP_STOP = (WM_CAP_START + 68);
- WM_CAP_ABORT = (WM_CAP_START + 69);
- WM_CAP_SINGLE_FRAME_OPEN = (WM_CAP_START + 70);
- WM_CAP_SINGLE_FRAME_CLOSE = (WM_CAP_START + 71);
- WM_CAP_SINGLE_FRAME = (WM_CAP_START + 72);
- WM_CAP_PAL_OPEN = (WM_CAP_START + 80);
- WM_CAP_PAL_SAVE = (WM_CAP_START + 81);
- WM_CAP_PAL_PASTE = (WM_CAP_START + 82);
- WM_CAP_PAL_AUTOCREATE = (WM_CAP_START + 83);
- WM_CAP_PAL_MANUALCREATE = (WM_CAP_START + 84);
- function capCreateCaptureWindowA(lpszWindowName: PCHAR;
- dwStyle: longint;
- x: integer;
- y: integer;
- nWidth: integer;
- nHeight: integer;
- ParentWin: HWND;
- nId: integer): HWND; stdcall; external 'avicap32.dll';
- procedure Register;
- begin
- RegisterComponents('FstiCtl', [TVideoCapture]);
- end;
- { TVideoCapture }
- constructor TVideoCapture.Create(AOwner: TComponent);
- begin
- inherited Create(AOwner);
- CapturingAVI := false;
- Color := clBlack;
- BevelOuter := bvNone;
- Width := 320;
- Height := 240;
- hWndC := 0;
- end;
- destructor TVideoCapture.Destroy;
- begin
- if CapturingAVI then StopAvi;
- if hWndC <> 0 then CloseVideo;
- hWndC := 0;
- inherited;
- end;
- procedure TVideoCapture.OpenVideo(handle: THandle);
- begin
- hWndC := capCreateCaptureWindowA('Video Capture Window',
- WS_CHILD or WS_VISIBLE,
- Left,
- Top,
- Width,
- Height,
- Handle,
- 0);
- if hWndC <> 0 then
- SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0);
- end;
- procedure TVideoCapture.CloseVideo;
- begin
- if hWndC <> 0 then begin
- SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);
- SendMessage(hWndC, WM_CLOSE, 0, 0);
- hWndC := 0;
- end;
- end;
- procedure TVideoCapture.GrabFrame;
- begin
- if hWndC <> 0 then
- SendMessage(hWndC, WM_CAP_GRAB_FRAME, 0, 0);
- end;
- procedure TVideoCapture.SaveBitMap(filename: TFileName);
- begin
- SendMessage(hWndC, WM_CAP_FILE_SAVEDIB, 0, longint(pchar(FileName)));
- end;
- function TVideoCapture.StartAvi(filename: TFileName): Boolean;
- begin
- if hWndC <> 0 then begin
- CapturingAVI := true;
- SendMessage(hWndC,
- WM_CAP_FILE_SET_CAPTURE_FILE,
- 0,
- Longint(pchar(FileName)));
- SendMessage(hWndC, WM_CAP_SEQUENCE, 0, 0);
- end;
- end;
- procedure TVideoCapture.StopAvi;
- begin
- if hWndC <> 0 then begin
- SendMessage(hWndC, WM_CAP_STOP, 0, 0);
- CapturingAVI := false;
- end;
- end;
- procedure TVideoCapture.SaveJpeg(filename: TFileName;
- compressibility: Integer);
- var
- bmp: TBitMap;
- jpg: TJpegimage;
- begin
- try
- SaveBitMap('tmp.bmp');
- bmp := TBitmap.Create;
- jpg := TJpegImage.Create;
- bmp.LoadFromFile('tmp.bmp');
- jpg.Assign(bmp);
- jpg.CompressionQuality := compressibility;
- jpg.Compress;
- jpg.SaveToFile(filename);
- DeleteFile('tmp.bmp');
- except
- end;
- bmp.free;
- jpg.free;
- end;
- procedure TVideoCapture.SetVideoFormat;
- begin
- SendMessage(hWndC, WM_CAP_DLG_VIDEOFORMAT, 0, 0);
- end;
- procedure TVideoCapture.SetSource;
- begin
- SendMessage(hWndC, WM_CAP_DLG_VIDEOSOURCE, 0, 0);
- end;
- procedure TVideoCapture.StartVideo;
- begin
- SendMessage(hWndC, WM_CAP_SET_PREVIEW, -1, 0);
- SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 100, 0);
- SendMessage(hWndC, WM_CAP_SET_SCALE, -1, 0);
- end;
- procedure TVideoCapture.StopVideo;
- begin
- SendMessage(hWndC, WM_CAP_SET_PREVIEW, 0, 0);
- end;
- procedure TVideoCapture.WMSize(var Message: TWMSize);
- begin
- SetWindowPos(hWndC, HWND_BOTTOM, 0, 0, Width, Height, SWP_NOMOVE or SWP_NOACTIVATE);
- end;
- procedure TVideoCapture.SetStretch(TrueorFalse: Boolean);
- begin
- end;
- procedure TVideoCapture.SetCompression;
- begin
- SendMessage(hWndC, WM_CAP_DLG_VIDEOCOMPRESSION, 0, 0)
- end;
- procedure TVideoCapture.SavetoJpegStream(var JpegStream: TMemoryStream; compressibility: Integer);
- var
- bmp: TBitMap;
- jpg: TJpegimage;
- begin
- try
- SaveBitMap('tmp.bmp');
- bmp := TBitmap.Create;
- jpg := TJpegImage.Create;
- bmp.LoadFromFile('tmp.bmp');
- jpg.Assign(bmp);
- jpg.CompressionQuality := compressibility;
- jpg.Compress;
- jpg.SaveToStream(JpegStream);
- DeleteFile('tmp.bmp');
- except
- end;
- bmp.free;
- jpg.free;
- end;
- end.
TVideoCapture类的源码,继承TCustomPanel,用于视频捕获(用到了SendMessage和SetWindowPos等API)good的更多相关文章
- 25 BasicUsageEnvironment0基本使用环境基类——Live555源码阅读(三)UsageEnvironment
25 BasicUsageEnvironment0基本使用环境基类——Live555源码阅读(三)UsageEnvironment 25 BasicUsageEnvironment0基本使用环境基类— ...
- String类——StringBuilder类的源码及内存分析(java)
相同:底层均采用字符数组value来保存字符串 区别:String类的value数组有final 修饰,指向不可改,同时private 未提供修改value数组的方法.StringBuilder类的v ...
- 24 UsageEnvironment使用环境抽象基类——Live555源码阅读(三)UsageEnvironment
24 UsageEnvironment使用环境抽象基类——Live555源码阅读(三)UsageEnvironment 24 UsageEnvironment使用环境抽象基类——Live555源码阅读 ...
- String类的源码分析
之前面试的时候被问到有没有看过String类的源码,楼主当时就慌了,回来赶紧补一课. 1.构造器(构造方法) String类提供了很多不同的构造器,分别对应了不同的字符串初始化方法,此处从源码中摘录如 ...
- 分享自己用的php分页类实例源码
分享一个我自己用着的php分页类实例源码,供大家参考,具体内容如下: <?php /** file: page.class.php 完美分页类 Page */ class Page { priv ...
- 线程池 ThreadPoolExecutor 类的源码解析
线程池 ThreadPoolExecutor 类的源码解析: 1:数据结构的分析: private final BlockingQueue<Runnable> workQueue; // ...
- 【高并发】通过ThreadPoolExecutor类的源码深度解析线程池执行任务的核心流程
核心逻辑概述 ThreadPoolExecutor是Java线程池中最核心的类之一,它能够保证线程池按照正常的业务逻辑执行任务,并通过原子方式更新线程池每个阶段的状态. ThreadPoolExecu ...
- 12 哈希表相关类——Live555源码阅读(一)基本组件类
12 哈希表相关类--Live555源码阅读(一)基本组件类 这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 本文由乌合之众 lym瞎编,欢迎转载 ...
- commoncrawl 源码库是用于 Hadoop 的自定义 InputFormat 配送实现
commoncrawl 源码库是用于 Hadoop 的自定义 InputFormat 配送实现. Common Crawl 提供一个示例程序 BasicArcFileReaderSample.java ...
随机推荐
- 使Sublime Text支持除UTF8外多种编码 - ConvertToUTF8
前几天,在使用了Sublime Text多天之后,感觉完全可以代替系统自带记事本,所以就通过其打开了一个记事本文件,但是打开之后尽然是乱码,在思考了一下之后想到记事本的编码是ANSI编码,那么这就应该 ...
- hreadPoolExecutor使用和思考(上)-线程池大小设置与BlockingQueue的三种实现区别
阅读更多 工作中多处接触到了ThreadPoolExecutor.趁着现在还算空,学习总结一下. 前记: jdk官方文档(javadoc)是学习的最好,最权威的参考. 文章分上中下.上篇中主要介绍Th ...
- 简洁常用权限系统的设计与实现(四):不维护level,用递归方式构造树
第三篇中,我们通过维护节点的深度level,通过迭代所有的节点,只需要一次,就构造了树. 本篇,换一种方式. 好处是:不维护节点的深度level,增加和修改节点时,也不用维护.递归实现,代码比较清晰 ...
- [Erlang]Mnesia分布式应用
http://blog.csdn.net/erlib/article/details/40743687 情景: 设计一个图书管理系统,需求: 1. 基本的增删查改功能; 2. 支持多节点备份(其中一个 ...
- js声明json数据,打印json数据,遍历json数据,转换json数据为数组
1.js声明json数据: 2.打印json数据: 3.遍历json数据: 4.转换json数据为数组; //声明JSON var json = {}; json.a = 1; //第一种赋值方式(仿 ...
- 【poj3690】Constellations 哈希
传送门 题目分析 考虑将大矩阵的每个1*q矩阵哈希值求出,然后让小矩阵的第一行在大矩阵中找,如果找到,并且能匹配所有行则出现过.否则没出现过. 在初始化1*q矩阵时可以进行优化:假设该行为123456 ...
- spark cogroup算子
java /** *cogroup与join算子不同的是如果rdd中的一个key,对应多个value,则返回<Iterable<key>,Iterable<value>& ...
- Apparatus, system, and method for automatically minimizing real-time task latency and maximizing non-real time task throughput
An apparatus, system, and method are provided for automatically minimizing Real-Time (RT) task laten ...
- 到底有多少种智能指针(smart pointer)
最近Qt的blog总结了到底有多少种smart pointer, 下面是一个简要的介绍: 1. QPointer :提供对指针的保护,当一个指针被删除以后,再使用不会造成野指针或者指针溢出.比如 ...
- Spring 4 MVC+Apache Tiles 3 Example
In this post we will integrate Apache Tiles 3 with Spring MVC 4, using annotation-based configuratio ...