在上一篇方案《EasyRTMP结合海康HCNetSDK获取海康摄像机H.264实时流并转化成为RTMP直播推流(附源码)》中我们介绍了将海康安防摄像机进行互联网直播的整体方案流程,其中有一个“数据处理与分析”流程我们没有详细描述,今天我们将详细介绍一下海康HCNetSDK实时预览回调接口数据处理的过程,尤其是在RealDataCallback中对AVData的处理过程:

  ```case NET_DVR_STREAMDATA:{BOOL inData=PlayM4_InputData(nPort,pBuffer,dwBufSize);while (!inData){Sleep(10);inData=PlayM4_InputData(nPort,pBuffer,dwBufSize);OutputDebugString("PlayM4_InputData failed \n");   }   //PS流数据解析处理     {int nI = 0;int nCacheSize = 0;nI = m_mFrameCacheLenth[lRealHandle];//直接--提取H264数据BOOL bVideo = FALSE;BOOL bPatialData = FALSE;bPatialData = GetH246FromPS(pBuffer,dwBufSize, &m_pFrameCache[lRealHandle][nI].pCacheBuffer, m_pFrameCache[lRealHandle][nI].nCacheBufLenth, bVideo);if (bVideo){if (bPatialData)//部分包数据{//缓存数据m_pFrameCache[lRealHandle][nI].lTimeStamp = clock();m_mFrameCacheLenth[lRealHandle]++;} else//包头{int i = 0;if(m_mFrameCacheLenth[lRealHandle]>0){long lH264DataLenth = m_mFrameCacheLenth[lRealHandle]*MAX_PACK_SIZE;BYTE* pH264Nal =  NULL;pH264Nal = new BYTE[lH264DataLenth];memset(pH264Nal, 0x00, lH264DataLenth);BYTE* pTempBuffer = pH264Nal;int nTempBufLenth = 0;//TRACE("m_mFrameCacheLenth==%d\r\n", pDemoDlg->m_mFrameCacheLenth);// 最大缓存数据个数设为pDemoDlg->m_mFrameCacheLenth,程序会过程中报错,Why? [5/6/2014-13:19:51 Dingshuai]for (i=0; i</*MAX_FRAME_LENTH*/m_mFrameCacheLenth[lRealHandle]; i++){if(m_pFrameCache[lRealHandle][i].pCacheBuffer!=NULL&&m_pFrameCache[lRealHandle][i].nCacheBufLenth>0){//                                        memcpy(pTempBuffer, m_pFrameCache[i].pCacheBuffer, m_pFrameCache[i].nCacheBufLenth);//                                      pTempBuffer = pTempBuffer + m_pFrameCache[i].nCacheBufLenth;memcpy(pH264Nal+nTempBufLenth, m_pFrameCache[lRealHandle][i].pCacheBuffer, m_pFrameCache[lRealHandle][i].nCacheBufLenth);nTempBufLenth += m_pFrameCache[lRealHandle][i].nCacheBufLenth;}if (m_pFrameCache[lRealHandle][i].pCacheBuffer){delete [](m_pFrameCache[lRealHandle][i].pCacheBuffer);m_pFrameCache[lRealHandle][i].pCacheBuffer = NULL;} m_pFrameCache[lRealHandle][i].nCacheBufLenth = 0; }if (m_bRtmpRunning && pH264Nal && nTempBufLenth>0){BOOL bIsKeyFrame = FALSE;//查找是否为关键帧if(pH264Nal[4]==0x67){bIsKeyFrame = TRUE;}long lTimeStamp = clock();WriteH264DataToChace(lRealHandle, pH264Nal, nTempBufLenth, bIsKeyFrame, lTimeStamp);}if (pH264Nal){delete []pH264Nal;pH264Nal = NULL;}// 缓存数据个数 清0m_mFrameCacheLenth[lRealHandle] = 0;}}}}}
```

通过对上述代码的分析,整个视频流回调过程还是比较简单的:判断回调数据类型(NET_DVR_STREAMDATA)–》海康PS流数据Demux成音视频ES流数据(GetH246FromPS)–》对关键帧数据做缓存和处理(bIsKeyFrame )–》进入转推RTMP缓存队列(WriteH264DataToChace)

海康PS流解析:

```
BOOL CDecCallBack_DemoDlg::GetH246FromPS(IN BYTE* pBuffer, IN int nBufLenth, BYTE** pH264, int& nH264Lenth, BOOL& bVideo)
{
if (!pBuffer || nBufLenth<=0)
{return FALSE;
}BYTE* pH264Buffer = NULL;
int nHerderLen = 0;if( pBuffer&& pBuffer[0]==0x00&& pBuffer[1]==0x00 && pBuffer[2]==0x01&& pBuffer[3]==0xE0)//E==视频数据(此处E0标识为视频)
{bVideo = TRUE;nHerderLen = 9 + (int)pBuffer[8];//9个为固定的数据包头长度,pBuffer[8]为填充头部分的长度pH264Buffer = pBuffer+nHerderLen;if (*pH264 == NULL){*pH264 = new BYTE[nBufLenth];}if (*pH264&&pH264Buffer&&(nBufLenth-nHerderLen)>0){  memcpy(*pH264, pH264Buffer, (nBufLenth-nHerderLen));}   nH264Lenth = nBufLenth-nHerderLen;return TRUE;
}
else if(pBuffer && pBuffer[0]==0x00&& pBuffer[1]==0x00&& pBuffer[2]==0x01&& pBuffer[3]==0xC0) //C==音频数据
{*pH264 = NULL;nH264Lenth = 0;bVideo = FALSE;
}
else if(pBuffer && pBuffer[0]==0x00&& pBuffer[1]==0x00&& pBuffer[2]==0x01&& pBuffer[3]==0xBA)//视频流数据包 包头
{bVideo = TRUE;*pH264 = NULL;nH264Lenth = 0;return FALSE;
}
return FALSE;
}
```

海康音视频数据进行RTMP推流:

```
int CDecCallBack_DemoDlg::WriteH264DataToChace(int nDevId, BYTE* pBuffer, int nBufSize, BOOL bIsKeyFrame, long lTimeStamp)
{
if (!pBuffer || nBufSize<=0 || lTimeStamp<0)
{return -1;
}BOOL bKeyFrame  = bIsKeyFrame;
int nDeviceType = nDevId+1;
if (m_RtmpHandle && m_bRtmpRunning)
{//H264推送RTMPEASY_AV_Frame  avFrame;memset(&avFrame, 0x00, sizeof(EASY_AV_Frame));avFrame.pBuffer = (unsigned char*)pBuffer;avFrame.u32AVFrameLen = nBufSize;avFrame.u32VFrameType = (bKeyFrame)?EASY_SDK_VIDEO_FRAME_I:EASY_SDK_VIDEO_FRAME_P;avFrame.u32AVFrameFlag = EASY_SDK_VIDEO_FRAME_FLAG;avFrame.u32TimestampSec = lTimeStamp/1000000;avFrame.u32TimestampUsec = (lTimeStamp%1000000);//EnterCriticalSection(&m_cs);EasyRTMP_SendPacket(m_RtmpHandle, &avFrame);
}return 1;
}
```

经过上述步骤,基本完成了对一路SDK数据回调的处理,如果需要一个完整的、系统的、中间级别的流转服务,则需要一套完整的控制机制和配套接口以及前端界面,就类似于EasyNVR一样。

EasyNVR方案架构

方案一

  • 服务器在本地,与IPCamera/NVR/编码器同在一个局域网,拥有一个内网IP地址又具有外网访问地址
  • 多个IPCamera/NVR/编码器仅有内网IP地址(无外网IP),EasyNVR通过内网拉取IPCamera/NVR/编码器的流数据

方案二

  • 服务器在公网(比如云主机、公网服务器),与设备不在同在一个局域网内
  • IPCamera/NVR/编码器单独或者共有固定的公网IP地址,EasyNVR服务器可以直接访问到设备

方案三

  • EasyNVS服务器部署在公网(比如云主机、公网服务器)
  • 有多个内网现场的直播设备需要进行公网直播
  • EasyNVR对接EasyNVS可以利用网络实现按需直播,同时屏蔽各种网络环境问题,适用于有线、WIFI、4G、专网
  • 支持云端运维,公网具体运维每个现场EasyNVR设备
  • EasyNVS管理平台能获取到EasyNVR的所有能力,并进行互联网化输出,同时进行统一化的管理和接口输出。

EasyNVR应用场景

EasyNVR可以说已经成为国内视频互联网化基础建设的排头兵,几乎各个民生行业都已经有了EasyNVR视频能力输出的身影,EasyNVR多年服务于各行各业视频基础建设,EasyNVR的可靠性、完整性、稳定性已经受到了业界的广泛认可!


雪亮工程

水利监控

网络直播

智慧农业

EasyNVR安防摄像机网页流媒体服务

EasyNVR是一款拥有完整、自主、可控知识产权,同时又能够具备软硬一体功能的安防互联网化流媒体服务器,能够通过简单的网络摄像机通道配置,将传统监控行业里面的高清网络摄像机IP Camera、NVR等具有RTSP、Onvif协议输出的设备接入到EasyNVR,EasyNVR能够将这些视频源的音视频数据进行拉取,转换为RTMP/HLS,进行全平台终端H5直播(Web、Android、iOS),并且EasyNVR能够将视频源的直播数据对接到第三方CDN网络,实现互联网级别的直播分发。详情可访问EasyNVR官网:http://www.easynvr.com

EasyRTMP:RTMP推流海康威视实时预览回调PS流用EasyRTMP向RTMP服务器推流中视频数据处理的代码相关推荐

  1. 海康威视实时预览回调PS流用EasyRTMP向RTMP服务器推流中视频数据处理的代码

    在上一篇方案<EasyRTMP结合海康HCNetSDK获取海康摄像机H.264实时流并转化成为RTMP直播推流(附源码)>我们介绍了将海康安防摄像机进行互联网直播的整体方案流程,其中有一个 ...

  2. Ant Design Form组件表单实时预览

    本篇文章主要是关于如何采用Form useWatch Hooks实现表单实时预览效果 文章目录 一.应用场景 二.useWatch 三.关键代码 一.应用场景 使用的场景主要来源于工作或者我们具体的项 ...

  3. 网络监控摄像头流媒体视频管理平台实时预览零延迟支持海康威视浙江大华宇视等解决方案分析

    方案简介 网络摄像头监控视频低延迟一直是一个比较难以解决的问题,很多非音视频开发专业的技术人员,花费了大量精力开发出来的各种集成网络监控摄像头在浏览器Web网页实时播放的程序,要么延迟非常高,要么及其 ...

  4. 海康威视摄像机Java SDK拉流(二)开启关闭实时预览

    上一篇:海康威视Java SDK拉流(一)初始化SDK 本篇介绍海康威视摄像机通过SDK开启关闭实时预览接口 下篇介绍实时预览的回调函数及解码库 测试环境: 系统:Centos 7 SDK:设备网络S ...

  5. 海康威视摄像机SDK二次开发--实时预览视频流保存到指定文件中

    开发海康威视sdk ,IPC设备,视频回调用的是官方提供的Demo中的(fRealDataCallBack ) 在最下面代码可以设置Thread.sleep()设置拍摄时长 文件结构 CameraIn ...

  6. Java海康威视摄像头实时预览视频流保存到指定文件中

    海康威视摄像头实时预览视频流保存到文件中 目前在开发海康威视sdk ,IPC设备,视频回调用的是官方提供的Demo中的(fRealDataCallBack ) 在最下面代码可以设置Thread.sle ...

  7. vue2实现海康威视根据海康插件进行监控实时预览和回放功能,全套代码,开箱即用。

    这是一套拿到手就能直接用的根据海康提供的摄像机节点实时预览和回放的全步骤代码,开箱即用. 前言 我的是基于vue2写的,vue3可以看我下一篇文章.  点击跳转至vue3关于海康视频开发文章. 很多人 ...

  8. Nginx+FFmpeg 海康、大华NVR实现rtsp转flv实时预览+录像回放

    工具准备FFmpeg,推流工具Nginx,要想实现Flv还需要安装模块nginx-http-flv-module,这个模块需要编译,如果是linux环境很方便,如果是windows环境,对不起,超级麻 ...

  9. antd picker 使用 如何_如何基于jsoneditor二次封装一个可实时预览的json编辑器组件?(react版)...

    前言 做为一名前端开发人员,掌握vue/react/angular等框架已经是必不可少的技能了,我们都知道,vue或react等MVVM框架提倡组件化开发,这样一方面可以提高组件复用性和可扩展性,另一 ...

最新文章

  1. java rectangle获取xy_JFreeChart 动态移动线 并求出两条线交点XY
  2. 优秀!21岁读博,26岁博士毕业即为副教授,同年又晋升教授和博导!
  3. spring之继承配置
  4. 线程池 java 新建方式_Java线程池的四种创建方式
  5. Oracle之to_char(值,'fm99990.00')
  6. Python Tricks(四)—— list of lists 的flatten
  7. android button 图片不缩放,ImageButton如何让图片按比例缩放不被拉伸
  8. VOA 2009.11.19-教育报道-美国大学创入学记录新高
  9. 02-Spring的核心API
  10. android 取消root,彻底告别安卓刷机时代!360超级ROOT正式宣布下线:取消ROOT权限
  11. org.springframework.core.styler包解读
  12. 【使用心得】ChatGPT做出行攻略
  13. 6款办公软件,文案人员常用到
  14. 一次ORA-3136的处理
  15. Python安装Pyinstaller失败,Preparing wheel metadata ... error
  16. python中pygame背景颜色为啥没生效_如何更改pygame中的背景图像?
  17. 蓝桥杯省赛 砝码称重(B组)
  18. CocoaLumberjack的ios应用开发使用指南
  19. 基于脑机接口的人脑控制机械手臂
  20. 支付宝服务窗 开发 验证

热门文章

  1. SLIP, PPP, L2F ,PPTP, L2TP的简介以及关联
  2. Android 录制视频和音频以及音频播放
  3. 即时通讯软件的前景分析
  4. 涂磊学计算机的为什么能进传媒岗位,情感嘉宾涂磊为什么口才那么好?他是什么学历?有过什么不同的经历?...
  5. 不知道的win10骚操作
  6. .NET 连接SqlServer数据库及基本增删改查
  7. 鸿蒙系统p50什么时候上市,华为p50最新官方消息_华为p50什么时候上市
  8. +1瀑布模型的主要特征是什么
  9. 初识Python必看基础知识~ 续(5)进阶之路~再接再厉~
  10. NPE nullpoNullPointerException问题