海康摄像头视频解码_摄像头视频流控解码-程序员宅基地

技术标签: tv  音视频  

海康摄像头获取视频帧数据可以通过NET_DVR_SetESRealPlayCallBack回调方法,视频帧默认为H.264帧,此帧能获取到音频和视频帧数据,回调方法如下:

音频和视频帧数据通过NET_DVR_PACKET_INFO_EX结构中的,dwPacketType属性进行判断

判断视频帧时仅需判断类型为1、2、3的帧即可,具体格式如下:

获取到H.264帧数据了,就需要对数据进行H.264解码,代码如下:

        unsafe void StrPacketInfo(int lPreviewHandle, ref NET_DVR_PACKET_INFO_EX packetinfo, uint dwUser)
        {
            if (packetinfo.dwPacketType == 1 || packetinfo.dwPacketType == 2 || packetinfo.dwPacketType == 3)
            {
                if (packetinfo.wWidth < 65535 && packetinfo.wHeight < 65535)
                {
                    int code = (int)packetinfo.dwPacketType;
                    int w = packetinfo.wWidth;
                    int h = packetinfo.wHeight;
                    FFDecoderAPI.FF_InitEx(0, w, h);
                    byte[] yuv = new byte[w * h * 3 / 2];
                    IntPtr yuvptr = Marshal.AllocHGlobal(yuv.Length);
                    FFDecoderAPI.FF_DecoderEx(0, packetinfo.pPacketBuffer, (int)packetinfo.dwPacketSize, yuvptr, w, h);
                    Marshal.Copy(yuvptr, yuv, 0, yuv.Length);
                    SetYuv(yuv, yuv.Length, w, h);
                    Marshal.FreeHGlobal(yuvptr);
                }
            }
            else if (packetinfo.dwPacketType == 10)
            {
                EasyVideoAPI.PushEasyFrame(packetinfo.pPacketBuffer, (int)packetinfo.dwPacketSize, false, false, Index);
            }
        }

这里用到了一个C++的H.264解码库:FFDecoder.lib

此类可以对H.264进行解码,解码输出为YUV420p格式为图像数据的拼接缩放等进行操作。

//=======================================================
//Decoder
#ifndef DECODER_H264
#define DECODER_H264			0x1C			//28
#endif
#ifndef DECODER_MPEG4
#define DECODER_MPEG4			0x0D			//13
#endif
#ifndef DECODER_MPEG2
#define DECODER_MPEG2			0x02			//2
#endif
#ifndef DECODER_MJPEG
#define DECODER_MJPEG			0x08			//8
#endif

#ifndef DECODER_MP3
#define DECODER_MP3				0x15001			//86017
#endif

#ifndef DECODER_AAC
#define DECODER_AAC				0x15002			//86018
#endif

//=======================================================
//输出格式
#ifndef OUTPUT_PIX_FMT_YUV420P
#define OUTPUT_PIX_FMT_YUV420P		0
#endif
#ifndef OUTPUT_PIX_FMT_YUYV422
#define OUTPUT_PIX_FMT_YUYV422		1
#endif
#ifndef OUTPUT_PIX_FMT_RGB565LE
#define OUTPUT_PIX_FMT_RGB565LE		44
#endif
#ifndef OUTPUT_PIX_FMT_RGBA
#define OUTPUT_PIX_FMT_RGBA			28
#endif

ManagerFFDecoder::ManagerFFDecoder()
{
	memset(ffDecoder, 0, sizeof(ffDecoder));
}

void ManagerFFDecoder::FF_Init(int _index, int _w, int _h)
{
	if (ffDecoder[_index] == NULL)
	{
		FFD_Init(&ffDecoder[_index]);
		int outfmt = OUTPUT_PIX_FMT_YUV420P;
		int incode = DECODER_H264;
		FFD_SetVideoDecoderParam(ffDecoder[_index], _w, _h, incode, outfmt);
	}
}

void ManagerFFDecoder::FF_Decoder(int _index, char* inbuf, int _bufsize, char* yuvbuf, int _w, int _h)
{
	if (ffDecoder[_index] != NULL)
		FFD_DecodeVideo3(ffDecoder[_index], inbuf, _bufsize, yuvbuf, _w, _h);
}

void ManagerFFDecoder::FF_Uinit(int _index)
{
	if (ffDecoder[_index] != NULL)
		FFD_Deinit(&ffDecoder[_index]);
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/evint888/article/details/122117963

智能推荐

jep自定义函数_jep 自定义-程序员宅基地

文章浏览阅读2.8k次。jep自定义函数jep自定义函数使用,下面是jep自定义函数计算年利率一个demojep在使用函数时,需要把相应的函数加入jep幂函数Jep jep = new Jep();jep.addFunction(“pow”, new Power());自定义函数也是如此1.定义年利率计算类AnnualInterestRate,由于需要多个参数,故继承NaryFunction类,该类根据个人..._jep 自定义

Oracle Linux 7.5安装oracle 12cR2数据库_linux7.5不用图形界面安装oracle12c-程序员宅基地

文章浏览阅读5.9k次,点赞4次,收藏22次。Oracle Linux 7.5安装oracle 12cR2数据库1 安装Oracle之前的环境准备1.1 预先准备安装oracle所需的RPM包(本次yum安装12cR2的基础环境RPM包进行全部基础包安装和参数设置,需要能访问外网且配置DNS)1.1.1 yum安装oracle官方的12cR2基础环境设置RPM包yum -y install oracle-database-ser..._linux7.5不用图形界面安装oracle12c

Python读取和操作Excel(.xlsx)文件_python打开或创建.xlsx文件,并获取活动表单-程序员宅基地

文章浏览阅读1w次,点赞4次,收藏38次。Python读取Excel使用openpyxl库来控制excel文件(即.xlsx为后缀的文件)。这里介绍一下excel数据的结构。打开excel文件后生成一个workbook(工作簿)每个工作簿中包含多张表单worksheet正在操作的表单被称为活跃表单active sheet对于某一特定行和列的小格子称为单元格cell安装使用pip安装,pip install openpyxl简单的步骤import openpyxl # 导入openpyxl模块wb = openpyxl.loa_python打开或创建.xlsx文件,并获取活动表单

进阶篇---Soft Actor-Critic (SAC)_soft actor critic 为什么需要两个网络-程序员宅基地

文章浏览阅读1.5k次。进阶篇—Soft Actor-Critic (SAC)SAC是一个off-policy + actor critic + maximum entropy的RL算法。比DDPG,SVG等方法稳定并且效果更好。代码参见我的GitHub前言1、on-policy 与 off-policy:on-policy:“边交互边学习” ,每一次参数更新时,都需要与环境交互,因而当遇到复杂任务时,需要的更新步骤更多,增大了复杂度off-policy :“重用过去的经验”,典型的就是经验池策略的方法,比如DQN,DD_soft actor critic 为什么需要两个网络

spring bean的循环引用-程序员宅基地

文章浏览阅读203次。看过一次spring公开课,记录一下bean的循环引用问题。问题:public class IndexService{  @Autowired  IndexDao indexDao;}public class IndexDao{  @Autowired  IndexService indexService;}以上的实例中IndexService依赖..._spring bean循环引用

Docker结合Jenkins部署vue项目_docker jenkins vue-cli-程序员宅基地

文章浏览阅读3.1k次。Docker结合Jenkins部署vue项目接上篇Vue项目没什么好说的,在本地一般使用vue ui启动vue管理的前端,然后在里面进行启动Vue官方说可以不通过ngin来部署,但是如果上生产环境,建议还是要走nginx安装nginx这里安装过程不再赘述,如果不清楚可以参考下面这篇文章https://blog.csdn.net/qq_42815754/article/details/8..._docker jenkins vue-cli

随便推点

uni-app开发之自定义导航栏_uniapp pages.json 自定义导航栏,打包导航栏还出现-程序员宅基地

文章浏览阅读434次。uni-app开发之自定义导航栏插件市场引入自定义导航栏:NavBar 导航栏路由设置“navigationStyle”,pages.json上设置: { "path" : "pages/home/warning/index", "style" : { _uniapp pages.json 自定义导航栏,打包导航栏还出现

0x00007FF9A7F72079 (ucrtbased.dll)处引发的异常: 0xC0000005: 写入位置 0x000000094D100000 时发生访问冲突_0x00007fffbd9cac87 (ucrtbased.dll)处(位于 mysql c++连接-程序员宅基地

文章浏览阅读1.7w次,点赞22次,收藏11次。此类型错误,需要更改为其temp中name数组的长度,在scanf_s中需要添加,在scanf中不需要。_0x00007fffbd9cac87 (ucrtbased.dll)处(位于 mysql c++连接.exe 中)引发的异常: 0

TiDB 混沌工程实践:如何打造健壮的分布式系统?-程序员宅基地

文章浏览阅读181次。本文转载自 InfoQ 网站作者:唐刘策划:赵钰莹原文链接:https://www.infoq.cn/article/bxGvrb_CxAZD6Wv3fUj8作为一个分布式数据库,TiDB 面临的严重挑战在于如何让用户相信存储在 TiDB 里面的数据是安全的,不会出现丢失,损坏等情况..._唐刘 tidb

android中的activity跳转动画_android13车载系统使用activity跳转动画-程序员宅基地

文章浏览阅读536次。仿微信页面平移跳转,android中的Activity跳转动画_android13车载系统使用activity跳转动画

SAP实现多个统御科目:特殊总账SGL+备选统驭科目Alternative Reconciliation Accounts_sap特别总账科目调账-程序员宅基地

文章浏览阅读7.9k次,点赞2次,收藏8次。问题: 客户或供应商因多种业务,需要多个统御科目1、特殊总账 SGL一个客户或供应商或资产默认只有一个统驭科目,F-02记账的时候,若不选特别总账标示,则记账在主记录中的统驭科目中,一般为应收应付。若关于此客户、供应商、资产等有非应收应付业务发生时,比如预收、预付、信用证、保证金等,此时记账虽然记账在客户供应商上,但不需要记账在往来科目上,此时就需要选择特别总账_sap特别总账科目调账

android常用控件ViewPager(二) ViewPager与Fragment_fragment viewpage2获取子fragment-程序员宅基地

文章浏览阅读355次。在上一篇中提到过ViewPager通常和Fragment一起使用来达到View的切换效果。为此google也提供了两个与Fragment的适配器。分别为 FragmentPagerAdapter与FragmentStatePagerAdapter。前者会缓存三个Fragment。后者在我们切换不同的Fragment的时候,我们会把前面的Fragment销毁。但会把我们的我们Fragment的Bund_fragment viewpage2获取子fragment