// PREVIEW VIDEO CALLBACK FUNCTION // //回调函数,进行视频流操作 EXPORTS.ReturnOfCallbackEnum on_process_preview_video_buffer(uint pDevice, double dSampleTime, uint pFrameBuffer, uint nFrameBufferLen, uint pUserData) { uint nCH = pUserData; if (b_bitmap[nCH] == true && pFrameBuffer != 0) { b_bitmap[nCH] = false; unsafe { pDstABGRBuffer = (byte *)memory.Alloc((int)(m_nVideoWidth * m_nVideoHeight * 4)); EXPORTS.QCAP_COLORSPACE_YUY2_TO_ABGR32(pFrameBuffer, m_nVideoWidth, m_nVideoHeight, m_nVideoWidth * 2, (uint)pDstABGRBuffer, m_nVideoWidth, m_nVideoHeight, m_nVideoWidth * 4); Bitmap bmp = new Bitmap((int)m_nVideoWidth, (int)m_nVideoHeight, PixelFormat.Format32bppRgb); BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.WriteOnly, bmp.PixelFormat); byte[] managedArray = new byte[(m_nVideoWidth * m_nVideoHeight * 4)]; Marshal.Copy((IntPtr)pDstABGRBuffer, managedArray, 0, (int)(m_nVideoWidth * m_nVideoHeight * 4)); Marshal.Copy(managedArray, 0, bmpData.Scan0, (int)(m_nVideoWidth * m_nVideoHeight * 4)); bmp.UnlockBits(bmpData); switch (nCH) { case 0: { PicTosql1(bmp, nCH); } break; case 1: { PicTosql(bmp, nCH); } break; case 2: { PicTosql(bmp, nCH); } break; case 3: if (m_nNetworkServerState_v[nCH] > 0x00000000) { PicTosql(bmp, nCH); } break; default: break; } } //string strOutput = "CH" + (nCH + 1).ToString() + " : on_process_preview_video_buffer => pDevice : " + pDevice.ToString() + " , dSampleTime : " + dSampleTime.ToString() + " , pFrameBuffer : " + pFrameBuffer.ToString() + " , nFrameBufferLen : " + nFrameBufferLen.ToString() + " , pUserData : " + pUserData.ToString() + " \n"; //OutputDebugString(strOutput); } return(EXPORTS.ReturnOfCallbackEnum.QCAP_RT_OK); }