C# 海康威视网络半球摄像头回调YV12取画面
2024-10-21 06:48:15
海康网络摄像头回调取画面,网口最好用千兆的网卡来做,开始用笔记本的百兆网口,不管怎么优化都是卡顿的,
后来用千兆网卡台式机的,基本就没有卡顿了,取图再加上运动检测处理,基本上十几毫秒每帧。
用回调方式处理数据流方式,参见官方的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;
}
最新文章
- [APUE]进程控制(上)
- python 使用pip安装第三方模块
- Firefox about
- Bootstrap &ndash; 1.认识
- TC SRM 593 DIV2 1000
- css3圆角边框,边框阴影
- lintcode :Count 1 in Binary 二进制中有多少个1
- Scala:(3)数组
- shell入门之函数应用 分类: 学习笔记 linux ubuntu 2015-07-10 21:48 77人阅读 评论(0) 收藏
- ffmpeg调试相关知识点
- 【linux之进程管理,系统监控】
- 前端性能优化之gzip
- Redis结合Lua脚本实现高并发原子性操作
- iDoc「文档」功能强势升级!一键分享,即刻预览!(201903-1版本更新)
- Python循环文件推荐的方式,可用于读取文本最后一行或删除指定行等
- plsql developer 10注册码----亲测截止2017年5月6可用
- Impala SQL 使用小记
- C#调用DLL报“试图加载格式不正确的程序”
- W-D-S-UART编程
- selenium 无界面跑UI脚本
热门文章
- Map集合概述-Map常用子类
- QtQuick使用MediaPlayer抓取摄像头影响报错Error: ";Your GStreamer installation is missing a plug-in.";
- 【学习笔记】C/C++ 设计模式 - 观察者模式
- SpringBoot 三大开发工具,你都用过么?
- 为什么要使用 chmod 777
- 影片自由,丝滑流畅,Docker容器基于WebDav协议通过Alist挂载(百度网盘/阿里云盘)Python3.10接入
- WPF中使用LibVLCSharp.WPF 播放rtsp
- MySQL8.0 高可用集群化 &#183; mysql-shell &#183; mysql-router &#183; docker &#183; 单主多从
- vue跨域请求数据
- Bus Stop