1、SDK.H 中有声明以下函数//回调
typedef bool (CALLBACK *DataCallBack)(int index, int type, BYTE *pData, int len, int param1, int param2);
//设置回调
DLL_EXPORT int WAPA_IPC_SetDataCallBack(DataCallBack fData);
//连接摄像机
DLL_EXPORT int WAPA_IPC_Login(char *sCameraIp, int dataFormat);
//初始化解码器
DLL_EXPORT int WAPA_IPC_InitDec(int index, int width, int height, int encodeFormat, int dataFormat);
//解码
DLL_EXPORT int WAPA_IPC_Dec(int index, unsigned char *istream, int istream_size, unsigned char *ostream);
//拍照并保存
DLL_EXPORT int WAPA_IPC_OnPhoto(int index, unsigned char* pImageBuf, int width, int height, int dataFormat, char* fileName = NULL);
2、我在C#中声明如下publlic class WAPAMethods
{
//回调
public unsafe delegate bool DataCallBack(int index, int mode, byte* data, int len, int w, int h);
/// <summary>
/// 设置事件回调函数
/// </summary>
/// <param name="fEvent"></param>
/// <returns></returns>
[DllImport(WAPA_DLL, EntryPoint = "WAPA_IPC_SetEventCallBack", CallingConvention = CallingConvention.Cdecl)]
public static extern int WAPA_IPC_SetEventCallBack(EventCallBack fEvent);
/// <summary>
/// 连接到录像机
/// </summary>
/// <param name="sCameraIp">IP地址</param>
/// <param name="dataFormat">0:解码前数据;1:YUYV格式数据;2:RGB格式数据</param>
/// <returns></returns>
[DllImport(WAPA_DLL, EntryPoint = "WAPA_IPC_Login", CallingConvention = CallingConvention.Cdecl)]
public static extern int WAPA_IPC_Login(string sCameraIp, int dataFormat);
/// <summary>
/// 初始化解码器
/// </summary>
/// <param name="index"></param>
/// <param name="width">图像宽</param>
/// <param name="height">图像高</param>
/// <param name="encodeFormat">压缩数据格式 264:H.264;265:MPEG4</param>
/// <param name="dataFormat">输出的数据格式 1:YUYV;2:RGB</param>
/// <returns></returns>
[DllImport(WAPA_DLL, EntryPoint = "WAPA_IPC_InitDec", CallingConvention = CallingConvention.Cdecl)]
public static extern int WAPA_IPC_InitDec(int index, int width, int height, int encodeFormat, int dataFormat);
/// <summary>
/// 解码
/// </summary>
/// <param name="index">解码器索引号</param>
/// <param name="istream">编码数据</param>
/// <param name="istream_size">编码的数据大小</param>
/// <param name="ostream">解码后的数据</param>
/// <returns></returns>
[DllImport(WAPA_DLL, EntryPoint = "WAPA_IPC_Dec", CallingConvention = CallingConvention.Cdecl)]
//DLL_EXPORT int WAPA_IPC_Dec(int index, unsigned char *istream, int istream_size, unsigned char *ostream);
public static extern unsafe int WAPA_IPC_Dec(int index, byte* istream, int istream_size, byte* ostream);
//拍照. pImageBuf:返回的数据. dataFormat:YUYV,RGB
[DllImport(WAPA_DLL, EntryPoint = "WAPA_IPC_OnPhoto", CallingConvention = CallingConvention.Cdecl)]
public static extern unsafe int WAPA_IPC_OnPhoto(int index,byte* pImageBuf, int width, int height, int dataFormat, string fileName = null);}3、在Winform中调用public partial class Form1 : Form
{
private WAPAMethods.DataCallBack _dataCallBack;
private unsafe byte* frameBuf;
private unsafe void Form1_Load(object sender, EventArgs e)
{
_dataCallBack = DataOnReceived;
WAPAMethods.WAPA_IPC_SetDataCallBack(_dataCallBack);
Reconnected();
}
public void Reconnected()
{
//连接摄像机
_cameraIndex = WAPAMethods.WAPA_IPC_Login(_ip,2);
if(_cameraIndex==206)return;
//连接成功后初始化解码器
WAPAMethods.WAPA_IPC_InitDec(_cameraIndex, 1280, 960, 264, 2);
}
private unsafe bool DataOnReceived(int index, int mode, byte* data, int len, int w, int h)
{
//解码
var ret = WAPAMethods.WAPA_IPC_Dec(index,data, len, frameBuf);
//拍照
ret = WAPAMethods.WAPA_IPC_OnPhoto(index, frameBuf, w, h, 2, null);
return true;
}
}
问题来了:frameBuf应该是解码后的视频指针地址,可现在神马也没有,断点显示是0x000000,请问这个unsigned char *的参数要怎么声明?C++C#DLL
typedef bool (CALLBACK *DataCallBack)(int index, int type, BYTE *pData, int len, int param1, int param2);
//设置回调
DLL_EXPORT int WAPA_IPC_SetDataCallBack(DataCallBack fData);
//连接摄像机
DLL_EXPORT int WAPA_IPC_Login(char *sCameraIp, int dataFormat);
//初始化解码器
DLL_EXPORT int WAPA_IPC_InitDec(int index, int width, int height, int encodeFormat, int dataFormat);
//解码
DLL_EXPORT int WAPA_IPC_Dec(int index, unsigned char *istream, int istream_size, unsigned char *ostream);
//拍照并保存
DLL_EXPORT int WAPA_IPC_OnPhoto(int index, unsigned char* pImageBuf, int width, int height, int dataFormat, char* fileName = NULL);
2、我在C#中声明如下publlic class WAPAMethods
{
//回调
public unsafe delegate bool DataCallBack(int index, int mode, byte* data, int len, int w, int h);
/// <summary>
/// 设置事件回调函数
/// </summary>
/// <param name="fEvent"></param>
/// <returns></returns>
[DllImport(WAPA_DLL, EntryPoint = "WAPA_IPC_SetEventCallBack", CallingConvention = CallingConvention.Cdecl)]
public static extern int WAPA_IPC_SetEventCallBack(EventCallBack fEvent);
/// <summary>
/// 连接到录像机
/// </summary>
/// <param name="sCameraIp">IP地址</param>
/// <param name="dataFormat">0:解码前数据;1:YUYV格式数据;2:RGB格式数据</param>
/// <returns></returns>
[DllImport(WAPA_DLL, EntryPoint = "WAPA_IPC_Login", CallingConvention = CallingConvention.Cdecl)]
public static extern int WAPA_IPC_Login(string sCameraIp, int dataFormat);
/// <summary>
/// 初始化解码器
/// </summary>
/// <param name="index"></param>
/// <param name="width">图像宽</param>
/// <param name="height">图像高</param>
/// <param name="encodeFormat">压缩数据格式 264:H.264;265:MPEG4</param>
/// <param name="dataFormat">输出的数据格式 1:YUYV;2:RGB</param>
/// <returns></returns>
[DllImport(WAPA_DLL, EntryPoint = "WAPA_IPC_InitDec", CallingConvention = CallingConvention.Cdecl)]
public static extern int WAPA_IPC_InitDec(int index, int width, int height, int encodeFormat, int dataFormat);
/// <summary>
/// 解码
/// </summary>
/// <param name="index">解码器索引号</param>
/// <param name="istream">编码数据</param>
/// <param name="istream_size">编码的数据大小</param>
/// <param name="ostream">解码后的数据</param>
/// <returns></returns>
[DllImport(WAPA_DLL, EntryPoint = "WAPA_IPC_Dec", CallingConvention = CallingConvention.Cdecl)]
//DLL_EXPORT int WAPA_IPC_Dec(int index, unsigned char *istream, int istream_size, unsigned char *ostream);
public static extern unsafe int WAPA_IPC_Dec(int index, byte* istream, int istream_size, byte* ostream);
//拍照. pImageBuf:返回的数据. dataFormat:YUYV,RGB
[DllImport(WAPA_DLL, EntryPoint = "WAPA_IPC_OnPhoto", CallingConvention = CallingConvention.Cdecl)]
public static extern unsafe int WAPA_IPC_OnPhoto(int index,byte* pImageBuf, int width, int height, int dataFormat, string fileName = null);}3、在Winform中调用public partial class Form1 : Form
{
private WAPAMethods.DataCallBack _dataCallBack;
private unsafe byte* frameBuf;
private unsafe void Form1_Load(object sender, EventArgs e)
{
_dataCallBack = DataOnReceived;
WAPAMethods.WAPA_IPC_SetDataCallBack(_dataCallBack);
Reconnected();
}
public void Reconnected()
{
//连接摄像机
_cameraIndex = WAPAMethods.WAPA_IPC_Login(_ip,2);
if(_cameraIndex==206)return;
//连接成功后初始化解码器
WAPAMethods.WAPA_IPC_InitDec(_cameraIndex, 1280, 960, 264, 2);
}
private unsafe bool DataOnReceived(int index, int mode, byte* data, int len, int w, int h)
{
//解码
var ret = WAPAMethods.WAPA_IPC_Dec(index,data, len, frameBuf);
//拍照
ret = WAPAMethods.WAPA_IPC_OnPhoto(index, frameBuf, w, h, 2, null);
return true;
}
}
问题来了:frameBuf应该是解码后的视频指针地址,可现在神马也没有,断点显示是0x000000,请问这个unsigned char *的参数要怎么声明?C++C#DLL
不一样的
unsigned char* 用ref byte
unsigned char *用byte*
fixed(byte * pucOut = &frameBuf[0])
{
ret = WAPAMethods.WAPA_IPC_OnPhoto(index, pucOut , w, h, 2, null);
}