📄 simpapi13.txt
字号:
SAPI BOOL DLLCALL sapiStopDetect2WithCompressRec(UINT CardID,UINT EncoderID);
//该卡压缩流报警记录是否启动,返回值为真,则启动了,否则,没有启动。
SAPI BOOL DLLCALL sapiIfDetect2Going(int CardID,int ChannelID);
//to get USRDETECTINFO
//获得用户输入参数,USRDETECTINFO见6-1。
SAPI BOOL DLLCALL sapiGetDetect2UsrInfo(int CardID,int ChannelID,USRDETECTINFO * usrInfo);
//if you know about compress record process,you can use the next function to detect ,just need you input the compress stream
//you can get the return value which can tell you if the input compress stream has motion object.
//用户可自己用压缩流进行检测,返回值为真,则有移动目标,否则没有移动目标。
SAPI BOOL DLLCALL sapiExDetect2(int CardID,int ChannelID,unsigned char *pCompressBuffer);
V11Update5: 新增4个函数:
1. SAPI BOOL DLLCALL sapiGetHWObjPtr(int CardID,int HWObjID,void ** ObjPtr );
获得硬件对象指针,直接操纵硬件,显示对象,实现基本SDK与SSAPI混合编程,以便高效,灵活,快速地实现应用程序。
适用于高级用户及直接使用S卡基本SDK编程的用户。对一般用户不推荐使用。
CardID:卡号 0-15
HWObjID:操纵对象标识,可取
IOOBJ (0):访问SurvIO(SurvIO.H) 基本IO对象
VIDEODEC1OBJ (1):访问VideoDec1(VidDec.h) 视频输入对象1
VIDEODEC2OBJ (2):访问VideoDec2(VidDec.h) 视频输入对象2
VIDEOOBJ (3):访问Video(Video.H)视频预览对象
MPEGOBJ (4):访问MpegEnc(MpgEnc.H)视频压缩对象
MPEGAVOBJ (5):访问MpegAVEnc(MpegAVEnc.H)复合MPEG1音视频对象
CONFIGOBJ (6):访问Configh(Config.H)S卡配置对象
DISPLAY (7):访问Display(Display.h)显示对象
注意:应在应用程序开始时调用sapiDeviceInit,初始化除DISPLAY对象以外的所有对象;调用sapiDisplayCreate 初始化除DISPLAY对象;
DISPLAY对象仅有一个,大家共享,CardID参数不用,可用0。
其他硬件对象则与卡相关。退出应用程序时应调用sapiDeviceExit和sapiDisplayDestory。
ObjPtr:如成功返回对象指针,失败指针为0。
使用该函数时需要包括HWlib目录下的有关.H文件及库,参考MANUAL.TXT
例启动0号卡视频捕获:
设置视频源:
CVideo * m_pVideo;
sapiGetHWObjPtr(0,VIDEOOBJ,(void **)&m_pVideo);
if (m_pVideo)
m_pVideo->StartCapture();
2. SAPI BOOL DLLCALL sapiGetIniFileEncoderParams(UINT CardID,unsigned int enc_id,ENCODERPARM * pEncoderParams);
获得TVCARD.INI文件[ENCODER]节编码器参数。
enc_id:ENCODER1或ENCODER2
pEncoderParams:一个ENCODERPARM对象地址,返回时对象被更新。
3. SAPI int DLLCALL sapiIsVideoSignalExist(UINT CardID,UINT VChannelID,int VInputChannel);
判断视频输入信号是否中断,可用于检测视频输入信号的有无。
CardID:卡号 0-15
VChannelID:为0(MAIN_VCH)
VInputChannel为0(自动检测),1-4对SS1,SD PRO,SQ PRO可取1,即视频输入通道1。
返回:整型数0,1,2,4,8
0:无信号
1:视频输入通道1有信号;2:视频输入通道2有信号,4:视频输入通道3有信号...
如VInputChannel为0,自动检测,且有多路信号,则可返回1,2,4,8的或值
调用该函数将有200-800ms的延迟。
4. SAPI BOOL DLLCALL sapiSetCompressFrameRate(UINT CardID,UINT EncoderID,unsigned int nOnFrame,unsigned int nOffFrame);
支持SQ PRO卡的变帧速率MPEG压缩功能
CardID:卡号 0-15
EncoderID:为0(ENCODER1)
nOnFrame:为0,1,2 连续保留帧数。
nOffFrame:为0,1,2,3,4,5,6,7 连续丢弃帧数。
帧速率=正常帧速率*(nOnFrame/(nOnFrame+nOffFrame))
例nOnFrame=1,nOffFrame=1:帧速率=1/2 正常帧速率
例nOnFrame=2,nOffFrame=1:帧速率=2/3 正常帧速率
******************************* V12 新增函数 ************************
使用请参考TT3V6.EXE源码,或Dephi源码!
一.新报警检测接口
结构:
压缩报警回调函数:
//state: 0 normal,no move object,1 it detectd that object is moving
state值反映移动报警检测状态,0:无移动目标(或回调报警检测被禁止,call apiDisableCallBackDetect);
>0:有移动目标.state的bit0-bit7为1时分别表示该区域(0,1,...7)检测到运动目标.
typedef void (__stdcall * VOIDENCODERCALLBACK2)(UINT CardID,UINT EncoderID,int state,BYTE * buf,int length,void * pUsrParam);
例:
void __stdcall MpegEncoderCallBackFun(UINT CardID,UINT EncoderID,int state,BYTE * buf,int length,void * pUsrParam)
{
CMainFrame * pMainWin=(CMainFrame *)pUsrParam;
if (state!=0)
{
pMainWin->SetWindowText("报警");
}
else
pMainWin->SetWindowText(" ");
}
1. SAPI int DLLCALL sapiStartOneCompressRecMVDetect(UINT CardID,UINT EncoderID,stEncoderParams * pParams,VOIDENCODERCALLBACK2 pEncodercallback);
启动压缩(带回调报警检测)同sapiStartOneCompressRec类似,但使用压缩报警回调函数
输入: CardID:卡号.
EncoderID:卡上视频编码器号,为0(ENCODER1)或1(ENCODER2)(SD,SDA卡才有).
pParams: 为结构指向stEncoderParams(见3-3)的指针(同sapiStartOneCompressRec)。
结构中pEncodercallback置0.
pEncodercallback:压缩报警回调函数地址.不能为0.
2. SAPI BOOL DLLCALL sapiEnableCallBackDetect(UINT CardID,UINT EncoderID);
使能(回调)报警检测.
3. SAPI BOOL DLLCALL sapiDisableCallBackDetect(UINT CardID,UINT EncoderID);
禁止(回调)报警检测.
//DataType:0 mpeg1 video stream data;1 mpeg1 system stream data
4. SAPI int DLLCALL sapiMpgMoveDetect(UINT CardID,UINT EncoderID,int DataType, BYTE * buffer,UINT length);
对压缩缓存进行移动报警检测.在使用回调报警检测后,不再需要调用该函数(SSAPI内部已用了该函数).
仅在用sapiStartOneCompressRec,sapiStartOneCompressRec2启动压缩后,需进行移动报警检测时,才用该函数。
buffer为需要检测的压缩缓存地址,length为缓存长度。
输入: CardID:卡号.
EncoderID:卡上视频编码器号,为0(ENCODER1)或1(ENCODER2)(SD,SDA卡才有).
DataType:缓冲区压缩数据类型(0 mpeg1 video stream data;1 mpeg1 system stream data)目 前保留没用置0。
buffer:压缩缓冲区地址。
length:为缓存长度。
输出:整数bit0-bit7 对应8个区域是否有动目标,为0无,为1有。
5. SAPI BOOL DLLCALL sapiMpgSetMoveDetectLevel(UINT CardID,UINT EncoderID,UINT level);
设置报警检测门限,缺省为10较好。
level:报警检测门限,范围1-100,越小越灵敏。
6. SAPI BOOL DLLCALL sapiMpgSetMoveDetectInterval(UINT CardID,UINT EncoderID,UINT interval);
设置报警检测间隔,缺省为1。通过设置报警检测间隔可在检测速度和CPU占用之间进行平衡。
interval:范围>=0;为0则对每一帧都进行报警检测,为1则隔一帧检测一帧。
7. SAPI BOOL DLLCALL sapiMpgSetMoveDetectArea(UINT CardID,UINT EncoderID,DetectAera * pDetectAera);
设置报警检测区域,缺省为全区,该函数可将一帧压缩数据分为几个区域,只对这些区域进行报警检测。
DetectAera 为总检测区域结构:最多可检测5个区域。
typedef struct {
UINT TotalNum; 有效检测区域数。
RECT Aera[5]; //max 5 aera 区域矩形。每个矩形大小对PAL视频为水平0-351,垂直0-287;对NTSC视频为水平0-351,垂直0-239;
每个区域矩形不应重叠。
int Level[5];//the detect level of every area 每个区域检测门限。
} DetectAera,* PDetectAera;
要恢复全区检测,置TotalNum为0。
8. SAPI BOOL DLLCALL sapiMpgMoveDetectReset(UINT CardID,UINT EncoderID);
使用已设置好的参数重启报警检测。
当使用了区域设置后用它重启报警检测。
二.新位图捕获接口
结构: stBMP2
typedef struct
{
int BmpID ;////[out] ID <=0 is error 位图捕获标识ID,唯一
BITMAPFILEHEADER FileHeader;//[out] MS Windows 结构
BITMAPINFO BmpInfo;//[out] MS Windows 结构
DWORD dwMask[3];//[out] 位图数据MASK
BYTE * DataBuf;//[out] 捕获位图数据缓存
BYTE * TempDataBuf;//[out] 内部用
int Width;//[out] 位图宽度
int Height; //[out] 位图高度
int Pitch;//[out] 内部用
int LineBytes;//[out] 内部用
int TotalBytes;//[out] 位图数据总字节数
int PixelBytes; 字节数/象素
BYTE * pSrc;//[out] 内部用
UINT PixelFormat;//[out] 内部用
void * pInter; 内部用
}stBMP2;
1. SAPI BOOL DLLCALL sapiPrepareMemBmpCap(UINT CardID,int ChannelID,UINT Width,UINT Height,BOOL IsSingle,stBMP2 * pstBmp);
该函数用于准备从S卡上直接捕获位图(与显示无关)(内存位图).准备包括,内存分配,填充stBMP2结构,供其它函数使用.
输入: CardID:卡号;ChannelID视频通道号:为MAIN_VCH
Width捕获位图宽度,Height捕获位图高度<=576(PAL);<=480(NTSC)
IsSingle:是否为单帧捕获,是(TRUE)则使用sapiSingleMemBmpCap捕获.
否(FALSE)则使用sapiBmpCap捕获.
pstBmp:stBMP2 结构指针(地址),该结构不需要用户填充.
输出: 填充后stBMP2结构指针,内部有内存分配.
返回: 成功返回TRUE,失败返回FALSE
注意:当系统连续物理内存不足时,调用该函数可能失败,报告"Alloc HW Cap buffer error"
特别是程序运行过一段时间或是反复调用sapiPrepareMemBmpCap和sapiReleaseBmpCap时.
你可在程序刚启动时调用sapiPrepareMemBmpCap分配内存,并保存pstBmp,而在程序退出时调用
sapiReleaseBmpCap释放内存,而在运行期可直接调用sapiSingleMemBmpCap或sapiBmpCap捕获,
调用sapiSaveBMPTOFile存盘.且此方法效率更高.
对显示位图捕获(用sapiPrepareDispBmpCap准备)则无此问题.
2. SAPI BOOL DLLCALL sapiPrepareDispBmpCap(int MRgnID,int SRgnID,stBMP2 * pstBmp);
该函数用于准备从显示卡显存上捕获当前显示子区域位图.(显示位图).准备包括,内存分配,创建stBMP2结构,供其它函数使用.
必须在该子区域(SRgnID)处于预览显示状态下进行。
输入: MRgnID:主区域标识;SRgnID子区域标识。
pstBmp:stBMP2 结构指针(地址),该结构不需要用户填充.
输出: 填充后stBMP2结构指针,内部有内存分配.
返回: 成功返回TRUE.
3. SAPI BOOL DLLCALL sapiBmpCap(stBMP2 * pstBmp);
捕获一帧或多帧内存或显示位图,每调用一次捕获一帧,注意因帧间隔为40ms,帧帧之间应有延时.
若当前预览显示是开启的,且是调用sapiPrepareMemBmpCap准备,则调用该函数后预览显示会停止.
该函数捕获位图易出现分裂现象,及重复现象不推荐使用。建议使用sapiSingleMemBmpCap函数捕获位图
输入:准备好的pstBmp:stBMP2 结构指针(地址)(由sapiPrepareDispBmpCap或sapiPrepareMemBmpCap准备好)
输出: pstBmp:stBMP2 结构指针(地址)
返回: 成功返回TRUE.
4. SAPI BOOL DLLCALL sapiSingleMemBmpCap(stBMP2 * pstBmp);
捕获一帧或多帧内存位图,在预览显示开启或关闭时均可使用.每调用一次捕获一帧新位图,位图大小为
Size<=352*288(PAL)或Size<=352*240(NTSC).建议使用sapiSingleMemBmpCap函数捕获位图
调用该函数一次预览显示仅受少量影响,停止调用预览显示自动恢复.捕获速度约20F/S。
输入:准备好的pstBmp:stBMP2 结构指针(地址)(由sapiPrepareMemBmpCap,参数IsSingle置TRUE准备好)
输出: pstBmp:stBMP2 结构指针(地址)
返回: 成功返回TRUE.
注意:a.在sapiPrepareDispBmpCap之后,首次调用sapiSingleMemBmpCap时捕获的1-2帧BMP可能是无效的,
以后就正常了,可将捕获的头1-2帧仍掉。
b.当无视频信号输入时,掉用该函数,等待时间较长约300-500ms才返回,有信号时<50ms.
5. SAPI BOOL DLLCALL sapiSaveBMPTOFile(char * filename,stBMP2 * pstBmp);
将位图存盘
输入:捕获后的pstBmp:stBMP2 结构指针(地址)(经过sapiBmpCap或sapiSingleMemBmpCap调用)
返回: 成功返回TRUE.
6. SAPI BOOL DLLCALL sapiReleaseBmpCap(stBMP2 * pstBmp);
释放位图准备时分配的内存,结束捕获
返回: 成功返回TRUE.
三. AVE3000 (S3000)卡新函数(停止压缩,仍用sapiStopCompressRec)
结构:stEncoderParams2 该结构与S1000卡的stEncoderParams类似,参考stEncode
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -