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控件可以做样
[解决办法]
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;