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 怎样保存视频采集的录像为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;