Delphi 控制摄像头操作
<p>DELPHI控制摄像头操作可以使用TVideoCap控件,或直接使用MS的AVICAP32.DLL就可轻松的实现对摄像头编程。</p><p>首先常量定义和函数定义:</p>
<p>implementation<br>const WM_CAP_START = WM_USER;<br>const WM_CAP_STOP = WM_CAP_START + 68;<br>const WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10;<br>const WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11;<br>const WM_CAP_SAVEDIB = WM_CAP_START + 25;<br>const WM_CAP_GRAB_FRAME = WM_CAP_START + 60;<br>const WM_CAP_SEQUENCE = WM_CAP_START + 62;<br>const WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20;<br>const WM_CAP_SEQUENCE_NOFILE =WM_CAP_START+ 63 ;<br>const WM_CAP_SET_OVERLAY =WM_CAP_START+ 51 ;<br>const WM_CAP_SET_PREVIEW =WM_CAP_START+ 50 ;<br>const WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START +6;<br>const WM_CAP_SET_CALLBACK_ERROR=WM_CAP_START +2;<br>const WM_CAP_SET_CALLBACK_STATUSA= WM_CAP_START +3;<br>const WM_CAP_SET_CALLBACK_FRAME= WM_CAP_START +5;<br>const WM_CAP_SET_SCALE=WM_CAP_START+ 53 ;<br>const WM_CAP_SET_PREVIEWRATE=WM_CAP_START+ 52 ;<br>function capCreateCaptureWindowA(lpszWindowName : PCHAR;<br>dwStyle : longint;<br>x : integer;<br>y : integer;<br>nWidth : integer;<br>nHeight : integer;<br>ParentWin : HWND;<br>nId : integer): HWND;<br>STDCALL EXTERNAL 'AVICAP32.DLL';<br>{$R *.dfm}</p>
<p>打开Delphi,添加Panel1到Form1上,定义一个全局变量,var hWndC : THandle; 添加button1 ,caption为激活摄像头:</p>
<p>procedure TForm1.Button1Click(Sender: TObject);<br>begin<br>hWndC := capCreateCaptureWindowA('My Own Capture Window',<br>WS_CHILD or WS_VISIBLE ,<br>Panel1.Left,<br>Panel1.Top,<br>Panel1.Width,<br>Panel1.Height,<br>Form1.Handle,<br>0);<br>if hWndC <> 0 then<br>SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0);<br>SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, 0, 0);<br>SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, 0, 0);<br>SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0);<br>SendMessage(hWndC, WM_CAP_SET_SCALE, 1, 0);<br>SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 66, 0);<br>//SendMessage(hWndC, WM_CAP_SEQUENCE_NOFILE, 1, 0);<br>SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0);<br>SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0);<br>end;</p>
<p>添加button2 ,caption为关闭摄像头:</p>
<p>procedure TForm1.Button2Click(Sender: TObject);<br>begin<br>if hWndC <> 0 then begin<br>SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);<br>hWndC := 0;<br>end;<br>end; </p>
<p>添加button3 ,caption为保存为BMP图像:</p>
<p>procedure TForm1.Button3Click(Sender: TObject);<br>begin<br>if hWndC <> 0 then begin<br>SendMessage(hWndC,WM_CAP_SAVEDIB,0,longint(pchar('c:\\test.bmp')));<br>end;<br>end;</p>
<p>添加button4 ,caption为开始录像:</p>
<p>procedure TForm1.Button4Click(Sender: TObject);<br>begin<br>if hWndC <> 0 then<br>begin<br>SendMessage(hWndC,WM_CAP_FILE_SET_CAPTURE_FILEA,0, Longint(pchar('c:\\test.avi')));<br>SendMessage(hWndC, WM_CAP_SEQUENCE, 0, 0);<br>end;<br>end; </p>
<p>添加button5 ,caption为停止录像:</p>
<p>procedure TForm1.Button5Click(Sender: TObject);<br>begin<br>if hWndC <> 0 then begin<br>SendMessage(hWndC, WM_CAP_STOP, 0, 0);<br>end;<br>end;</p>
<p>添加button6,caption为退出:</p>
<p>procedure TForm1.Button6Click(Sender: TObject);<br>begin<br>close;<br>end; </p>
<p>可以添加MediaPlayer和opendialog控件</p>
<p>添加button7,caption为加载视频:</p>
<p>procedure TForm1.Button7Click(Sender: TObject);<br>begin<br>openDialog1.DefaultExt := 'avi';<br>openDialog1.Filter := 'avi files (*.avi)|*.avi';</p>
<p>if OpenDialog1.Execute then<br>begin<br> if (MediaPlayer1.DeviceID<>0) then<br> begin<br> if (MediaPlayer1.Mode=mpplaying) then MediaPlayer1.Stop;<br> end;</p>
<p> MediaPlayer1.FileName:=openDialog1.FileName;<br> //MediaPlayer1.DisplayRect.Top:=panel2.Top;<br> //MediaPlayer1.DisplayRect.Left:=panel2.left;<br> //MediaPlayer1.DisplayRect.Right:=panel2.Height;<br> //MediaPlayer1.DeviceType :=dtAutoSelect;<br> Mediaplayer1.Open;<br> MediaPlayer1.Play;<br> end;<br>end;</p>
<p>如果电脑没有摄像头,panel就会黑黑的,可以尝试安装SoftCam虚拟摄像头。</p>
<p>关于摄像头编程,大家也可以看看这组VCL组件:DSPack,DSPack是一套使用微软Direct Show和DirectX技术的类和组件,设计工作于DirectX 9,支持系统Win9X, ME, 2000和Windows XP。</p>
<p>视屏聊天 按数据压缩传输给对方,显示出来,不是那么简单。</p>
<div>
<table border="0"><colgroup><col></colgroup>
<tbody valign="top">
<tr>
<td valign="middle">
<p>unit Unit1;</p>
<p>interface</p>
<p>uses<br> Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,<br> Dialogs, StdCtrls, ExtCtrls, MPlayer;</p>
<p>type<br> TForm1 = class(TForm)<br> Button1: TButton;<br> Panel1: TPanel;<br> Button2: TButton;<br> Button3: TButton;<br> Button4: TButton;<br> Button5: TButton;<br> Button6: TButton;<br> Button7: TButton;<br> OpenDialog1: TOpenDialog;<br> MediaPlayer1: TMediaPlayer;<br> procedure Button1Click(Sender: TObject);<br> procedure Button2Click(Sender: TObject);<br> procedure Button3Click(Sender: TObject);<br> procedure Button4Click(Sender: TObject);<br> procedure Button5Click(Sender: TObject);<br> procedure Button7Click(Sender: TObject);<br> procedure Button6Click(Sender: TObject);<br> private</p>
<p> { Private declarations }<br> public<br> { Public declarations }<br> end;</p>
<p>var<br> Form1: TForm1;<br> hWndC : THandle;</p>
<p>implementation<br>const WM_CAP_START = WM_USER;<br>const WM_CAP_STOP = WM_CAP_START + 68;<br>const WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10;<br>const WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11;<br>const WM_CAP_SAVEDIB = WM_CAP_START + 25;<br>const WM_CAP_GRAB_FRAME = WM_CAP_START + 60;<br>const WM_CAP_SEQUENCE = WM_CAP_START + 62;<br>const WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20;<br>const WM_CAP_SEQUENCE_NOFILE =WM_CAP_START+ 63 ;<br>const WM_CAP_SET_OVERLAY =WM_CAP_START+ 51 ;<br>const WM_CAP_SET_PREVIEW =WM_CAP_START+ 50 ;<br>const WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START +6;<br>const WM_CAP_SET_CALLBACK_ERROR=WM_CAP_START +2;<br>const WM_CAP_SET_CALLBACK_STATUSA= WM_CAP_START +3;<br>const WM_CAP_SET_CALLBACK_FRAME= WM_CAP_START +5;<br>const WM_CAP_SET_SCALE=WM_CAP_START+ 53 ;<br>const WM_CAP_SET_PREVIEWRATE=WM_CAP_START+ 52 ;<br>function capCreateCaptureWindowA(lpszWindowName : PCHAR;<br>dwStyle : longint;<br>x : integer;<br>y : integer;<br>nWidth : integer;<br>nHeight : integer;<br>ParentWin : HWND;<br>nId : integer): HWND;<br>STDCALL EXTERNAL 'AVICAP32.DLL';<br>{$R *.dfm}</p>
<p>procedure TForm1.Button1Click(Sender: TObject);<br>begin<br>hWndC := capCreateCaptureWindowA('My Own Capture Window',<br>WS_CHILD or WS_VISIBLE ,<br>Panel1.Left,<br>Panel1.Top,<br>Panel1.Width,<br>Panel1.Height,<br>Form1.Handle,<br>0);<br>if hWndC <> 0 then<br>SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0);<br>SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, 0, 0);<br>SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, 0, 0);<br>SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0);<br>SendMessage(hWndC, WM_CAP_SET_SCALE, 1, 0);<br>SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 66, 0);<br>//SendMessage(hWndC, WM_CAP_SEQUENCE_NOFILE, 1, 0);<br>SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0);<br>SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0);<br>end;</p>
<p>procedure TForm1.Button2Click(Sender: TObject);<br>begin<br>if hWndC <> 0 then begin<br>SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);<br>hWndC := 0;<br>end;<br>end;</p>
<p>procedure TForm1.Button3Click(Sender: TObject);<br>begin<br>if hWndC <> 0 then begin<br>SendMessage(hWndC,WM_CAP_SAVEDIB,0,longint(pchar('c:\\test.bmp')));<br>end;<br>end;</p>
<p>procedure TForm1.Button4Click(Sender: TObject);<br>begin<br>if hWndC <> 0 then<br>begin<br>SendMessage(hWndC,WM_CAP_FILE_SET_CAPTURE_FILEA,0, Longint(pchar('c:\\test.avi')));<br>SendMessage(hWndC, WM_CAP_SEQUENCE, 0, 0);<br>end;<br>end;</p>
<p>procedure TForm1.Button5Click(Sender: TObject);<br>begin<br>if hWndC <> 0 then begin<br>SendMessage(hWndC, WM_CAP_STOP, 0, 0);<br>end;<br>end;</p>
<p>procedure TForm1.Button7Click(Sender: TObject);<br>begin<br>openDialog1.DefaultExt := 'avi';<br>openDialog1.Filter := 'avi files (*.avi)|*.avi';</p>
<p>if OpenDialog1.Execute then<br>begin<br> if (MediaPlayer1.DeviceID<>0) then<br> begin<br> if (MediaPlayer1.Mode=mpplaying) then MediaPlayer1.Stop;<br> end;</p>
<p> MediaPlayer1.FileName:=openDialog1.FileName;<br> //MediaPlayer1.DisplayRect.Top:=panel2.Top;<br> //MediaPlayer1.DisplayRect.Left:=panel2.left;<br> //MediaPlayer1.DisplayRect.Right:=panel2.Height;<br> //MediaPlayer1.DeviceType :=dtAutoSelect;<br> Mediaplayer1.Open;<br> MediaPlayer1.Play;<br> end;<br>end;</p>
<p>procedure TForm1.Button6Click(Sender: TObject);<br>begin<br>close;<br>end;</p>
<p>end.</p>
<p>//= == =====================</p>
<p>object Form1: TForm1<br> Left = 192<br> Top = 114<br> Width = 658<br> Height = 422<br> Caption = '摄像头操作'<br> Color = clBtnFace<br> Font.Charset = DEFAULT_CHARSET<br> Font.Color = clWindowText<br> Font.Height = -11<br> Font.Name = 'MS Sans Serif'<br> Font.Style = []<br> OldCreateOrder = False<br> PixelsPerInch = 96<br> TextHeight = 13<br> object Button1: TButton<br> Left = 536<br> Top = 8<br> Width = 97<br> Height = 41<br> Caption = '激活摄像头'<br> TabOrder = 0<br> OnClick = Button1Click<br> end<br> object Panel1: TPanel<br> Left = 0<br> Top = 0<br> Width = 521<br> Height = 385<br> Caption = '摄像头尚未激活中'<br> TabOrder = 1<br> object MediaPlayer1: TMediaPlayer<br> Left = 200<br> Top = 16<br> Width = 253<br> Height = 33<br> TabOrder = 0<br> end<br> end<br> object Button2: TButton<br> Left = 536<br> Top = 56<br> Width = 97<br> Height = 41<br> Caption = '关闭摄像头'<br> TabOrder = 2<br> OnClick = Button2Click<br> end<br> object Button3: TButton<br> Left = 536<br> Top = 112<br> Width = 97<br> Height = 41<br> Caption = '保存为BMP图片'<br> TabOrder = 3<br> OnClick = Button3Click<br> end<br> object Button4: TButton<br> Left = 536<br> Top = 160<br> Width = 97<br> Height = 41<br> Caption = '开始录像'<br> TabOrder = 4<br> OnClick = Button4Click<br> end<br> object Button5: TButton<br> Left = 536<br> Top = 208<br> Width = 97<br> Height = 41<br> Caption = '停止录像'<br> TabOrder = 5<br> OnClick = Button5Click<br> end<br> object Button6: TButton<br> Left = 536<br> Top = 320<br> Width = 97<br> Height = 41<br> Caption = '退出'<br> TabOrder = 6<br> OnClick = Button6Click<br> end<br> object Button7: TButton<br> Left = 536<br> Top = 256<br> Width = 97<br> Height = 49<br> Caption = '加载视频'<br> TabOrder = 7<br> OnClick = Button7Click<br> end<br> object OpenDialog1: TOpenDialog<br> Left = 464<br> Top = 24<br> end<br>end</p>
</td>
</tr>
</tbody>
</table>
</div>
<p>摘录自:Delphi摄像头操作 http://yxmhero1989.blog.163.com/blog/static/112157956201102703433980/</p>
<p>试写的Delphi摄像头照相(抓图)小软件 http://www.codefans.net/soft/8385.shtml<br>Delphi 激活摄像头 http://hi.baidu.com/warrially/blog<br>利用Delphi编程控制摄像头 http://www.haoxiai.net/bianchengyuyan/Delphi/84272.html<br>http://blog.csdn.net/walkershrek/archive/2007/12/04/1915440.aspx<br>关与Usb摄像头问题 http://group.gimoo.net/review/142849<br>MTPlay V1.0 摄像头视频捕捉程序 www.hackcode.com<br>用Delphi开发视频捕获(摄像头拍照)程序 http://www.delphibbs.com/keylife/iblog_show.asp?xid=15554<br>Delphi实现摄像头拍照能 http://www.xuedelphi.cn/wenzhang/mrjq/gjyy/2008/11/200811232621.htm<br>用Delphi控制摄像头编程(转载)http://blog.ednchina.com/999wjc/4230/message.aspx<br>http://blog.csdn.net/walkershrek/archive/2007/12/04/1915429.aspx<br>VB编写控制摄像头程序 http://down.bbs156.cn/exef1226.html<br>一个用VC写的视屏聊天工具(源代码) http://www.trydone.com/posts/list/301.page<br>GraghDialog.rar http://www.hackchina.com/cont/182020</p>
</div>
<div id="MySignature" role="contentinfo">
好的代码像粥一样,都是用时间熬出来的<br><br>
来源:https://www.cnblogs.com/jijm123/p/14157698.html
頁:
[1]