有人用过天敏的VC4000的视频捕捉卡吗,它的DLL在VB中就如何申明?

DTWUJP 2005-12-15 10:48:05
函数名称为:
sa7130capture.dll,
这是它的头文件


#ifndef VC404_CAPTURE_SAA7134
#define VC404_CAPTURE_SAA7134

#ifdef SAA7134CAPTURE_EXPORTS
#define SAA7134CAPTURE_API __declspec(dllexport)
#else
#define SAA7134CAPTURE_API __declspec(dllimport)
#endif

static const ULONG BrightnessDefault = 0x80;
static const ULONG ContrastDefault = 0x44;
static const ULONG SaturationDefault = 0x40;
static const ULONG HueDefault = 0x00;
static const ULONG SharpnessDefault = 0x00;

#define MIN_VAMP_BRIGHTNESS_UNITS 0
#define MAX_VAMP_BRIGHTNESS_UNITS 255

#define MIN_VAMP_CONTRAST_UNITS -128
#define MAX_VAMP_CONTRAST_UNITS 127

#define MIN_VAMP_HUE_UNITS -128
#define MAX_VAMP_HUE_UNITS 127

#define MIN_VAMP_SATURATION_UNITS -128
#define MAX_VAMP_SATURATION_UNITS 127

#define MIN_VAMP_SHARPNESS_UNITS -8
#define MAX_VAMP_SHARPNESS_UNITS 7

///////////////////////////////////////////////////////////
//注意:VC枚举类型为32位,4字节;这里的枚举类型为4字节。
// C++ builder枚举类型为8位,1字节,要重定义,例如:
//typedef int COLORCONTROL;
//COLORCONTROL BRIGHTNESS = 0;
//COLORCONTROL CONTRAST = 1;
//COLORCONTROL SATURATION = 2;
//COLORCONTROL HUE = 3;
//COLORCONTROL SHARPNESS = 4;

//描述:在VC中enum、ULONG、LONG、BOOL、DWORD 都为32位,4字节,
//这里使用的是VC定义标准。
/////////////////////////////////////////////////////////////

typedef enum { //@enum Decoder control types
BRIGHTNESS = 0, //@emem control for brightness
CONTRAST = 1, //@emem control for contrast
SATURATION = 2, //@emem control for saturation
HUE = 3, //@emem control for hue
SHARPNESS = 4 //@emem control for sharpness
}COLORCONTROL;

typedef enum { //@enum Decoder control types
SINGLE_PASS_MODE = 0,
PASS1_MODE = 1//,
}COMPRESSMODE;

typedef enum{
COLOR_DECODER = 0, //解码器(包括视频预览和视频捕获)
COLOR_PREVIEW = 1, //视频预览
COLOR_CAPTURE = 2 //视频捕获
}COLORDEVICETYPE;


typedef enum{
VID_CAPTURE_EVENT = 0,
AUD_CAPTURE_EVENT1 = 1,
AUD_CAPTURE_EVENT2 = 2,
IO_ALERT_EVENT = 3,
MOTION_DETECT = 4,
VID_PREVIEW_EVENT = 5
}EVENTTYPE;


typedef enum
{
RGB32 = 0x0,
RGB24 = 0x1,
RGB16 = 0x2,
RGB15 = 0x3,
YUY2 = 0x4,
BTYUV = 0x5,
Y8 = 0x6,
RGB8 = 0x7,
PL422 = 0x8,
PL411 = 0x9,
YUV12 = 0xA,
YUV9 = 0xB,
RAW = 0xE
}COLORFORMAT;

typedef enum
{
CAP_NULL_STREAM = 0, //捕获无效
CAP_ORIGIN_STREAM = 1, /*原始流回调*/
CAP_MPEG4_STREAM = 2, /*Mpeg4流*/
CAP_MPEG4_XVID_STREAM = 3
}CAPMODEL;


typedef enum
{
MPEG4_AVIFILE_ONLY = 0, //存为MPEG文件
MPEG4_CALLBACK_ONLY = 1, //MPEG数据回调
MPEG4_AVIFILE_CALLBACK = 2 //存为MPEG文件并回调
}MP4MODEL;

typedef enum
{ //@enum Field frequency
FIELD_FREQ_50HZ = 0, //@emem source is 50 Hz (PAL)
FIELD_FREQ_60HZ = 1, //@emem source is 60 Hz (NTSC)
FIELD_FREQ_0HZ = 2 //@emem source is 0 Hz (NO SIGNL)
}eFieldFrequency;

typedef enum { //电平等级
HIGH_VOLTAGE = 0, //高电平
LOW_VOLTAGE = 1 //低电平
}eVOLTAGELEVEL;

typedef struct
{

LONG cfHeight; //字符高度
LONG cfWidth; //字符宽度
LONG cfWeight; //字符粗细
LONG cfSpacing; //字符间距
BOOL cfItalic; //斜体
BOOL cfUnderline; //下划线
BOOL cfStrikeOut; //删除线
COLORREF cfBkColor; //背景色
COLORREF cfTextColor; //前景色
TCHAR cfFaceName[32]; //字体名
}OSDPARAM;

//error define area

#define ERR_SUCCESS 0 //no error,success
#define ERR_NODEVICEFOUND 1 //no device found in system
#define ERR_UNSUPPORTFUNC 2 //unsupport func tempro?
#define ERR_ALLOCRESOURCE 3 //alloc resource error
#define ERR_INITDIRECTDRAW 4 //Init Directdraw error
#define ERR_INITDIRECTSOUND 5 //Init Directdraw error
#define ERR_NOT_10MOONSDEV 6 //it is not device of 10Moons

//动态检测回调
typedef void (CALLBACK *PrcCbMotionDetect)( DWORD dwCard, BOOL bMove, LPVOID lpContext );
//视频捕获原始数据回调
typedef void (CALLBACK *PrcVidCapCallBack)( DWORD dwCard, BYTE *pbuff, DWORD dwSize );
//视频MPEG压缩数据回调
typedef void (CALLBACK *PrcVidMpegCallBack)( DWORD dwCard, BYTE *pbuff, DWORD dwSize, BOOL isKeyFrm );
//视频捕获存盘出错回调
typedef void (CALLBACK *PrcVidSaveErrCallBack)( DWORD dwCard );
//视频捕获字幕叠加出错回调
typedef void (CALLBACK *PrcVidOSDErrCallBack)( DWORD dwCard, DWORD dwOSDNum );
//音频捕获原始数据回调
//音频包原始大小16 Bit PCM格式,8080 BYTE,2声道,32000Hz
typedef void (CALLBACK *PrcAudCapCallBack)( DWORD dwCard, BYTE *pbuff,DWORD dwSize );
//音频MPEG压缩数据回调
typedef void (CALLBACK *PrcAudMpegCallBack)( DWORD dwCard, BYTE *pbuff,DWORD dwSize );
//音频捕获存盘出错回调
typedef void (CALLBACK *PrcAudSaveErrCallBack)( DWORD dwCard );
//IO报警回调
typedef void (CALLBACK *PrcIoAlertCallBack)( DWORD dwCard );
//视频Mpeg处理回调 ,pPorcess 返回为TRUE 表示当前帧压缩;返回为FALSE 表示丢掉当前帧
typedef void (CALLBACK *PrcVidMpegPorCallBack)( DWORD dwCard, BOOL* pPorcess );
//音频Mpeg处理回调,pPorcess 返回为TRUE 表示当音频包压缩;返回为FALSE 表示丢掉当前音频包。
typedef void (CALLBACK *PrcAudMpegPorCallBack)( DWORD dwCard, BOOL* pPorcess );
//注册视频捕获原始数据回调
BOOL WINAPI VCARegVidCapCallBack( DWORD dwCard, PrcVidCapCallBack ppCall );
//注册视频MPEG压缩数据回调
BOOL WINAPI VCARegVidMpegCallBack( DWORD dwCard, PrcVidMpegCallBack ppCall );
//注册视频捕获存盘出错回调
BOOL WINAPI VCARegVidSaveErrCallBack( DWORD dwCard, PrcVidSaveErrCallBack ppCall );
//注册视频捕获字幕叠加出错回调
BOOL WINAPI VCARegVidOSDErrCallBack( DWORD dwCard, PrcVidOSDErrCallBack ppCall );
//设置错误序号
void WINAPI VCASetLastError( DWORD dwError );
//得到错误序号
DWORD WINAPI VCAGetLastError();
//初始化SDK
BOOL WINAPI VCAInitSdk( HWND hWndMain );
//释放SDK资源
void WINAPI VCAUnInitSdk();
//得到设备总数
LONG WINAPI VCAGetDevNum();
//打开设备,hPreviewWnd为视频预览窗口的句柄,该窗口背景色用户必需设置为RGB(255,0,255)
BOOL WINAPI VCAOpenDevice( DWORD dwCard,HWND hPreviewWnd );
//关闭设备
BOOL WINAPI VCACloseDevice( DWORD dwCard );
//开始视频预览
BOOL WINAPI VCAStartVideoPreview( DWORD dwCard );
//停止视频预览
BOOL WINAPI VCAStopVideoPreview( DWORD dwCard );
//设置视频预览尺寸
...全文
611 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
cool_man 2005-12-16
  • 打赏
  • 举报
回复
我记得天敏的有VB用的OCX的.直接用OCX就行了呀
DTWUJP 2005-12-16
  • 打赏
  • 举报
回复
谢谢暴风雨,等待中
rainstormmaster 2005-12-16
  • 打赏
  • 举报
回复
至于函数的声明,也比较简单:

比如说这个:
///动态检测回调
typedef void (CALLBACK *PrcCbMotionDetect)( DWORD dwCard, BOOL bMove, LPVOID lpContext );

应该声明为:
Declare Sub PrcCbMotionDetect Lib "sa7130capture.dll" (ByVal dwCard As Long, ByVal bMove As Boolean, ByVal lpContext)

但是,声明为:
Declare Function PrcCbMotionDetect Lib "sa7130capture.dll" (ByVal dwCard As Long, ByVal bMove As Boolean, ByVal lpContext) As Long
问题也不会太大

上面我都是用byval传递参数的,在你实际调用中你应该根据文档中具体参数的说明,进行选择,如果参数是用来输入的([in]),那么用byval没什么问题,如果参数是用来输出的,你最好用byref,但是用byval 也不是不可以(需要修改声明)

比如说这个:
////得到视频捕获尺寸
BOOL WINAPI VCAGetVidCapSize( DWORD dwCard, DWORD &dwWidth, DWORD &dwHeight );
一般这么声明:
Declare Function VCAGetVidCapSize Lib "sa7130capture.dll" (ByVal dwCard As Long, dwWidth As Long, dwHeight As Long) As Boolean
调用的时候应该这样:
dim w as long
dim h as long
dim ret as boolean
ret=VCAGetVidCapSize(dwCard,w,h)
调用后你会得到w、h的值
而你这样声明应该也可以:
Declare Function VCAGetVidCapSize Lib "sa7130capture.dll" (ByVal dwCard As Long, byval dwWidth As Long, byval dwHeight As Long) As Boolean
不过调用的时候,就要传递变量的地址了,像这样:
dim w as long
dim h as long
dim ret as boolean
ret=VCAGetVidCapSize(dwCard,varptr(w),varptr(h))
所以说关键不在于你怎么声明,而在于你怎么调用,而怎么调用,则取决于sdk中的说明,没有sdk的话,你就先试着写一下声明,然后调用,不成功的话,就尝试修改一下参数的声明
DTWUJP 2005-12-15
  • 打赏
  • 举报
回复
它的网站BBS也关了,怎么这倒霉呀,急
DTWUJP 2005-12-15
  • 打赏
  • 举报
回复
BOOL WINAPI VCASetVidPreviewSize( DWORD dwCard, DWORD dwWidth, DWORD dwHeight );
//得到视频预览尺寸
BOOL WINAPI VCAGetVidPreviewSize( DWORD dwCard, DWORD &dwWidth, DWORD &dwHeight );
//更新视频预览,比如改变了显示窗口时,调用。
BOOL WINAPI VCAUpdateVideoPreview( DWORD dwCard, HWND hPreviewWnd );
//保存快照数据到相应的缓冲区
BOOL WINAPI VCASaveBitsToBuf( DWORD dwCard, PVOID pDestBuf, DWORD& dwWidth, DWORD& dwHeight );
//保存快照为JPEG文件
BOOL WINAPI VCASaveAsJpegFile( DWORD dwCard, LPCTSTR lpFileName,DWORD dwQuality = 100 );
//保存快照为BMP文件
BOOL WINAPI VCASaveAsBmpFile( DWORD dwCard, LPCTSTR lpFileName );
//开始视频捕获
BOOL WINAPI VCAStartVideoCapture( DWORD dwCard,
CAPMODEL enCapMode,
MP4MODEL enMp4Mode,
LPCTSTR lpFileName );
//停止视频捕获
BOOL WINAPI VCAStopVideoCapture( DWORD dwCard );
//设置视频捕获尺寸
BOOL WINAPI VCASetVidCapSize( DWORD dwCard, DWORD dwWidth, DWORD dwHeight );
//得到视频捕获尺寸
BOOL WINAPI VCAGetVidCapSize( DWORD dwCard, DWORD &dwWidth, DWORD &dwHeight );

/*设置视频捕获帧率,bFrameRateReduction参数表示是否允许显示帧率随捕获帧率的而减小。

当bFrameRateReduction为FALSE时以下有效。
PAL显示帧率显示帧率始终为25,NTSC显示帧率始终为30

当bFrameRateReduction为TRUE时以下有效,这样有助缓解多路视频捕获时PCI总线的负荷量。
PAL捕获帧率 PAL显示帧率 NTSC捕获帧率 NTSC显示帧率
1 1 1 1
2 2 + 1/2 2 2
3 3 + 1/8 3 3
4 4 + 1/6 4 4 + 2/7
5 5 5 5
6 6 + 1/4 6 6
7 8 + 1/3 7 7 + 1/2
8 8 + 1/3 8 10
9 12 + 1/2 9 10
10 12 + 1/2 10 10
11 12 + 1/2 11 15
12 12 + 1/2 12 15
13 25 13 15
14 25 14 15
15 25 15 15
16 25 16 30
17 25 17 30
18 25 18 30
19 25 19 30
20 25 20 30
21 25 21 30
22 25 22 30
23 25 23 30
24 25 24 30
25 25 25 30
26 30
27 30
28 30
29 30
30 30
*/
BOOL WINAPI VCASetVidCapFrameRate( DWORD dwCard, DWORD dwFrameRate, BOOL bFrameRateReduction = FALSE );
//设置MPEG压缩的位率,范围:56bps ~ 10Mbps; 单位Kbps
BOOL WINAPI VCASetBitRate( DWORD dwCard, DWORD dwBitRate);
//设置MPEG压缩的关键帧间隔,必须大于等于帧率
BOOL WINAPI VCASetKeyFrmInterval( DWORD dwCard, DWORD dwKeyFrmInterval);
//设置MPEG压缩的质量 dwQuantizer: 1 ~ 31 (1为最小量度,压缩质量最好); dwMotionPrecision: 0 ~ 6 (0最小运动精度)
BOOL WINAPI VCASetXVIDQuality( DWORD dwCard, DWORD dwQuantizer, DWORD dwMotionPrecision);
//设置MPEG压缩模式
BOOL WINAPI VCASetXVIDCompressMode( DWORD dwCard, COMPRESSMODE enCompessMode );
//设置动态检测,视频捕获停止时调用有效
BOOL WINAPI VCAEnableMotionDetect( DWORD dwCard,
BOOL bEnaDetect, //是否允许动态检测
BYTE *pAreaMap, //运动检测地图
LONG nSizeOfMap, //pAreaMap尺寸,以BYTE为单位
LONG nPersistTime, //物体持续nPersistTime秒不动则认为停止 1-30s
LPVOID lpContext, //监测上下文
PrcCbMotionDetect OnObjectMove ); //运动/停止回调函数

//设置视频色彩
BOOL WINAPI VCASetVidDeviceColor( DWORD dwCard, COLORCONTROL enCtlType, DWORD dwValue );
//得到视频源输入频率( 0HZ / 50HZ / 60HZ )对应( 无信号 / PAL制 / NTSC制 ), 参考枚举变量eFieldFrequency
BOOL WINAPI VCAGetVidFieldFrq( DWORD dwCard, eFieldFrequency &eVidSourceFieldRate );
//暂停捕获,暂停视频捕获和音频捕获,可用于快速改变音视频捕获类型和文件切换,设置视频捕获字幕叠加
BOOL WINAPI VCAPauseCapture( DWORD dwCard );
//设置视频捕获文本叠加,视频捕获停止时或捕获暂停时调用有效
BOOL WINAPI VCASetVidCapTextOSD( DWORD dwCard, BOOL bEnableOSD, TCHAR* tcText, POINT ptTopLeft, BOOL bTransparent, OSDPARAM* pOSDParm );
//设置视频捕获时间、日期叠加,在VCASetVidCapDateTimeOSDPARAM()函数设置后调用有效
BOOL WINAPI VCASetVidCapDateTimeOSD( DWORD dwCard, BOOL bEnableOSD, POINT ptTopLeft, BOOL bTransparent);
//设置视频捕获字幕叠加,视频捕获停止时或捕获暂停时调用有效
BOOL WINAPI VCASetVidCapDateTimeOSDParam( OSDPARAM* pOSDParm );
//允许视频Mpeg处理回调
BOOL WINAPI VCAEnableVidMpegProcess( DWORD dwCard, BOOL bEnPorcess, PrcVidMpegPorCallBack ppCall );
#endif
rainstormmaster 2005-12-15
  • 打赏
  • 举报
回复
至于函数的声明等等再说吧,现在没有时间了
rainstormmaster 2005-12-15
  • 打赏
  • 举报
回复
//#ifndef VC404_CAPTURE_SAA7134
#define VC404_CAPTURE_SAA7134

#ifdef SAA7134CAPTURE_EXPORTS
#define SAA7134CAPTURE_API __declspec(dllexport)
#else
#define SAA7134CAPTURE_API __declspec(dllimport)
#endif

这些可以略过

//static const ULONG BrightnessDefault = 0x80;
这样的凑合着声明为long:
Const BrightnessDefault As Long = &H80

//#define MIN_VAMP_BRIGHTNESS_UNITS 0
这样的和上面一样声明:
Const MIN_VAMP_BRIGHTNESS_UNITS As Long = 0

//typedef enum { //@enum Decoder control types
BRIGHTNESS = 0, //@emem control for brightness
CONTRAST = 1, //@emem control for contrast
SATURATION = 2, //@emem control for saturation
HUE = 3, //@emem control for hue
SHARPNESS = 4 //@emem control for sharpness
}COLORCONTROL;
这样的这样声明:
Enum COLORCONTROL
BRIGHTNESS = 0&
CONTRAST = 1&
SATURATION = 2&
HUE = 3&
SHARPNESS = 4&
End Enum

//typedef struct
{

LONG cfHeight; //字符高度
LONG cfWidth; //字符宽度
LONG cfWeight; //字符粗细
LONG cfSpacing; //字符间距
BOOL cfItalic; //斜体
BOOL cfUnderline; //下划线
BOOL cfStrikeOut; //删除线
COLORREF cfBkColor; //背景色
COLORREF cfTextColor; //前景色
TCHAR cfFaceName[32]; //字体名
}OSDPARAM;
这样的这样声明
Type OSDPARAM
cfHeight As Long ' ; //字符高度
cfWidth As Long '; //字符宽度
cfWeight As Long '; //字符粗细
cfSpacing As Long '; //字符间距
cfItalic As Boolean '; //斜体
cfUnderline As Boolean '; //下划线
cfStrikeOut As Long '; //删除线
cfBkColor As Long ' ; //背景色
cfTextColor As Long ' ; //前景色
cfFaceName(32 - 1) As Byte '; //字体名
End Type
weiweiplay 2005-12-15
  • 打赏
  • 举报
回复
帮顶

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧