视频捕捉求救----SOS!!!(100分)

  • 主题发起人 主题发起人 fengsql
  • 开始时间 开始时间
F

fengsql

Unregistered / Unconfirmed
GUEST, unregistred user!
[?]
哪位大虾有视频捕捉的源码,敬请赐教!?
Email: j.j.feng@263.net
万分感激!!
 
TCanvas *dtCanvas = new TCanvas;

dtCanvas->Handle=GetDC(0);


Graphics::TBitmap *bitmap=new Graphics::TBitmap;

bitmap->Width=Width;

bitmap->Height=Height;


int nColors=GetDeviceCaps(Canvas->Handle,SIZEPALETTE);

LOGPALETTE* logPal=(LOGPALETTE*)new Byte[sizeof(LOGPALETTE)+(nColors-1)*sizeof(PALETTEENTRY)];

logPal->palVersion=0x300;
logPal->palNumEntries=(Word)nColors;

GetSystemPaletteEntries(Canvas->Handle,0,nColors,logPal->palPalEntry);

bitmap->Palette=CreatePalette(logPal);

delete[] logPal;


TRect src=BoundsRect;

TRect dest=Rect(0,0,Width,Height);

bitmap->Canvas->CopyRect(dest,dtCanvas,src);


bitmap->SaveToFile("Screen.bmp");


delete bitmap;

delete dtCanvas;
 
不好意思,我不大懂vc,我希望是delphi源码
不过还是很感谢你!
 
视频捕捉,存成avi格式
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;

type
TForm1 = class(TForm)
Panel1: TPanel;
OpenVideo: TButton;
CloseVideo: TButton;
GrabFrame: TButton;
SaveBMP: TButton;
StartAVI: TButton;
StopAVI: TButton;
SaveDialog1: TSaveDialog;
procedure FormCreate(Sender: TObject);
procedure OpenVideoClick(Sender: TObject);
procedure CloseVideoClick(Sender: TObject);
procedure GrabFrameClick(Sender: TObject);
procedure SaveBMPClick(Sender: TObject);
procedure StartAVIClick(Sender: TObject);
procedure StopAVIClick(Sender: TObject);
private
{ Private declarations }
hWndC : THandle;
CapturingAVI : bool;
public
{ Public declarations }
end;


var
Form1: TForm1;

implementation

{$R *.DFM}

const WM_CAP_START = WM_USER;
const WM_CAP_STOP = WM_CAP_START + 68;
const WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10;
const WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11;
const WM_CAP_SAVEDIB = WM_CAP_START + 25;
const WM_CAP_GRAB_FRAME = WM_CAP_START + 60;
const WM_CAP_SEQUENCE = WM_CAP_START + 62;
const WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20;

function capCreateCaptureWindowA(lpszWindowName : PCHAR;
dwStyle : longint;
x : integer;
y : integer;
nWidth : integer;
nHeight : integer;
ParentWin : HWND;
nId : integer): HWND;
STDCALL EXTERNAL 'AVICAP32.DLL';

procedure TForm1.FormCreate(Sender: TObject);
begin

CapturingAVI := false;
hWndC := 0;
SaveDialog1.Options :=
[ofHideReadOnly, ofNoChangeDir, ofPathMustExist]
end;


procedure TForm1.OpenVideoClick(Sender: TObject);
begin

hWndC := capCreateCaptureWindowA('My Own Capture Window',
WS_CHILD or WS_VISIBLE ,
Panel1.Left,
Panel1.Top,
Panel1.Width,
Panel1.Height,
Form1.Handle,
0);
if hWndC <> 0 then

SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0);
end;


procedure TForm1.CloseVideoClick(Sender: TObject);
begin

if hWndC <> 0 then
begin

SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);
hWndC := 0;
end;

end;


procedure TForm1.GrabFrameClick(Sender: TObject);
begin

if hWndC <> 0 then

SendMessage(hWndC, WM_CAP_GRAB_FRAME, 0, 0);
end;


procedure TForm1.SaveBMPClick(Sender: TObject);
begin

if hWndC <> 0 then
begin

SaveDialog1.DefaultExt := 'bmp';
SaveDialog1.Filter := 'Bitmap files (*.bmp)|*.bmp';
if SaveDialog1.Execute then

SendMessage(hWndC,
WM_CAP_SAVEDIB,
0,
longint(pchar(SaveDialog1.FileName)));
end;

end;


procedure TForm1.StartAVIClick(Sender: TObject);
begin

if hWndC <> 0 then
begin

SaveDialog1.DefaultExt := 'avi';
SaveDialog1.Filter := 'AVI files (*.avi)|*.avi';
if SaveDialog1.Execute then
begin

CapturingAVI := true;
SendMessage(hWndC,
WM_CAP_FILE_SET_CAPTURE_FILEA,
0,
Longint(pchar(SaveDialog1.FileName)));
SendMessage(hWndC, WM_CAP_SEQUENCE, 0, 0);
end;

end;

end;


procedure TForm1.StopAVIClick(Sender: TObject);
begin

if hWndC <> 0 then
begin

SendMessage(hWndC, WM_CAP_STOP, 0, 0);
CapturingAVI := false;
end;

end;


end.

 
视频捕捉:对于有DRV驱动的,采用控件进行捕捉会好一点,www.ocloud.com上有相关的
控件,自己用VFW编程比较繁一点。对于没有DRV驱动的(主要是为了不占用CPU的资源),
只能够使用视频采集卡提供的编程接口。很简单的。注:这个方面LeeLange是高手。
 
卷起千堆雪tyn斑竹啊,你的那个程序怎么用,你说说好吗。就是能不能进行录象,然后放呢
 
感谢iceboltchen的抬举,鄙人叫LeeChange。
卷兄已经用了最经典(since 1991)的VFW大法,不过不必来回SendMessage,有很多现成的宏是可以用的。
现在江湖上甚传一种叫DirextShow的偏方,个人感觉比VFW好使。
 
有实时显示捕捉到的视频瓣源代码吗?
 
用directshow吧!
 
TO::卷起千堆雪tyn
老兄你的源码不能实现实时显示图像,如果能实现实时显示的话,我那个300分的问题就
解决了,分数也归你了
 
用directshow是最好的方法。
 
To LeeChange:
我一直是用 VFW,感觉 DirectShow 有许多无法控制的地方(如尺寸、制式等等),请指教。
 
VFW的问题已经回答太多遍了,自己研究一下.很通用的东西,虽然比DirectShow低级,
但确实好用
http://www.delphibbs.com/delphibbs/dispq.asp?lid=237372
 
LeeChange:
本人只用过vfw,DirextShow如何练,给个小例子让我们学习学习
(例如采单帧
vfw只要 SendMessage(capH,WM_USER+25,0,LPARAM(PChar(filename)));
 
LeeChange兄:
能将你的DirextShow控件给我一份吗?非常感谢!!!非常急.TigerDing@163.com
 
视频捕捉 如果要求不高 我强烈建议用vfw.占用资源较少,对较低配置的用户比较好。
使用非常的简单,例子也比较多。但视频质量的确不是十分的好,而且控制不灵活。
用directshow的确十分的灵活。质量很好。但对机子资源(主要cpu资源)耗费太大。
平时 我是高端的应用一般选择direceshow(具体是dspack2.0+direx8.0);用dspack2.0
目的是减少写代码,然后 一些灵活的控制就自己用dx来扩展他的功能 如:选择 视频源,
选择视频的制式(NT,pal),设置捕获的图像大小,压缩视频流等 就自己写。

 
楼上的,请问如何设置视频源的格式呢?为何我设置了之后,格式老变来变去呢?
还请不吝赐教!
我用的也是directshow
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部