高分求救!摄象头捕获到的视频帧如何用DrawDibDraw显示?
平台调用声明如下:
[DllImport("MsVfW32.dll")]
public static extern bool DrawDibDraw(IntPtr hdd,IntPtr hdc,int xDst,int yDst,int dxDst,int dyDst,IntPtr lpbi,IntPtr Bits,int xSrc,int ySrc,int dxSrc,int dySrc,int wFlags);
[StructLayout(LayoutKind.Sequential)] public struct VIDEOHDR
{
[MarshalAs(UnmanagedType.I4)] public int lpData;
[MarshalAs(UnmanagedType.I4)] public int dwBufferLength;
[MarshalAs(UnmanagedType.I4)] public int dwBytesUsed;
[MarshalAs(UnmanagedType.I4)] public int dwTimeCaptured;
[MarshalAs(UnmanagedType.I4)] public int dwUser;
[MarshalAs(UnmanagedType.I4)] public int dwFlags;
[MarshalAs(UnmanagedType.ByValArray, SizeConst=4)] public int[] dwReserved;
}
FrameCallBack是一个回调函数,当捕获到一帧视频时,会自动触发该函数执行。
private void FrameCallBack(IntPtr lwnd, IntPtr lpVHdr)
{
AVICAP.VIDEOHDR videoHeader = new AVICAP.VIDEOHDR();
videoHeader = (AVICAP.VIDEOHDR)AVICAP.GetStructure(lpVHdr,videoHeader);
AVICAP.BITMAPINFOHEADER btComeepre = new serverWin.AVICAP.BITMAPINFOHEADER();
if(videoHeader.dwBytesUsed!=0)
{
byte[] VideoData = new byte[videoHeader.dwBytesUsed];
AVICAP.Copy(videoHeader.lpData ,VideoData);
capGetVideoFormat(this.lwndC,ref btComeepre,AVICAP.SizeOf(btComeepre));
display(mControlTo,mWidthTo,mHeightTo,VideoData,btComeepre);
}
}
public void display(IntPtr handle, int width,int height,byte[] _bmpDate,AVICAP.BITMAPINFOHEADER _btm)
{
//hdc是绘图控件句柄
IntPtr hdc =AVICAP.GetDC(handle);
//hdd是设备环境
IntPtr hdd=AVICAP.DrawDibOpen();
//下面代码操作内存
unsafe
{
//获取图象头指针
IntPtr phead = Marshal.AllocHGlobal(sizeof(AVICAP.BITMAPINFOHEADER));
//将参数图象头结构拷贝到非托管区,phead指针指向该区域
Marshal.StructureToPtr(_btm,phead,true);
//为BMP数据分配指针
IntPtr pdata = Marshal.AllocHGlobal(_btm.biSizeImage);
//将参数BMP图象数组拷贝到非托管内存区,pdata指针指向该区域
Marshal.Copy(_bmpDate,0,pdata,_btm.biSizeImage);
try
{
//执行这个函数就要出异常,为什么?
AVICAP.DrawDibDraw(hdd,hdc,0,0,width,height,phead,pdata,0,0,_btm.biWidth,_btm.biHeight,AVICAP.DDF_SAME_DRAW|AVICAP.DDF_SAME_HDC);
}
catch(Exception ex)
{
throw ex;
}
AVICAP.DrawDibEnd(hdd);
AVICAP.DrawDibClose(hdd);
}
}
问题:我测试过图象头和图象的数据(phead和pdata指针指向),没有任何问题,为什么在调用DrawDibDraw时会出现异常?异常消息是:未将对象引用到对象实例。
拜托各位高人了,我想了一天都没得到解决,估计错误是不是在DrawDibDraw函数要求BMP图片流的原始位置,而不是拷贝到非托管内存中的数据的位置?