海康卡录像问题(100分)

  • 主题发起人 主题发起人 rzqcjwrz
  • 开始时间 开始时间
R

rzqcjwrz

Unregistered / Unconfirmed
GUEST, unregistred user!
海康卡录像问题?
 
晕晕。。又是你。。。这是啥问题
自上次你提问时,我要做个监控录像的,直到你这还在问问题
我的都已做出来并使用中了。
 
我慢慢在看,一步步的学,没有办法?
风铃夜思雨:能否提供源码,学习一下?
 
风铃夜思雨:我向你求教,怎样才能正确写出录像部分?
 
我只粗略贴出部份相关内容
var
FileHeader: Array[0..MAX_CHANNELS - 1, 0..200 - 1] Of UCHAR;
//文件头
FileHeaderLen: Integer;
//文件头长度
CurrentFileLen: Array[0..MAX_CHANNELS - 1] Of ULONG;
//当前文件长度

Function Stream_Read_CallBack(ChannelNumber: UINT;
Context: Pointer): Integer;
Cdecl;
begin

TFrmMain(Context).OnDataReady(ChannelNumber, 0);
Result := 0;
end;


Function TFrmMain.OnDataReady(ChannelNum: UINT;
lparam: Integer): Integer;
Stdcall;
Var
StreamBuf: Array[0..BufSize - 1] Of UCHAR;
Status, Len, FrameType: Integer;
begin

Result := 0;
Len := SizeOf(StreamBuf);
Status := Sdk.ReadStreamData(ChannelHandle[ChannelNum], StreamBuf, @Len, @FrameType);
If Status = -1 then
Exit;
Case FrameType Of
PktSysHeader:
begin
//保留文件头备用
FillChar(FileHeader[ChannelNum], SizeOf(FileHeader[ChannelNum]), #0);
CopyMemory(@FileHeader[ChannelNum], @StreamBuf, Len);
FileHeaderLen := Len;
end;

end;


Inc(CurrentFileLen[ChannelNum], Len);

If Succeeded(Status) then

ChangeFileName(ChannelNum, Len);
FileWrite(FileHandle[ChannelNum], StreamBuf, Len);
end;


//切换文件
Procedure TFrmMain.ChangeFileName(ChannelNum, Len: Integer);
Var
CurrSize: LongWord;
IsChange: Boolean;
FilePath: String;
EndCode: ULONG;
begin

IsChange := False;
CurrSize := 100 * 1024 * 1024;
If CurrentFileLen[ChannelNum] > CurrSize then
//文件上限
IsChange := True
else
If GetDiskFree(CurrDrive[ChannelNum]) <= MinDiskSize then

IsChange := True;

If IsChange then

begin

EndCode := End_Code;
FileWrite(FileHandle[ChannelNum], EndCode, SizeOf(EndCode));
FileClose(FileHandle[ChannelNum]);
FilePath := GenerateFileName(ChannelNum);
If FileExists(FilePath) then
DeleteFile(FilePath);
FileHandle[ChannelNum] := FileCreate(FilePath);
FileWrite(FileHandle[ChannelNum], FileHeader[ChannelNum], FileHeaderLen);
CurrentFileLen[ChannelNum] := FileHeaderLen;
Inc(CurrentFileLen[ChannelNum], Len);
end;

end;


开始录像
FilePath := 'd:/xx.mpg';
If Length(FilePath) < 3 then
Exit;
If FileExists(FilePath) then
DeleteFile(FilePath);
FileHandle[ChannelNum] := FileCreate(FilePath);
If FileHandle[ChannelNum] = -1 then

begin

MsgErr('无法打开文件:' + FilePath);
Exit;
end;

SetDSP(ChannelNum);
CurrentFileLen[ChannelNum] := 0;
Sdk.StartVideoCapture(ChannelHandle[ChannelNum]);

FormCreate事件
Sdk.RegisterStreamReadCallback(Stream_Read_CallBack, self);
 
谢谢你:风铃夜思雨
 
风铃夜思雨:这几个函数 GetDiskFree、MsgErr和GenerateFileName如何定义?
我的QQ是:609174167
 
GetDiskFree是获取分区的空间大小
MsgErr是messagebox(handle,pchar(str),'错误',mb_iconhand)
GenerateFileName是产生一个文件名而已
这些你都可以自已写
 
能帮我调试一下吗?还是不得行。
 
风铃夜思雨:能告诉我你的QQ号吗?
 
接受答案了.
 
后退
顶部