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. [RxJS] Flatten a higher order observable with concatAll in RxJS

    Besides switch and mergeAll, RxJS also provides concatAll as a flattening operator. In this lesson w ...

  2. Android Notification如何显示表情?

    遇到这种分析用什么实现的,肯定要祭出大杀器Android Device Monitor(AS在Tools->Android)打开之后,选中连接的设备,然后点击小手机图标,即可导出UI层次图.咱们 ...

  3. 1069. The Black Hole of Numbers (20)【模拟】——PAT (Advanced Level) Practise

    题目信息 1069. The Black Hole of Numbers (20) 时间限制100 ms 内存限制65536 kB 代码长度限制16000 B For any 4-digit inte ...

  4. oracle11g 在azure云中使用rman进行实例迁移

    1,開始备份 备份脚本rman_full_backup.sh内容例如以下: #!/bin/sh export DATE=`date +%F` export BACK_DIR='/backupdisk/ ...

  5. 【u204】高级砝码称重

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 现有n个砝码,重量分别为a1,a2,a3,--,an,在去掉m个砝码后,问最多能称量出多少不同的重量( ...

  6. Node.js开发入门—使用AngularJS

    做一个Web应用,一般都有前台和后台,Node.js能够实现后台.利用jade模板引擎也能够生成一些简单的前台页面,但要想开发出具有实际意义的现代Web应用.还得搭配一个Web前端框架. Angula ...

  7. ANR问题分析实例

    ANR监测机制包含三种: Service ANR,前台进程中Service生命周期不能超过20秒,后台进程中Service的生命周期不能超过200秒. 在启动Service时,抛出定时消息SERVIC ...

  8. 一起学Python:协程

    一:协程-yield 协程,又称微线程,纤程.英文名Coroutine. 协程是啥 协程是python个中另外一种实现多任务的方式,只不过比线程更小占用更小执行单元(理解为需要的资源). 为啥说它是一 ...

  9. 如何在spring quartz类中拿到ServletContext

    ContextLoader.getCurrentWebApplicationContext().getServletContext() web.xml里加个: <listener> < ...

  10. [Android]Fragment自定义动画、动画监听以及兼容性包使用

    Fragment是Android在API 11之后加入的一个组件,对提高Android开发中的布局合理性和布局效率都有很大作用,尤其是在Android平板等大屏幕设备的开发中,Fragment的引入能 ...