问题描述
通过C++读取视频图像后想要将视频图像数据实时在C#中使用,但是拷贝内存导致了帧率下降,请问什么办法能够使得C#直接读取C++分配的这块内存里的数据?
解决方案
解决方案二:
两种方式1.c++自己将数据通过http请求提交到asp.net网站,2.asp.net网站部分编写一个webservice,供c++调用
解决方案三:
建议用Socket!
解决方案四:
你可以用IntPtr返回内存指针(在c++中是DWORD在c#中是IntPtr),然后在c#中用unsafe代码使用指针处理这些数据,不过这样做不好,
解决方案五:
3楼的办法可以使用,不过看看稳定性再说。和C++做数据交互不安全的指针是不可避免的。
解决方案六:
以前在C#里做过和VC的数据交互,十分郁闷呀,数据是能取到,但是一会儿就出错了。最后推测是C#自动回收内存造成的。
解决方案七:
C++函数///ReturnType:void///player:CFlashPlayer*///buffer:void**///width:int*///height:int*///stride:int*///format:int*///获取当前的图像的内存[System.Runtime.InteropServices.DllImportAttribute("XSwfDec.dll",EntryPoint="flashplayer_get_current_bitmap",CallingConvention=System.Runtime.InteropServices.CallingConvention.StdCall)]publicstaticexternvoidflashplayer_get_current_bitmap(refSystem.IntPtrbuffer,refintwidth,refintheight,refintstride,refintformat);C#使用#region获得当前的内存中的位图IntPtrbufferPtr=IntPtr.Zero;intwidth=0;intheight=0;intstride=0;intformat=0;XSwfPlayerforWin.NativeMethods.flashplayer_get_current_bitmap(refbufferPtr,refwidth,refheight,refstride,refformat);XSwfPlayerforWin.NativeMethods.flashplayer_pause();Bitmapbit=newBitmap(width,height,stride,(System.Drawing.Imaging.PixelFormat)format,bufferPtr);objcrop.CropImage=(Image)bit;#endregion
解决方案八:
引用4楼mjp1234airen4385的回复:
3楼的办法可以使用,不过看看稳定性再说。和C++做数据交互不安全的指针是不可避免的。
~~~~
解决方案九:
我们现在的用的就是这样的。不c++的dll直接绑定了一个handle。c#只要传一个控件的句柄就可以了。
解决方案十:
涉及到应用程序间的数据交换问题,你可以使用webservice来实现。
解决方案十一:
拷贝内存尚且丢帧,就不应该有人硬往webservice这种东西上套了。
解决方案十二:
平台调用N多次,没出现没什么问题,注意数据类型的对应。C++可以传一个指针,C#里用Intptr
解决方案十三:
一次内存拷贝应该损失不了多少效率,降低帧率就更不太可能了,你帧率目前是多少?拷贝一次内存需要多长时间有没有计算过?