读书人

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

发布时间: 2012-06-08 12:55:24 作者: rapoo

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; 


[解决办法]
保存为avi需要相关写avi文件的接口,directshow有这样的filter,也可以自己使用网上找的接口写。注意avi是否支持你保存的数据的编码方式
[解决办法]
to mdejtod
(稻草人)
看到美女了,这么热心,,lz最好是真的美女哦。。。

读书人网 >.NET

热点推荐