获取海康威视实时流用平台支持的RTMP推流组件libEasyRTMP向服务器推流数据的处理方法

背景分析

RTMP是Real Time Messaging Protocol(实时消息传输协议)的首字母缩写,该协议基于TCP,是一个协议族,包括RTMP基本协议及RTMP/RTMPS/RTMPE等多种变种。RTMP是一种设计用来进行实时数据通信的网络下ieyi,主要用来在Flash/AIR平台和支持RTMP协议的流媒体/交互服务器之间进行音视频和数据通信。RTMP推流,就是将直播内容推送到服务器的过程。

EasyRTMP是结合了多种音视频缓存及网络技术的一个rtmp直播推流端,包括:圆形缓冲区(circular buffer)、智能丢帧、自动重连、rtmp协议等等多种技术,能够非常有效地适应各种平台(Windows、Linux、ARM、Android、iOS),各种网络环境(有线、wifi、4G),以及各种情况下的直播恢复(服务器重启、网络重启、硬件设备重启)。

 

获取海康威视实时流用libEasyRTMP向服务器推流数据处理

1、根据SDK接入方式先进行设备登录

NET_DVR_Login_V30(DeviceIP,m_nLoginPort,cUserName,cPassword,&devInfo)

2、启动实时预览

NET_DVR_RealPlay_V40(m_lUserID[nI],&struPlayInfo,fRealDataCallBack, this)

3、在fRealDataCallBack回调函数中处理视频流数据(包括复合流和音视频分开的视频流数据),类型定义为NET_DVR_STREAMDATA。

详细处理过程:
判断回调数据类型(NET_DVR_STREAMDATA ——> 海康PS数据Demux成音视频ES数据(GetH246FromPS) ——> 对关键帧数据做缓存和处理(bIsKeyFrame ) ——> 进入转推RTMP缓存队列(WriteH264DataToChace)
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;
					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;
					}
					m_mFrameCacheLenth[lRealHandle] = 0;
				}
			}
		}
	}

//从PS流中取H264数据
//返回值:是否为数据包 
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缓存队列
//H264数据写入写文件缓存队列
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推送RTMP
		EASY_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;
}

相关推荐

docker部署方式及二进制部署转docker部署详解

本文详细介绍了EasyNVR的Docker部署方式升级及二进制转Docker的方法。旧版Docker部署存在数据丢失风险,新版通过挂载/app目录实现完整数据持久化。升级方式可直接执行新命令或使用compose文件。对于二进制部署用户,转为Docker部署可简化管理流程,提供两种转换方式:1)在部署目录执行新Docker命令;2)通过compose文件转换。转换后配置可完整继承,并可通过图形界面管理服务。文中提供了相关文档和视频教程链接。

EasyNVR官方技术博客 402

EasyNVR使用Docker部署升级的技术分享

EasyNVR升级方案解析:本文详细介绍了EasyNVR的两种升级方式。Web页面升级适用于传统部署用户,需从官网下载对应系统架构的安装包;Docker升级则通过拉取最新镜像实现,但需注意授权文件更新问题。针对NAS用户,特别设计了智能升级脚本,可自动比较镜像版本并执行更新,同时解决HTTPS证书自动生成问题。该方案兼顾了Web升级和Docker升级的优势,实现了二进制部署与容器化部署的无缝转换,但存在无法降级和镜像更新提示的局限性。

EasyNVR官方技术博客 1331

docker版EasyNVR如何使用同步插件教程(包含网盘挂载,路径映射等)

本文介绍了在飞牛NAS上部署CloudDrive2和EasyNVR的详细步骤。CloudDrive2通过FUSE挂载将云存储转为本地磁盘,支持多网盘管理,提供Docker和图形界面两种安装方式。EasyNVR则通过Docker部署实现视频监控功能,包括Compose文件和命令行两种安装方法,并详细说明了网络配置和目录映射要点。最后介绍了如何配置同步插件,实现视频文件自动备份到云存储。整个过程涵盖了从软件安装、配置到使用的完整流程,适合NAS用户快速搭建云存储和视频监控系统。

EasyNVR官方技术博客 5122

NVR也能存网盘!硬盘不够网盘来凑,本地存7天网盘存足180天,夸克网盘/阿里云盘/百度网盘/123云盘/天翼云盘一起上

通过巧妙结合本地快速访问与云端长期存储的优势,EasyNVR实现了存储效率与成本控制的完美平衡,为用户提供了真正可靠、经济且灵活的监控存储解决方案。

EasyNVR官方技术博客 1342

硬盘涨价不用慌!EasyNVR 录像同步功能,帮你省下存储成本

一款产品能否在市场中站稳脚跟、行稳致远,考验的正是前瞻性布局。

EasyNVR官方技术博客 503

EasyNVR,让视频接入更简单,让集成开发更自由

如何将接入 EasyNVR 的视频资源,引入自己的系统里播放呢?

EasyNVR官方技术博客 492

赋能信创:EasyNVR 推动安防国产化进程

EasyNVR 积极响应国产化战略要求,构建了覆盖全栈的国产化适配体系,实现了从操作系统到芯片架构的全面兼容,致力于为关键行业提供安全可靠、自主可控的视频监控解决方案。

EasyNVR官方技术博客 271

EasyNVR 助力构建执法管理新范式

以技赋能,EasyNVR让执法数据管理更智能。

EasyNVR官方技术博客 906

连锁品牌监控难?EasyNVR 一招搞定!省钱又省心​

如何让连锁门店省钱还能存录像,又能让总部实时查看所有门店画面和历史录像呢?别纠结,EasyNVR 羊毛直接薅!

EasyNVR官方技术博客 734

EasyNVR:校园监控的 “智慧中枢”,让管理化繁为简

面对校园监控的管理痛点,EasyNVR 作为专业的视频汇聚管理平台,以 “兼容、汇聚、智能” 为核心,成为破解 “监控孤岛” 的关键。

EasyNVR官方技术博客 685

EasyNVR 录像自由时段启停与快照定时更新

EasyNVR 支持对通道录像随时启停,以及快照定时更新。

EasyNVR官方技术博客 411

告别设备存储焦虑!EasyNVR+EasyGBD 让 “轻装录像” 成为可能

所有新增到 EasyNVR 的设备,都会自动开启全天候录像,无需人工手动触发。而 GB28181 就是最适配此功能的视频传输协议,无需依赖手机、执法仪等手持设备的本地存储空间,“设备只负责推流,存储全靠平台”。

EasyNVR官方技术博客 514

非国标设备 / 无存储前端,也能向国标平台推送历史视频了!

EasyNVR 7.7.281版本新增级联共享平台端录像功能,适用于非国标设备接入(如RTSP/ONVIF设备)和无本地存储条件两种场景。用户可通过高级配置中的文本编辑修改"级联共享本地录像"参数(默认false推送设备端录像,设为true则推送EasyNVR平台端录像),修改后需重启服务生效。注意两种推送模式不可同时使用。

EasyNVR官方技术博客 400

EasyNVR 新功能:非国标设备流转 GB28181 输出,有效解决多场景接入难题

7.7.281 版本起,EasyNVR 将支持 RTSP、RTMP、ONVIF 设备通过 GB28181 级联转推其他国标平台,有力解决非国标设备云端汇聚的接入难题。

EasyNVR官方技术博客 1308

20250911:“小豚当家”摄像头接入 EasyNVR 推荐使用 RTSP 协议

EasyNVR 是通过 “获取设备系统日期及时间” 来检测设备在离线状态的。

EasyNVR官方技术博客 1169

20250905:EasyNVR 联网授权如何使用?

为了给用户提供更多选择,尤其满足家庭及个人用户的使用需求,我们现已新增 “联网授权” 功能。该模式下,所有授权信息均与您的个人账号绑定,并且支持更换服务器,无需再担心硬件丢失或机器更换问题。

EasyNVR官方技术博客 1237

EasyNVR添加海康设备后,为什么播放视频会返回500错误?

EasyNVR可将传统监控行业配备的高清网络摄像机IP Camera 、NVR等支持RTSP/ONVIF协议输出的设备进行接入,实现对设备源的音视频数据的采集、转换以及多格式(HLS/FLV/RTSP/RTMP/WebRTC等)输出,并进行全平台(PC浏览器/Android/iOS/微信)、全终端(电脑/智能手机/OTT电视)的分发。幸运的是,通过检查和调整摄像机的配置,我们可以有效地解决这一问题。UDP是一种无连接的、不可靠的传输协议,但它具有传输速度快、实时性好的特点,非常适合用于视频流的传输。

EasyNVR官方技术博客 495

EasyNVR平台现支持AAC、G711A及G711U音频编码格式

EasyNVR不仅能汇聚和管理多个NVR,进行实时视频和录像视频的查看,还能够对NVR设备状态和工作状态进行实时的监测和预警,监测内容包括摄像机离线、录像缺失、画面遮挡、信号丢失等等。EasyNVR平台对这三种音频编码格式的支持,不仅满足了用户在音质、压缩率和兼容性等方面的多样化需求,还为视频流媒体服务的广泛应用提供了坚实的技术保障。未来,EasyNVR将继续关注用户需求,不断探索和引入新技术,以提供更加完善和先进的解决方案,助力用户在各种应用场景中实现更高效的管理和运营。3)查看【音频编码格式】。

EasyNVR官方技术博客 524

NVR批量管理软件/平台EasyNVR多个NVR同时管理级联到上级平台通道数量为什么显示不正确?

考虑到视频监控系统对我们的生活,工作有着千丝万缕,于是我们将NVR批量管理软件/平台EasyNVR的功能做了精进,NVR小程序接入平台/设备EasyNVR目前也支持国标GB28181协议的级联了,只要上级平台支持国标协议,即可将海康NVR管理平台/工具EasyNVR作为下级平台级联上去。这个问题涉及到NVR管理平台EasyNVR与上级平台时级联的设置,NVR管理平台EasyNVR在使用中需要设置好RTSP地址,如果没有设置RTSP地址,级联出去默认为不开启。

EasyNVR官方技术博客 447

NVR监测软件/设备EasyNVR可不可以直接实现导入NVR设备录像的视频流?

该平台支持多种协议接入,包括RTSP、RTMP、GB28181等,支持多种视频流格式的分发,包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等,可以实现视频流的导入、录像、存储和回放等功能。7)安全与预警:NVR管理平台EasyNVR多个NVR同时管理还提供了设备状态监测和预警功能,可以实时监测NVR设备的状态,包括摄像机离线、录像缺失、画面遮挡、信号丢失等。3)设置录像计划:NVR管理平台EasyNVR平台支持云端录像设置,包括录像计划、选择录像通道、录像查看等功能。

EasyNVR官方技术博客 933

智能汽车制造:海康NVR管理平台/工具EasyNVR多品牌NVR管理工具/设备实现无插件视频监控直播方案

在我们如今的企业管理程序中,由于安全保障要求在不断提高,监控系统也成为了我们生活中日益重要的角色,把已有和待建的网络系统与监控系统结合起来不仅可以最大程度地减少工程的改造周期,同时避免了资金的重复投入和提高了网络资源的使用率。对于某些企业、工厂等,在企业工厂内部安装一整套局域网上的网络视频监控系统,公司管理人员不但可以在办公室随时监控整个企业状况,同时也可实现通过Internet看见并控制企业内部的摄像机,随时了解企业的生产工作情况。与此同时,网络也成为先进的新兴应用提供了一个良好的平台。

EasyNVR官方技术博客 862

EasyNVR大华NVR管理平台/工具提升监控系统的安全性的方法

EasyNVR平台通过多协议兼容、实时监控与云存储、智能告警、用户权限管理等功能,有效提升NVR安防系统的安全性。

EasyNVR官方技术博客 477

在视频汇聚平台EasyNVR平台中使用RTSP拉流的具体步骤

经过研发的优化及一系列严谨的验证流程,我们已确认优化后的EasyNVR平台,通过Pull方式添加海康设备的RTSP流已经能够正常播放。在此处,我们将之前获取的海康设备的RTSP流地址粘贴到相应的输入框中,并点击确认以完成添加。第三步:完成添加后,我们再次进入【设备列表】,并点击对应设备的【通道列表】。此时,您应该能够清晰地看到,通过Pull方式添加的海康设备的RTSP流正在正常播放。综上所述,我们已充分证明了在EasyNVR平台中通过Pull方式添加海康设备的RTSP流地址的可行性。

EasyNVR官方技术博客 518

多个NVR同时管理EasyNVR平台的按需拉流超时配置不生效?

之前有用户反馈EasyNVR平台的按需拉流超时配置不生效,经过研发的优化,及经过一系列详尽的步骤验证,我们已确认EasyNVR平台的按需拉流超时配置现已能够正常生效。首先,登录至EasyNVR平台,依次点击【系统设置】-【配置中心】-【基础配置】,在此处找到【按需拉流超时】配置项,并将其时间设定为70秒,随后点击保存以应用此设置。在此列表中,您可以观察到,在无人观看的情况下,视频流的活跃状态将在70秒后自动结束,即视频流被关闭。最后,返回【设备列表】,选择之前查看的在线设备,并再次进入其【通道列表】。

EasyNVR官方技术博客 527

EasyNVR 破局鸽子养殖管理!NFC 触发 + 10 秒精准录屏 + 云端备份,归巢过程看得见

NFC 触发 + 10 秒精准录屏 + 云端备份,鸽子归巢过程看得见!

EasyNVR官方技术博客 682

在EasyNVR平台中使用iframe地址播放视频时无法全屏的解决办法

有用户反馈,在使用EasyNVR平台的iframe地址播放视频时无法全屏。该问题已在最新版本(V7.4.13)中修复。第四步:按照上述步骤添加参数,使用此地址进行嵌入,即可实现全屏播放。第一步:选择需要使用iframe地址的设备,点击【通道列表】。第二步:点击【直播共享】→【跳转分享页面】。

EasyNVR官方技术博客 415

如何在EasyNVR平台上使用RTMP协议推流?

2、创建RTMP设备后,平台页面上方会提示新增设备的推流地址,可以直接复制使用;3、在摄像机(海康)【高级配置】-【RTMP】中勾选【启用】,在【服务器地址】中填写复制的推流地址,点击确认。1、在EasyNVR平台【设备列表】菜单,点击添加按钮,"协议类型"选择RTMP,输入名称后点击确定;2、进入OBS,点击【设置】-【直播】,服务选择自定义,输入推流地址,密钥填入推流码;3、在OBS上开始直播后,可以回到EasyNVR平台查看推流效果。返回主界面,点击"开始直播",即可推流。

EasyNVR官方技术博客 638

NVR批量管理平台EasyNVR平台在多屏播放时没有声音如何解决?

随着视频监控技术的不断发展,用户对视频监控系统的需求也在不断升级。EasyNVR平台以其强大的功能和灵活性,为用户提供了高效的视频监控解决方案。然而,在使用过程中,用户可能会遇到一些特定的问题,比如在多屏播放时没有声音的情况。为了解决这一问题,我们提供了详细的步骤指导。接下来,我们将详细介绍如何在EasyNVR平台上解决音频问题。

EasyNVR官方技术博客 607

EasyNVR添加海康设备后,为什么播放视频会返回500错误?

EasyNVR可将传统监控行业配备的高清网络摄像机IP Camera 、NVR等支持RTSP/ONVIF协议输出的设备进行接入,实现对设备源的音视频数据的采集、转换以及多格式(HLS/FLV/RTSP/RTMP/WebRTC等)输出,并进行全平台(PC浏览器/Android/iOS/微信)、全终端(电脑/智能手机/OTT电视)的分发。幸运的是,通过检查和调整摄像机的配置,我们可以有效地解决这一问题。UDP是一种无连接的、不可靠的传输协议,但它具有传输速度快、实时性好的特点,非常适合用于视频流的传输。

EasyNVR官方技术博客 426

EasyNVR平台现已支持AAC、G711A及G711U音频编码格式

EasyNVR不仅能汇聚和管理多个NVR,进行实时视频和录像视频的查看,还能够对NVR设备状态和工作状态进行实时的监测和预警,监测内容包括摄像机离线、录像缺失、画面遮挡、信号丢失等等。EasyNVR平台对这三种音频编码格式的支持,不仅满足了用户在音质、压缩率和兼容性等方面的多样化需求,还为视频流媒体服务的广泛应用提供了坚实的技术保障。未来,EasyNVR将继续关注用户需求,不断探索和引入新技术,以提供更加完善和先进的解决方案,助力用户在各种应用场景中实现更高效的管理和运营。3)查看【音频编码格式】。

EasyNVR官方技术博客 461
上一篇: RTSP播放器高起播低延时RTSP网页无插件流媒体播放器EasyPlayer-RTSP代码解析(C#版)
下一篇: 支持Windows、Android、iOS三个平台的全功能安防视频流媒播放器EasyPlayerPro-IOS播放不成功问题解决方案
EasyNVR
EasyNVR 企业官方账号 企业官方账号
博客等级 码龄8年 1545粉丝 1195原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值