海康网络摄像头回调取画面,网口最好用千兆的网卡来做,开始用笔记本的百兆网口,不管怎么优化都是卡顿的,

后来用千兆网卡台式机的,基本就没有卡顿了,取图再加上运动检测处理,基本上十几毫秒每帧。

用回调方式处理数据流方式,参见官方的Demo,本文只介绍相关的回调YV12取图,回调中的图像数据是庞大的,

在回调中只适合做简单的处理,如果处理过于复杂,会出现卡顿的现象。因为我只需要对图像进行运动检测处理,所以只是

简单取了图像的灰度图,具体如下:

//回调函数
private void DecCallbackFUN(int nPort, IntPtr pBuf, int nSize, ref PlayCtrl.FRAME_INFO pFrameInfo, int nReserved1, int nReserved2)
{
// 将pBuf解码后视频输入写入文件中(解码后YUV数据量极大,尤其是高清码流,不建议在回调函数中处理)
if (pFrameInfo.nType == 3) //#define T_YV12 3
{
int m_Width = pFrameInfo.nWidth;
int m_Height = pFrameInfo.nHeight;
//this.MeasureTime(() => {
var img = GetBitmapFromYV12(pBuf, m_Width, m_Height, nSize);
NewFrame?.Invoke((Bitmap)img.Clone());
img.Dispose();
// });
}
}

///把YV12数据转为BGR24数据,我只关心灰度图,因此只取了Y数据,如果想获取彩色图像,考虑计算UV数据

private unsafe bool YV12ToBGR24(byte* pYUV, byte* pBGR24, int width, int height)
{
if (width < 1 || height < 1 || pYUV == null || pBGR24 == null)
return false;
byte* yData = pYUV;
int yIdx;
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
yIdx = i * width + j;
pBGR24[yIdx * 3] = pBGR24[yIdx * 3 + 1] = pBGR24[yIdx * 3 + 2] = yData[yIdx];
}
}
return true;
}

///获取回调的图片
private unsafe Bitmap GetBitmapFromYV12(IntPtr pBuf, int width, int height, int nSize)
{
Bitmap bitmap = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
BitmapData bmpData = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, bitmap.PixelFormat);
byte* desPtr = (byte*)bmpData.Scan0;
byte* srcPtr = (byte*)pBuf;
YV12ToBGR24(srcPtr, desPtr, width, height);
bitmap.UnlockBits(bmpData);
return bitmap;
}

最新文章

  1. [APUE]进程控制(上)
  2. python 使用pip安装第三方模块
  3. Firefox about
  4. Bootstrap &ndash; 1.认识
  5. TC SRM 593 DIV2 1000
  6. css3圆角边框,边框阴影
  7. lintcode :Count 1 in Binary 二进制中有多少个1
  8. Scala:(3)数组
  9. shell入门之函数应用 分类: 学习笔记 linux ubuntu 2015-07-10 21:48 77人阅读 评论(0) 收藏
  10. ffmpeg调试相关知识点
  11. 【linux之进程管理,系统监控】
  12. 前端性能优化之gzip
  13. Redis结合Lua脚本实现高并发原子性操作
  14. iDoc「文档」功能强势升级!一键分享,即刻预览!(201903-1版本更新)
  15. Python循环文件推荐的方式,可用于读取文本最后一行或删除指定行等
  16. plsql developer 10注册码----亲测截止2017年5月6可用
  17. Impala SQL 使用小记
  18. C#调用DLL报“试图加载格式不正确的程序”
  19. W-D-S-UART编程
  20. selenium 无界面跑UI脚本

热门文章

  1. Map集合概述-Map常用子类
  2. QtQuick使用MediaPlayer抓取摄像头影响报错Error: &quot;Your GStreamer installation is missing a plug-in.&quot;
  3. 【学习笔记】C/C++ 设计模式 - 观察者模式
  4. SpringBoot 三大开发工具,你都用过么?
  5. 为什么要使用 chmod 777
  6. 影片自由,丝滑流畅,Docker容器基于WebDav协议通过Alist挂载(百度网盘/阿里云盘)Python3.10接入
  7. WPF中使用LibVLCSharp.WPF 播放rtsp
  8. MySQL8.0 高可用集群化 &#183; mysql-shell &#183; mysql-router &#183; docker &#183; 单主多从
  9. vue跨域请求数据
  10. Bus Stop