delphi 怎样保存视频采集的录像为avi文件?该如何处理

delphi 怎样保存视频采集的录像为avi文件?
delphi 怎样保存视频采集的录像为avi文件?


我的视频采集到的buffer是拷贝到img1中显示出来的

现在我用了一个button按钮 事件中实现了把当前采集的画面保存成bmp图像 我是这样写的 如下

procedure Tmy_frm.btnsaveClick(Sender: TObject);
begin
if dlgSave1.Execute then
begin
img1.Picture.SaveToFile(dlgSave1.FileName);
end;
end;


现在想把我实时的从开始采集视频到保存的时候这一段视频保存出来 该如何写?怎么样保存成avi文件?

------解决方案--------------------
有一个videocap控件可以做样
------解决方案--------------------
Delphi(Pascal) code

unit avi;

interface
{$I config.inc}
uses
  Windows, SysUtils,Classes, Graphics, Dialogs,MMSystem,ACMWaveIn,ACMWaveOut, Controls,Forms,
{$IFDEF VER90}
  ole2;
{$ELSE}
  ActiveX;
{$ENDIF}

type
  TAVIStreamInfoA = record
    fccType,
    fccHandler,
    dwFlags, // Contains AVITF_* flags
    dwCaps: DWORD;
    wPriority,
    wLanguage: WORD;
    dwScale,
    dwRate, // dwRate / dwScale == samples/second
    dwStart,
    dwLength, // In units above...
    dwInitialFrames,
    dwSuggestedBufferSize,
    dwQuality,
    dwSampleSize: DWORD;
    rcFrame: TRect;
    dwEditCount,
    dwFormatChangeCount: DWORD;
    szName: array[0..63] of AnsiChar;
  end;

  WAVEFORMATEX = record
    wFormatTag : WORD  ;
    nChannels  : WORD  ;
    nSamplesPerSec : DWORD ;
    nAvgBytesPerSec : DWORD ;
    nBlockAlign : WORD  ;
    wBitsPerSample : WORD  ;
    cbSize : WORD  ;
  end;

  Tmpeglayer3waveformat_tag = record
    wfx               : WAVEFORMATEX ;
    wID               : WORD         ;
    fdwFlags          : DWORD        ;
    nBlockSize        : WORD         ;
    nFramesPerBlock   : WORD         ;
    nCodecDelay       : WORD         ;
  end;
  TAVIStreamInfo = TAVIStreamInfoA;
  PAVIStreamInfo = ^TAVIStreamInfo;

  TWavHeader   =   record
    rId   :   longint;
    rLen   :   longint;
    wId   :   longint;
    fId   :   longint;
    fLen   :   longint;
    wFormatTag   :   word;
    nChannels   :   word;
    nSamplesPerSec   :   longint;
    nAvgBytesPerSec   :   longint;
    nBlockAlign   :   word;
    wBitsPerSample   :   word;
    dId   :   longint;
    wSampleLength   :   longint;
  end;
  PTWavHeader = ^TWavHeader;

  TAVICOMPRESSOPTIONS = record
    fccType ,
    fccHandler ,
    dwKeyFrameEvery,
    dwQuality ,
    dwBytesPerSecond ,
    dwFlags : DWORD  ;
    lpFormat : Pointer ;
    cbFormat : DWORD  ;
    lpParms : Pointer ;
    cbParms : DWORD  ;
    dwInterleaveEvery :DWORD  ;
  end;
  PAVICOMPRESSOPTIONS = ^TAVICOMPRESSOPTIONS;

  TFmtChunk = packed record
    id : array[0..3] of Char;       //="fmt "
    size : ULONG;  //=16
    wFormatTag : Word ;   //=WAVE_FORMAT_PCM=1
    wChannels :  Word;       //=1 or 2 for mono or stereo
    dwSamplesPerSec : ULONG ;  //=11025 or 22050 or 44100
    dwAvgBytesPerSec : ULONG ; //=wBlockAlign * dwSamplesPerSec
    wBlockAlign : Word;      //=wChannels * (wBitsPerSample==8?1:2)
    wBitsPerSample : Word ;  //=8 or 16, for bits per sample
  end;

  TDataChunk = packed record
    id : array[0..3] of Char;           //="data"
    size : ULONG;     //=datsize, size of the following array
    data : PByte; //=the raw data goes here
  end;

  TWavChunk = packed record
    id : array[0..3] of Char;       //="RIFF"
    size : ULONG;                   //=datsize+8+16+4
    itype : array[0..3] of Char;        //="WAVE"
    fmt : TFmtChunk ;
    dat : TDataChunk ;
  end;
  PWavChunk = ^TWavChunk;

  pRGBArray = ^TRGBArray;
  TRGBArray = array[0..32767] of TRGBTriple;

  Tbuffer = array of char;

  TAVISaveCallback = function(nPercent: integer): LONGint; stdcall;
function  AVIFileOpen(var ppfile: pointer; szFile: PChar; uMode: UINT; lpHandler: pointer): HResult; stdcall;
procedure AVIFileInit; stdcall;
procedure AVIFileExit; stdcall;
function  AVIFileCreateStream(pfile: pointer; var ppavi: pointer; var psi: TAVIStreamInfo): HResult; stdcall;
function  AVIStreamSetFormat(pavi: pointer; lPos: LONGint; lpFormat: pointer; cbFormat: LONGint): HResult; stdcall;
function  AVIFileGetStream(pfile: pointer; var ppavi: pointer; streamtype : DWORD;cbFormat: LONGint): HResult; stdcall;
function  AVIStreamWrite(pavi: pointer; lStart, lSamples: LONGint; lpBuffer: pointer; cbBuffer: LONGint; dwFlags: DWORD; var plSampWritten: LONGint; var plBytesWritten: LONGint): HResult; stdcall;
function  AVIStreamRelease(pavi: pointer): ULONG; stdcall;
function  AVIFileRelease(pfile: pointer): ULONG; stdcall;
function  CreateEditableStream(var ppsEditable: pointer; psSource: pointer): HResult; stdcall;
function  AVIStreamInfo(pAVIStream : Pointer; var psi : TAVIStreamInfo; lSize : LongInt) : HRESULT; stdcall;
function  AVIStreamStart(pavi : LongInt) : HRESULT; stdcall;
function  AVIStreamLength(pavi : LongInt) : HRESULT; stdcall;
function  AVIStreamGetFrameOpen(pAVIStream : Pointer; var bih : TBitmapInfoHeader) : HRESULT; stdcall;
function  AVIStreamReadFormat(aviStream : Pointer; lPos : LongInt; var lpFormat : tWAVEFORMATEX; var cbFormat : LongInt): HRESULT; stdcall;
function  AVISaveOptions(handle : HWND;uiFlags : ULONG;nStreams : Integer;var ppavi : Pointer;  plpOptions : PAVICOMPRESSOPTIONS): HRESULT; stdcall;
function  AVISaveOptionsFree(nStreams : Integer; var plpOptions : TAVICOMPRESSOPTIONS): HRESULT; stdcall;
function  AVIMakeCompressedStream(var ppsCompressed : Pointer; psSource : Pointer; var lpOptions : TAVICOMPRESSOPTIONS; var dummy : Integer): HRESULT; stdcall;
procedure InternalGetDIBSizes(Bitmap: HBITMAP; var InfoHeaderSize: Integer; var ImageSize: longInt; PixelFormat: TPixelFormat);
procedure InitializeBitmapInfoHeader(Bitmap: HBITMAP; var Info: TBitmapInfoHeader;PixelFormat: TPixelFormat);
function  AlignBit(Bits, BitsPerPixel, Alignment: Cardinal): Cardinal;
function  InternalGetDIB(Bitmap: HBITMAP; Palette: HPALETTE; var BitmapInfo; var Bits; PixelFormat: TPixelFormat): Boolean;
function  CreateAviFile(fname : string ; dwWidth , dwHeight,idwRate  : Integer ;pf : TPixelFormat; var pFile : Pointer; var pStream : Pointer ) : Boolean;
function  WriteAviFile(pvideo : Pointer; var istep : Integer;pData : Pointer ;iw,ih : Integer; bufsize : Cardinal;bVertical : Boolean = False) : HRESULT;
function  CloseAViFile(var pFile,pStream : Pointer) : Boolean ;
procedure CreateWav(channels, resolution: word; rate: Integer;fn: string);
procedure StartWave(parent : TWinControl; bufsize : LongInt; onData : TOnData);
procedure CloseWave;
function  AddWave( avifile, audiofile:string):boolean;