1. unit VideoCapture;
  2. interface
  3. uses
  4. Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  5. Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.Imaging.jpeg;
  6. type
  7. TVideoCapture = class(TCustomPanel)
  8. private
  9. hWndC: THandle;
  10. CapturingAVI: bool;
  11. procedure WMSize(var Message: TWMSize); message WM_SIZE;
  12. protected
  13. { Protected declarations }
  14. public
  15. constructor Create(AOwner: TComponent); override;
  16. destructor Destroy; override;
  17. procedure OpenVideo(handle: THandle);
  18. procedure CloseVideo;
  19. procedure GrabFrame;
  20. procedure StartVideo;
  21. procedure StopVideo;
  22. procedure SaveBitMap(filename: TFileName);
  23. procedure SaveJpeg(filename: TFileName; compressibility: Integer);
  24. procedure SavetoJpegStream(var JpegStream: TMemoryStream; compressibility: Integer);
  25. function StartAvi(filename: TFileName): Boolean;
  26. procedure StopAvi;
  27. procedure SetVideoFormat;
  28. procedure SetSource;
  29. procedure SetStretch(TrueorFalse: Boolean = true);
  30. procedure SetCompression;
  31. published
  32. property Align;
  33. end;
  34. procedure Register;
  35. implementation
  36. const
  37. WM_CAP_START = WM_USER;
  38. WM_CAP_GET_CAPSTREAMPTR = (WM_CAP_START + 1);
  39. WM_CAP_SET_CALLBACK_ERROR = (WM_CAP_START + 2);
  40. WM_CAP_SET_CALLBACK_STATUS = (WM_CAP_START + 3);
  41. WM_CAP_SET_CALLBACK_YIELD = (WM_CAP_START + 4);
  42. WM_CAP_SET_CALLBACK_FRAME = (WM_CAP_START + 5);
  43. WM_CAP_SET_CALLBACK_VIDEOSTREAM = (WM_CAP_START + 6);
  44. WM_CAP_SET_CALLBACK_WAVESTREAM = (WM_CAP_START + 7);
  45. WM_CAP_GET_USER_DATA = (WM_CAP_START + 8);
  46. WM_CAP_SET_USER_DATA = (WM_CAP_START + 9);
  47. WM_CAP_DRIVER_CONNECT = (WM_CAP_START + 10);
  48. WM_CAP_DRIVER_DISCONNECT = (WM_CAP_START + 11);
  49. WM_CAP_DRIVER_GET_NAME = (WM_CAP_START + 12);
  50. WM_CAP_DRIVER_GET_VERSION = (WM_CAP_START + 13);
  51. WM_CAP_DRIVER_GET_CAPS = (WM_CAP_START + 14);
  52. WM_CAP_FILE_SET_CAPTURE_FILE = (WM_CAP_START + 20);
  53. WM_CAP_FILE_GET_CAPTURE_FILE = (WM_CAP_START + 21);
  54. WM_CAP_FILE_ALLOCATE = (WM_CAP_START + 22);
  55. WM_CAP_FILE_SAVEAS = (WM_CAP_START + 23);
  56. WM_CAP_FILE_SET_INFOCHUNK = (WM_CAP_START + 24);
  57. WM_CAP_FILE_SAVEDIB = (WM_CAP_START + 25);
  58. WM_CAP_EDIT_COPY = (WM_CAP_START + 30);
  59. WM_CAP_SET_AUDIOFORMAT = (WM_CAP_START + 35);
  60. WM_CAP_GET_AUDIOFORMAT = (WM_CAP_START + 36);
  61. WM_CAP_DLG_VIDEOFORMAT = (WM_CAP_START + 41);
  62. WM_CAP_DLG_VIDEOSOURCE = (WM_CAP_START + 42);
  63. WM_CAP_DLG_VIDEODISPLAY = (WM_CAP_START + 43);
  64. WM_CAP_GET_VIDEOFORMAT = (WM_CAP_START + 44);
  65. WM_CAP_SET_VIDEOFORMAT = (WM_CAP_START + 45);
  66. WM_CAP_DLG_VIDEOCOMPRESSION = (WM_CAP_START + 46);
  67. WM_CAP_SET_PREVIEW = (WM_CAP_START + 50);
  68. WM_CAP_SET_OVERLAY = (WM_CAP_START + 51);
  69. WM_CAP_SET_PREVIEWRATE = (WM_CAP_START + 52);
  70. WM_CAP_SET_SCALE = (WM_CAP_START + 53);
  71. WM_CAP_GET_STATUS = (WM_CAP_START + 54);
  72. WM_CAP_SET_SCROLL = (WM_CAP_START + 55);
  73. WM_CAP_GRAB_FRAME = (WM_CAP_START + 60);
  74. WM_CAP_GRAB_FRAME_NOSTOP = (WM_CAP_START + 61);
  75. WM_CAP_SEQUENCE = (WM_CAP_START + 62);
  76. WM_CAP_SEQUENCE_NOFILE = (WM_CAP_START + 63);
  77. WM_CAP_SET_SEQUENCE_SETUP = (WM_CAP_START + 64);
  78. WM_CAP_GET_SEQUENCE_SETUP = (WM_CAP_START + 65);
  79. WM_CAP_SET_MCI_DEVICE = (WM_CAP_START + 66);
  80. WM_CAP_GET_MCI_DEVICE = (WM_CAP_START + 67);
  81. WM_CAP_STOP = (WM_CAP_START + 68);
  82. WM_CAP_ABORT = (WM_CAP_START + 69);
  83. WM_CAP_SINGLE_FRAME_OPEN = (WM_CAP_START + 70);
  84. WM_CAP_SINGLE_FRAME_CLOSE = (WM_CAP_START + 71);
  85. WM_CAP_SINGLE_FRAME = (WM_CAP_START + 72);
  86. WM_CAP_PAL_OPEN = (WM_CAP_START + 80);
  87. WM_CAP_PAL_SAVE = (WM_CAP_START + 81);
  88. WM_CAP_PAL_PASTE = (WM_CAP_START + 82);
  89. WM_CAP_PAL_AUTOCREATE = (WM_CAP_START + 83);
  90. WM_CAP_PAL_MANUALCREATE = (WM_CAP_START + 84);
  91. function capCreateCaptureWindowA(lpszWindowName: PCHAR;
  92. dwStyle: longint;
  93. x: integer;
  94. y: integer;
  95. nWidth: integer;
  96. nHeight: integer;
  97. ParentWin: HWND;
  98. nId: integer): HWND; stdcall; external 'avicap32.dll';
  99. procedure Register;
  100. begin
  101. RegisterComponents('FstiCtl', [TVideoCapture]);
  102. end;
  103. { TVideoCapture }
  104. constructor TVideoCapture.Create(AOwner: TComponent);
  105. begin
  106. inherited Create(AOwner);
  107. CapturingAVI := false;
  108. Color := clBlack;
  109. BevelOuter := bvNone;
  110. Width := 320;
  111. Height := 240;
  112. hWndC := 0;
  113. end;
  114. destructor TVideoCapture.Destroy;
  115. begin
  116. if CapturingAVI then StopAvi;
  117. if hWndC <> 0 then CloseVideo;
  118. hWndC := 0;
  119. inherited;
  120. end;
  121. procedure TVideoCapture.OpenVideo(handle: THandle);
  122. begin
  123. hWndC := capCreateCaptureWindowA('Video Capture Window',
  124. WS_CHILD or WS_VISIBLE,
  125. Left,
  126. Top,
  127. Width,
  128. Height,
  129. Handle,
  130. 0);
  131. if hWndC <> 0 then
  132. SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0);
  133. end;
  134. procedure TVideoCapture.CloseVideo;
  135. begin
  136. if hWndC <> 0 then begin
  137. SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);
  138. SendMessage(hWndC, WM_CLOSE, 0, 0);
  139. hWndC := 0;
  140. end;
  141. end;
  142. procedure TVideoCapture.GrabFrame;
  143. begin
  144. if hWndC <> 0 then
  145. SendMessage(hWndC, WM_CAP_GRAB_FRAME, 0, 0);
  146. end;
  147. procedure TVideoCapture.SaveBitMap(filename: TFileName);
  148. begin
  149. SendMessage(hWndC, WM_CAP_FILE_SAVEDIB, 0, longint(pchar(FileName)));
  150. end;
  151. function TVideoCapture.StartAvi(filename: TFileName): Boolean;
  152. begin
  153. if hWndC <> 0 then begin
  154. CapturingAVI := true;
  155. SendMessage(hWndC,
  156. WM_CAP_FILE_SET_CAPTURE_FILE,
  157. 0,
  158. Longint(pchar(FileName)));
  159. SendMessage(hWndC, WM_CAP_SEQUENCE, 0, 0);
  160. end;
  161. end;
  162. procedure TVideoCapture.StopAvi;
  163. begin
  164. if hWndC <> 0 then begin
  165. SendMessage(hWndC, WM_CAP_STOP, 0, 0);
  166. CapturingAVI := false;
  167. end;
  168. end;
  169. procedure TVideoCapture.SaveJpeg(filename: TFileName;
  170. compressibility: Integer);
  171. var
  172. bmp: TBitMap;
  173. jpg: TJpegimage;
  174. begin
  175. try
  176. SaveBitMap('tmp.bmp');
  177. bmp := TBitmap.Create;
  178. jpg := TJpegImage.Create;
  179. bmp.LoadFromFile('tmp.bmp');
  180. jpg.Assign(bmp);
  181. jpg.CompressionQuality := compressibility;
  182. jpg.Compress;
  183. jpg.SaveToFile(filename);
  184. DeleteFile('tmp.bmp');
  185. except
  186. end;
  187. bmp.free;
  188. jpg.free;
  189. end;
  190. procedure TVideoCapture.SetVideoFormat;
  191. begin
  192. SendMessage(hWndC, WM_CAP_DLG_VIDEOFORMAT, 0, 0);
  193. end;
  194. procedure TVideoCapture.SetSource;
  195. begin
  196. SendMessage(hWndC, WM_CAP_DLG_VIDEOSOURCE, 0, 0);
  197. end;
  198. procedure TVideoCapture.StartVideo;
  199. begin
  200. SendMessage(hWndC, WM_CAP_SET_PREVIEW, -1, 0);
  201. SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 100, 0);
  202. SendMessage(hWndC, WM_CAP_SET_SCALE, -1, 0);
  203. end;
  204. procedure TVideoCapture.StopVideo;
  205. begin
  206. SendMessage(hWndC, WM_CAP_SET_PREVIEW, 0, 0);
  207. end;
  208. procedure TVideoCapture.WMSize(var Message: TWMSize);
  209. begin
  210. SetWindowPos(hWndC, HWND_BOTTOM, 0, 0, Width, Height, SWP_NOMOVE or SWP_NOACTIVATE);
  211. end;
  212. procedure TVideoCapture.SetStretch(TrueorFalse: Boolean);
  213. begin
  214. end;
  215. procedure TVideoCapture.SetCompression;
  216. begin
  217. SendMessage(hWndC, WM_CAP_DLG_VIDEOCOMPRESSION, 0, 0)
  218. end;
  219. procedure TVideoCapture.SavetoJpegStream(var JpegStream: TMemoryStream; compressibility: Integer);
  220. var
  221. bmp: TBitMap;
  222. jpg: TJpegimage;
  223. begin
  224. try
  225. SaveBitMap('tmp.bmp');
  226. bmp := TBitmap.Create;
  227. jpg := TJpegImage.Create;
  228. bmp.LoadFromFile('tmp.bmp');
  229. jpg.Assign(bmp);
  230. jpg.CompressionQuality := compressibility;
  231. jpg.Compress;
  232. jpg.SaveToStream(JpegStream);
  233. DeleteFile('tmp.bmp');
  234. except
  235. end;
  236. bmp.free;
  237. jpg.free;
  238. end;
  239. end.
 
http://blog.csdn.net/huang_xw/article/details/8638309

TVideoCapture类的源码,继承TCustomPanel,用于视频捕获(用到了SendMessage和SetWindowPos等API)good的更多相关文章

  1. 25 BasicUsageEnvironment0基本使用环境基类——Live555源码阅读(三)UsageEnvironment

    25 BasicUsageEnvironment0基本使用环境基类——Live555源码阅读(三)UsageEnvironment 25 BasicUsageEnvironment0基本使用环境基类— ...

  2. String类——StringBuilder类的源码及内存分析(java)

    相同:底层均采用字符数组value来保存字符串 区别:String类的value数组有final 修饰,指向不可改,同时private 未提供修改value数组的方法.StringBuilder类的v ...

  3. 24 UsageEnvironment使用环境抽象基类——Live555源码阅读(三)UsageEnvironment

    24 UsageEnvironment使用环境抽象基类——Live555源码阅读(三)UsageEnvironment 24 UsageEnvironment使用环境抽象基类——Live555源码阅读 ...

  4. String类的源码分析

    之前面试的时候被问到有没有看过String类的源码,楼主当时就慌了,回来赶紧补一课. 1.构造器(构造方法) String类提供了很多不同的构造器,分别对应了不同的字符串初始化方法,此处从源码中摘录如 ...

  5. 分享自己用的php分页类实例源码

    分享一个我自己用着的php分页类实例源码,供大家参考,具体内容如下: <?php /** file: page.class.php 完美分页类 Page */ class Page { priv ...

  6. 线程池 ThreadPoolExecutor 类的源码解析

    线程池 ThreadPoolExecutor 类的源码解析: 1:数据结构的分析: private final BlockingQueue<Runnable> workQueue;  // ...

  7. 【高并发】通过ThreadPoolExecutor类的源码深度解析线程池执行任务的核心流程

    核心逻辑概述 ThreadPoolExecutor是Java线程池中最核心的类之一,它能够保证线程池按照正常的业务逻辑执行任务,并通过原子方式更新线程池每个阶段的状态. ThreadPoolExecu ...

  8. 12 哈希表相关类——Live555源码阅读(一)基本组件类

    12 哈希表相关类--Live555源码阅读(一)基本组件类 这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 本文由乌合之众 lym瞎编,欢迎转载 ...

  9. commoncrawl 源码库是用于 Hadoop 的自定义 InputFormat 配送实现

    commoncrawl 源码库是用于 Hadoop 的自定义 InputFormat 配送实现. Common Crawl 提供一个示例程序 BasicArcFileReaderSample.java ...

随机推荐

  1. ArcGIS 帮助文件中的CAD数据的说明

    专业库——地理数据类型——cad

  2. Android Gradle Plugin指南(三)——依赖关系、android库和多项目配置

    原文地址:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Dependencies-Android-Librari ...

  3. [SCSS] Organize SCSS into Multiple Files with Partials

    Tired of dealing with monolithic CSS files? Are requests for multiple CSS files hurting your perform ...

  4. 【codeforces 758A】Holiday Of Equality

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  5. tky项目第②个半月总结

    在上一篇半月总结中,介绍了tky项目的整体架构.项目的进展情况.项目的优势与开发中存在的问题等.今天来聊聊这半个月中,项目中发生的事情. 在这半个月中,项目中有了较大的突破:成功通过了国家评測中心的測 ...

  6. 【矩阵】概念的理解 —— span、基

    span:全部列向量的线性组合构成的集合: span[a1,-,an]={y∈Rm|y=∑k=1nckak}=S 注:ak∈Rm,共 n 个列向量: 集合 S 可以有不同的一组基,但是基中向量的个数是 ...

  7. xaml 添加 region

    原文:xaml 添加 region 本文告诉大家如何在 xaml 添加 region 在 VisualStudio 2015 和 VisualStudio 2017 微软支持在 xmal 使用 reg ...

  8. new与属性访问的顺序,从一道JS面试题说起

    这段时间一直在研究设计模式,在看工厂模式的时候,看到一段代码 VehicleFactory.prototype.createVehicle = function ( options ) { if( o ...

  9. sql操作xml小总结

    一.前言 SQL Server 2005 引入了一种称为 XML 的本机数据类型.用户可以创建这样的表,它在关系列之外还有一个或多个 XML 类型的列:此外,还允许带有变量和参数.为了更好地支持 XM ...

  10. template.js小小说明

    教程 template.js 一款 JavaScript 模板引擎,简单,好用.提供一套模板语法,用户可以写一个模板区块,每次根据传入的数据,生成对应数据产生的HTML片段,渲染不同的效果. 简介 主 ...