精华内容
下载资源
问答
  •  硬盘录像机协议汇总  目前,市场上主流的DVR厂商都开始对硬盘录像机作出诸多改进,比如包括对TCP/IP协议族的支持和动态地址支持等,同时,其设备还支持UPnP网络穿透、远程管理和远程访问等,本文将主要就支持DVR...

    目前,DVR的技术发展方向有三个,即智能化、集成化、网络化。本文为大家解析当前的DVR硬盘录像机技术应用。

      硬盘录像机协议汇总

      目前,市场上主流的DVR厂商都开始对硬盘录像机作出诸多改进,比如包括对TCP/IP协议族的支持和动态地址支持等,同时,其设备还支持UPnP网络穿透、远程管理和远程访问等,本文将主要就支持DVR网络化的相关技术进行解析。

      TCP/IP协议

      业内主流的DVR厂商都在产品资料中称支持完整的TCP/IP协议,不过对于传统的安防工程商来说,他们可能并不了解到底TCP/IP协议代表什么。

      事实上,TCP/IP是TransmissionControlProtocol/InternetProtocol的简写,中文译名为传输控制协议/网际协议,又叫网络通讯协议,这个协议是是Internet最基本的协议、Internet国际互联网络的基础,虽然从名字上看TCP/IP包括两个协议,传输控制协议(TCP)和网际协议(IP),但TCP/IP实际上是一组协议,它包括上百个各种功能的协议,如:远程登录、文件传输和电子邮件等,而TCP协议和IP协议是保证数据完整传输的两个基本的重要协议。通常说TCP/IP是Internet协议族,而不单单是TCP和IP,是因为TCP/IP协议包括TCP、IP、UDP、ICMP、RIP、TELNETFTP、SMTP、ARP、TFTP等许多协议,这些协议一起称为TCP/IP协议。

      由此可见,一台具备完善网络功能的DVR不单单是指具备TCP和IP两种协议,而且需要具备完整的TCP/IP协议族,这样才能称之为网络硬盘录像机。DVR常见的TCP/IP协议族中的典型应用有很多,下面列举两种比较常见的两种:

      NTP(NetworkTimeProtocol)是用来使计算机时间同步化的一种协议。视频监控信息是公安机关追查犯罪分子的重要信息源,那么时间上的准确性要求非常高。目前DVR支持的网络校时功能便是由NTP协议来实现的。

      SMTP(SimpleMailTransferProtocol)简单邮件传输协议是一种提供可靠且有效电子邮件传输的协议。具备SMTP协议的DVR便可通过网络将报警信息通过Email发送到客户的邮箱中。

      PPPoE

      PPPoE是point-to-pointprotocoloverethernet的简称,可以使以太网的主机通过一个简单的桥接设备连到一个远端的接入集中器上,目前流行的宽带接入方式ADSL就使用了PPPoE协议。

      但是采用了动态IP接入方式的ADSL,会遇到这样一个问题,每次用户通过ADSL拨号连接Internet时,ISP通常会分配给用户一个公共IP地址,这时候Internet上的其他用户就可以通过这个IP地址访问该计算机。但是,因为这个IP地址是动态的,也就是说一旦断线,下次再连接Internet的时候,ISP将会分配另一个不同的公共IP地址。这样就导致了用户通过Internet访问DVR时每次都要现场人员查看分配的IP地址是什么,再去访问,这么复杂的访问方式谁愿意去使用呢?所以DDNS技术便成了DVR必备的网络技术之一。

      DDNS

      DDNS(DynamicDomainNameServer)是动态域名服务的缩写,DDNS是将用户的动态IP地址映射到一个固定的域名解析服务上,用户每次连接网络的时候,客户端程序就会通过信息传递把该主机的动态IP地址传送给位于服务商主机上的服务器程序,服务项目器程序负责提供DNS服务并实现动态域名解析。

      采用DDNS技术的DVR,通过PPPoE拨号连接后,自动拨号连入Internet,并通过DHCP方式获取动态公网IP地址。将从域名服务提供商(如花生壳、3322.org)处获取的域名、用户名、密码输入监控设备,外网用户可通过该域名访问监控设备。

      UPnP

      UPnP即UniversalPlugandPlay(通用即插即用),从字面上很容易理解这个使得监控产品走向民用市场的技术。以往的视频监控系统专业性很强,在Internet网络进行远程访问时,可以通过端口映射、域名解析等技术,在路由器上进行设置后即可使得监控系统可以在外网进行访问。但是面对监控产品民用化的时代,在小区内对路由器进行设置是不现实的(因为一个小区里面的路由普通用户是无法接触的),而且普通用户也并非每个人都会设置。那么UPnP技术便很好地解决了这个问题,它的网络地址转换和NAT穿越技术帮助用户实现了只需输入监控设备的地址便可以直接远程浏览监控画面。目前市场上主流的IPC厂商都已支持该技术,但DVR厂商采用此技术的还比较少,小路数的DVR产品未来还是需要UPnP技术来提高产品竞争力。

      硬盘录像机技术汇总

      1、嵌入式软件/硬件技术

      嵌入式DVR的核心器件与PC类似,都是采用高性能的中央处理器CPU,兼容标准不同,功能各异,今后随着芯片技术的进一步发展,MIPS+DSP或者是ARM+DSP技术会更加适合嵌入式DVR。

      操作系统:目前市面上的嵌入式DVR采用的操作系统主要分为三类:第一类为厂家自己开发的简单RTOS;第二类为商业化的专用嵌入式操作系统,如VXWORKS/WinCE;第三类为源代码开放的LINUX操作系统。RTOS最简单高效,但其扩展性比较差,复杂功能实现比较困难;第二类操作系统有很好的系统特性,但其扩展性不是很好,许多功能扩展依赖第三方,且许可费用也比较高;第三类LINUX操作系统采用开放性的架构与模块化设计,可针对应用量身定做,去除与监控无关的多余功能,而且,LINUX支持多人、多工工作,只需要很少的硬件支持,这样的系统,效率更高,出错的机率更低。其可靠性经过验证,可以用在关键任务和场合的多应用操作系统,因特网使用的WEB服务器,都是24小时连续运行,其中绝大多数都是使用LINUX操作系统。他也是专门针对网络的应用推出的系统,所以它支持的网络协议很多,在相关软件的支持下,可实现WWW、FTP、DNS、DHCP、E-mail等服务。而且其内核代码完全公开,可以任意开发、更改。这样的特点使得全世界已超过千万人使用Linux,更由于许多厂商投入开发核心程序、发展相关软体以及硬件周边驱动程序,使Linux功能和完整性日益壮大。因此采用LINUX的操作系统也是大势所趋。

      2、硬盘管理技术

      嵌入式DVR硬盘管理系统分为两类,一是与PC机相同的FAT格式管理系统,第二种是嵌入式DVR生产厂家自行开发的,适合存储媒体数据流的硬盘管理系统。前者的优势在于无需投入研发成本,可以利用现成的PC技术。但此系统无法管理大数据包,只能进行分包,将一段完整的录像,分为若干个小的文件包,因此容易产生包与包之间丢帧现象;同时硬盘磁头需要频繁地读写数据与文件索引,磁头频繁跳动,对于每天十几到二十四小时连续读写硬盘的DVR系统,极容易造成硬盘故障;而如果硬盘录满后,需要删除整段文件,但新录制的文件与老的文件大小不同,由此会在硬盘上产生大量碎片空间,影响硬盘的使用和系统效率;另外,FAT文件系统用做录像机录像资料管理还存在两个风险,一是文件分配表如果损坏,则录像资料大多会丢失,二是系统突然断电或遭到人为破坏,当前的录像数据不能够保存。

      而第二种方式就可以从根本上修正上述的问题。因而从嵌入式DVR硬盘操作系统的发展方向看,长时间稳定录像采用第二种方式可以大幅度提高硬盘录像机的可靠性。但专用的文件系统需要专业公司具备相当的开发硬盘文件系统的能力与经验,目前国内只有少数几个厂家拥有该项技术。如浙江大华生产的所有嵌入式DVR都采用自行研发的文件管理系统,更采用硬盘休眠技术,延长了硬盘的使用寿命。今后如果要在嵌入式DVR立足,也必定要将专用文件管理纳入到研发的日程当中。

      3、算法技术

      在算法上,MPEG-IV的成熟应用及H264的应用扩大必将成为趋势。MPEG-IV产品的开发商越来越多,使得它成熟度愈来愈高。而H264因其更切合网络传输的要求成为主流。

      今后,为了使嵌入式DVR具有更广泛的适用性,各种算法的统一将是未来发展的趋势,但这种统一不是以国内哪个企业的标准为标准,需要广泛的政府职能部门与DVR产业链上的各类企业的广泛参与。

      4、网络技术

      新一代的嵌入式DVR已经具备与PC机相同的网络特性,今后的网络技术发展将使嵌入式DVR可以满足不同网络环境下图像传输要求。嵌入式DVR的网络技术正朝两个方向发展:一是专网技术条件下开发满足保安监控需求的高品质的网络录像机,其技术要求实时、清晰、可靠、组网灵活、分散存储、多级管理,其最终发展目标是取代模拟光缆条件下的图像传输市场;第二个网络技术是公网条件下的网络传输解决方案,由于公网网络传输条件差,因此为了最大限度保证在公网图像传输的QoS,需要采用多种新的网络和图像压缩传输技术,如流媒体技术等。

      综上所述,随着网络技术、识别技术、微电子技术、编解码技术、操作系统技术等的发展将使得嵌入式DVR向着智能化、集成化、无线化、高清晰化、个性化、互动化发展,今后更加开拓自动跟踪、特定目标跟踪、特定目标识别、摄取、处理等功能。

      而民用高清晰录像系统的发展将会影响嵌入式DVR的技术发展方向。由于民用高清晰录像市场巨大,前景广阔,国内外大的公司都在此投入人力物力,以期待取得突破性进展,如果在不久的将来,高清晰度影系统广泛普及,其技术及标准也会为视频监控系统所使用,变成数字监控系统的事实标准。DVR生产企业正密切关注高民用清晰视频发展,并不断探索将其技术应用到保安监控领域的可能性

     

    原文来自:http://tech.hexun.com/2012-06-11/142323108.html

    转载于:https://www.cnblogs.com/Jim-william/p/4092304.html

    展开全文
  • 录像机vtr控制的串口协议文档,供视频开发人员参考
  • 在《海康大华等安防摄像机采用通用RTSP协议流转RTMP推送至Web无插件播放展示的流程方法》中,我们分析了整个将安防设备互联网化的主要思路,同时...EasyRTSPLive就是RTSP to RTMP,拉流IPC摄像机或者NVR硬盘录像机R...

    《海康大华等安防摄像机采用通用RTSP协议流转RTMP推送至Web无插件播放展示的流程方法》中,我们分析了整个将安防设备互联网化的主要思路,同时介绍了安防RTSP协议进行话联网化的RTMP输出的方法,这里我们主要介绍的就是其中描述的专门将RTSP流转换成RTMP推流的EasyRTSPLive的实现方法:

    EasyRTSPLive就是RTSP to RTMP,拉流IPC摄像机或者NVR硬盘录像机RTSP流转成RTMP推送到阿里云CDN/腾讯云CDN/RTMP流媒体服务器,支持多路RTSP流同时拉取并以RTMP协议推送发布,EasyRTMPLive我们支持任何平台,包括但不限于Windows/Linux/Android/ARM;

    技术点分析:

    1. RTSP拉流:

    EasyRTSPLive拉流采用的是EasyRTSPClient进行拉流,EasyRTSPClient在流媒体领域已经历练多年,主要做的事情就是将RTSPServer的流获取到本地,并进行标准化的组包和解析,EasyRTSPClient拉流比较的可控,尤其是在兼容和保活、重连、自定义数据选取方面;

    1. H.264/H.265和PCM数据的分析:

    EasyRTSPClient中内置了对整个RTSP/RTP过程的分析和解析,包括对RTSP流程的SDP信息、RTP过程中的Timestamp、I帧、P帧的分析;

    1. RTMP推流:

    RTMP推流这里采用的是EasyRTMP,EasyRTMP支持RTMP/FLV协议的重连,而且EasyRTMP是支持H.265的,这个在视频领域,尤其是在安防领域还是比较重要的,现在CDN都支持H.265;

    1. AAC音频编码:

    EasyRTSPClient本身没有转码的功能,如果需要转码,需要借助于外围的配合,在音频标准化方面,可选择用EasyAACEncoder,资源消耗低、稳定;

    1. EasyRTSPClient和EasyRTMP都采用的是fork子线程,主线程控制子线程重连的方案,达到稳定、高可用的目标;

    源码解析

    #define _CRTDBG_MAP_ALLOC
    #include <stdio.h>
    #ifdef _WIN32
    #include "windows.h"
    #else
    #include <string.h>
    #include <unistd.h>
    #endif
    #include "getopt.h"
    #include <stdio.h> 
    #include <iostream> 
    #include <time.h> 
    #include <stdlib.h>
    //#include <vector>
    #include <list>
    
    #include "EasyRTSPClientAPI.h"
    #include "EasyRTMPAPI.h"
    #include "ini.h"
    #include "trace.h"
    
    #ifdef _WIN32
    #pragma comment(lib,"libEasyRTSPClient.lib")
    #pragma comment(lib,"libeasyrtmp.lib")
    #endif
    
    #define MAX_RTMP_URL_LEN 256
    
    #define BUFFER_SIZE  1024*1024
    #define MAX_CHANNEL_INDEX 1024
    #define CONF_FILE_PATH  "Config.ini"  
    
    typedef struct _channel_cfg_struct_t
    {
    	int channelId;
    	int option;
    	char channelName[64];
    	char srcRtspAddr[512];
    	char destRtmpAddr[512];
    }_channel_cfg;
    
    typedef struct _rtmp_pusher_struct_t
    {
    	Easy_Handle rtmpHandle;
    	unsigned int u32AudioCodec;	
    	unsigned int u32AudioSamplerate;
    	unsigned int u32AudioChannel;
    }_rtmp_pusher;
    
    typedef struct _channel_info_struct_t
    {
    	_channel_cfg		fCfgInfo;
    	_rtmp_pusher		fPusherInfo;
    	Easy_Handle	fNVSHandle;
    	FILE*				fLogHandle;
    	bool				fHavePrintKeyInfo;
    	EASY_MEDIA_INFO_T	fMediainfo;
    }_channel_info;
    
    static std::list <_channel_info*> gChannelInfoList;
    
    int __EasyRTMP_Callback(int _frameType, char *pBuf, EASY_RTMP_STATE_T _state, void *_userPtr)
    {
    	_channel_info* pChannel = (_channel_info*)_userPtr;
    
    	switch(_state)
    	{
    	case EASY_RTMP_STATE_CONNECTING:
    		TRACE_LOG(pChannel->fLogHandle, "Connecting...\n");
    		break;
    	case EASY_RTMP_STATE_CONNECTED:
    		TRACE_LOG(pChannel->fLogHandle, "Connected\n");
    		break;
    	case EASY_RTMP_STATE_CONNECT_FAILED:
    		TRACE_LOG(pChannel->fLogHandle, "Connect failed\n");
    		break;
    	case EASY_RTMP_STATE_CONNECT_ABORT:
    		TRACE_LOG(pChannel->fLogHandle, "Connect abort\n");
    		break;
    	case EASY_RTMP_STATE_DISCONNECTED:
    		TRACE_LOG(pChannel->fLogHandle, "Disconnect.\n");
    		break;
    	default:
    		break;
    	}
    	return 0;
    }
    
    /* EasyRTSPClient callback */
    int Easy_APICALL __RTSPSourceCallBack( int _chid, void *_chPtr, int _mediatype, char *pbuf, EASY_FRAME_INFO *frameinfo)
    {
    	if (NULL != frameinfo)
    	{
    		if (frameinfo->height==1088)		frameinfo->height=1080;
    		else if (frameinfo->height==544)	frameinfo->height=540;
    	}
    	Easy_Bool bRet = 0;
    	int iRet = 0;
    	
    	_channel_info* pChannel = (_channel_info*)_chPtr;
    
    	if (_mediatype == EASY_SDK_VIDEO_FRAME_FLAG)
    	{
    		if(frameinfo && frameinfo->length)
    		{
    			if( frameinfo->type == EASY_SDK_VIDEO_FRAME_I)
    			{
    				if(pChannel->fPusherInfo.rtmpHandle == 0)
    				{
    					pChannel->fPusherInfo.rtmpHandle = EasyRTMP_Create();
    					if (pChannel->fPusherInfo.rtmpHandle == NULL)
    					{
    						TRACE_LOG(pChannel->fLogHandle, "Fail to rtmp create failed ...\n");
    						return -1;
    					}
    					EasyRTMP_SetCallback(pChannel->fPusherInfo.rtmpHandle, __EasyRTMP_Callback, pChannel);
    					bRet = EasyRTMP_Connect(pChannel->fPusherInfo.rtmpHandle, pChannel->fCfgInfo.destRtmpAddr);
    					if (!bRet)
    					{
    						TRACE_LOG(pChannel->fLogHandle, "Fail to rtmp connect failed ...\n");
    					}
    
    					EASY_MEDIA_INFO_T mediaInfo;
    					memset(&mediaInfo, 0, sizeof(EASY_MEDIA_INFO_T));
    					mediaInfo.u32VideoFps = pChannel->fMediainfo.u32VideoFps;
    					mediaInfo.u32AudioSamplerate = 8000;
    
    					iRet = EasyRTMP_InitMetadata(pChannel->fPusherInfo.rtmpHandle, &mediaInfo, 1024);
    					if (iRet < 0)
    					{
    						TRACE_LOG(pChannel->fLogHandle, "Fail to Init Metadata ...\n");
    					}
    				}
    
    				EASY_AV_Frame avFrame;
    				memset(&avFrame, 0, sizeof(EASY_AV_Frame));
    				avFrame.u32AVFrameFlag = EASY_SDK_VIDEO_FRAME_FLAG;
    				avFrame.u32AVFrameLen = frameinfo->length;
    				avFrame.pBuffer = (unsigned char*)pbuf;
    				avFrame.u32VFrameType = EASY_SDK_VIDEO_FRAME_I;
    				//avFrame.u32TimestampSec = frameinfo->timestamp_sec;
    				//avFrame.u32TimestampUsec = frameinfo->timestamp_usec;
    				//
    				iRet = EasyRTMP_SendPacket(pChannel->fPusherInfo.rtmpHandle, &avFrame);
    				if (iRet < 0)
    				{
    					TRACE_LOG(pChannel->fLogHandle, "Fail to Send H264 Packet(I-frame) ...\n");
    				}
    				else
    				{
    					if(!pChannel->fHavePrintKeyInfo)
    					{
    						TRACE_LOG(pChannel->fLogHandle, "I\n");
    						pChannel->fHavePrintKeyInfo = true;
    					}
    				}
    			}
    			else
    			{
    				if(pChannel->fPusherInfo.rtmpHandle)
    				{
    					EASY_AV_Frame avFrame;
    					memset(&avFrame, 0, sizeof(EASY_AV_Frame));
    					avFrame.u32AVFrameFlag = EASY_SDK_VIDEO_FRAME_FLAG;
    					avFrame.u32AVFrameLen = frameinfo->length-4;
    					avFrame.pBuffer = (unsigned char*)pbuf+4;
    					avFrame.u32VFrameType = EASY_SDK_VIDEO_FRAME_P;
    					//avFrame.u32TimestampSec = frameinfo->timestamp_sec;
    					//avFrame.u32TimestampUsec = frameinfo->timestamp_usec;
    					iRet = EasyRTMP_SendPacket(pChannel->fPusherInfo.rtmpHandle, &avFrame);
    					if (iRet < 0)
    					{
    						TRACE_LOG(pChannel->fLogHandle, "Fail to Send H264 Packet(P-frame) ...\n");
    					}
    					else
    					{
    						if(!pChannel->fHavePrintKeyInfo)
    						{
    							TRACE_LOG(pChannel->fLogHandle, "P\n");
    						}
    					}
    				}
    			}				
    		}	
    	}
    	else if (_mediatype == EASY_SDK_MEDIA_INFO_FLAG)
    	{
    		if(pbuf != NULL)
    		{
    			EASY_MEDIA_INFO_T mediainfo;
    			memset(&(pChannel->fMediainfo), 0x00, sizeof(EASY_MEDIA_INFO_T));
    			memcpy(&(pChannel->fMediainfo), pbuf, sizeof(EASY_MEDIA_INFO_T));
    			TRACE_LOG(pChannel->fLogHandle,"RTSP DESCRIBE Get Media Info: video:%u fps:%u audio:%u channel:%u sampleRate:%u \n", 
    				pChannel->fMediainfo.u32VideoCodec, pChannel->fMediainfo.u32VideoFps, pChannel->fMediainfo.u32AudioCodec, pChannel->fMediainfo.u32AudioChannel, pChannel->fMediainfo.u32AudioSamplerate);
    		}
    	}
    
    	return 0;
    }
    
    bool InitCfgInfo(void)
    {
    	int i = 0;
    	gChannelInfoList.clear();
    	for(i = 0; i < MAX_CHANNEL_INDEX; i++)
    	{
    		_channel_info* pChannelInfo = new _channel_info();
    		if(pChannelInfo)
    		{
    			memset(pChannelInfo, 0, sizeof(_channel_info));
    			pChannelInfo->fCfgInfo.channelId = i;
    			pChannelInfo->fHavePrintKeyInfo = false;
    			sprintf(pChannelInfo->fCfgInfo.channelName, "channel%d",i);
    			strcpy(pChannelInfo->fCfgInfo.srcRtspAddr, GetIniKeyString(pChannelInfo->fCfgInfo.channelName, "rtsp", CONF_FILE_PATH));
    			strcpy(pChannelInfo->fCfgInfo.destRtmpAddr, GetIniKeyString(pChannelInfo->fCfgInfo.channelName, "rtmp", CONF_FILE_PATH));
    			pChannelInfo->fCfgInfo.option = GetIniKeyInt(pChannelInfo->fCfgInfo.channelName, "option", CONF_FILE_PATH);
    			if(strlen(pChannelInfo->fCfgInfo.srcRtspAddr) > 0 && strlen(pChannelInfo->fCfgInfo.destRtmpAddr) > 0)
    			{
    				gChannelInfoList.push_back(pChannelInfo);
    			}
    		}
    	}
    	return true;
    }
    
    void ReleaseSpace(void)
    {
    	std::list<_channel_info*>::iterator it;
    	for(it = gChannelInfoList.begin(); it != gChannelInfoList.end(); it++)
    	{
    		_channel_info* pChannel = *it;
    
    		if (NULL != pChannel->fNVSHandle) 
    		{
    			EasyRTSP_CloseStream(pChannel->fNVSHandle);
    			EasyRTSP_Deinit(&(pChannel->fNVSHandle));
    			pChannel->fNVSHandle = NULL;
    		}
    
    		if (NULL != pChannel->fPusherInfo.rtmpHandle)
    		{
    			EasyRTMP_Release(pChannel->fPusherInfo.rtmpHandle);
    			pChannel->fPusherInfo.rtmpHandle = NULL;
    		}
    
    		if(pChannel->fLogHandle)
    		{
    			TRACE_CloseLogFile(pChannel->fLogHandle);
    			pChannel->fLogHandle = NULL;
    		}
    
    		delete pChannel;
    	}
    
    	gChannelInfoList.clear();
    }
    
    int main(int argc, char * argv[])
    {
    	InitCfgInfo();
    
    	int iret = 0;
    	iret = EasyRTMP_Activate(KEY);
    	if (iret <= 0)
    	{
    		printf("RTMP Activate error. ret=%d!!!\n", iret);
    		getchar();
    		return -1;
    	}
    
    #ifdef _WIN32
    	extern char* optarg;
    #endif
    	int ch;
    
    	atexit(ReleaseSpace);
    
    	iret = 0;
    	iret = EasyRTSP_Activate(RTSP_KEY);
    	if(iret <= 0)
    	{
    		printf("rtsp Activate error. ret=%d!!!\n", iret);
    		return -2;
    	}
    
    	std::list<_channel_info*>::iterator it;
    	for(it = gChannelInfoList.begin(); it != gChannelInfoList.end(); it++)
    	{
    		_channel_info* pChannel = *it;
    		pChannel->fLogHandle = TRACE_OpenLogFile(pChannel->fCfgInfo.channelName);
    
    		TRACE_LOG(pChannel->fLogHandle, "channel[%d] rtsp addr : %s\n", pChannel->fCfgInfo.channelId, pChannel->fCfgInfo.srcRtspAddr);
    		TRACE_LOG(pChannel->fLogHandle, "channel[%d] rtmp addr : %s\n", pChannel->fCfgInfo.channelId, pChannel->fCfgInfo.destRtmpAddr);
    
    		EasyRTSP_Init(&(pChannel->fNVSHandle));
    
    		if (NULL == pChannel->fNVSHandle)
    		{
    			TRACE_LOG(pChannel->fLogHandle, "%s rtsp init error. ret=%d!!!\n", pChannel->fCfgInfo.channelName , iret);
    			continue;
    		}
    		unsigned int mediaType = EASY_SDK_VIDEO_FRAME_FLAG | EASY_SDK_AUDIO_FRAME_FLAG;
    	
    		EasyRTSP_SetCallback(pChannel->fNVSHandle, __RTSPSourceCallBack);
    
    		EasyRTSP_OpenStream(pChannel->fNVSHandle, pChannel->fCfgInfo.channelId, pChannel->fCfgInfo.srcRtspAddr, EASY_RTP_OVER_TCP, mediaType, 0, 0, pChannel, 1000, 0, pChannel->fCfgInfo.option, 0);
    	}
    
    	while(true)
    	{
    #ifdef _WIN32
    		Sleep(1000);
    #else
    		sleep(1);
    #endif
    	}
    
        return 0;
    }
    

    源码下载:https://github.com/EasyDarwin/EasyRTSPLive

    这里只贴出了在x86平台上的实现,EasyRTSPLive是全平台都能支持的,尤其是在Windows/Linux/Android/ARM上,都能非常灵活的定制;

    更多流媒体音视频资源

    EasyDarwin开源流媒体服务器:www.EasyDarwin.org

    EasyDSS高性能互联网直播服务:www.EasyDSS.com

    EasyNVR安防视频可视化服务:www.EasyNVR.com

    EasyNVS视频综合管理平台:www.EasyNVS.com

    EasyNTS云组网:www.EasyNTS.com

    EasyGBS国标GB/T28181服务器:www.EasyGBS.com

    EasyRTC视频会议解决方案:www.EasyRTC.cn

    Copyright © TSINGSEE.com Team 2012-2019

    青犀TSINGSEE

    展开全文
  • EasyRTMPLive是拉流IPC摄像机或NVR硬盘录像机RTSP流转成RTMP推到阿里云CDN /腾讯云CDN / RTMP流媒体服务器,支持多路RTSP流同时拉取并以RTMP协议推送发布。采用Config.ini配置文件,来配置每路输入的RTSP地址,以及...

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

    EasyRTMPLive是拉流IPC摄像机或NVR硬盘录像机RTSP流转成RTMP推到阿里云CDN /腾讯云CDN / RTMP流媒体服务器,支持多路RTSP流同时拉取并以RTMP协议推送发布。采用Config.ini配置文件,来配置每路输入的RTSP地址,以及目标RTMP地址。channel必须是channel0到channel1024之间,目标rtmp地址不能重复。

     

    EasyRTMPLive运行报0xc000007b错误

    发现问题

    最近有开发者在使用EasyRTMPLive Windows版本的时候,会出现运行不成功的情况,打开EasyRTMPLive,显示缺乏dll和应用程序无法正常启动(0xc000007b)的弹框,如下图:

     

     

    分析问题

    对此运行错误问题我们马上开始进行排查,经过检查发现,EasyRTMPLive Windows版本编译的是64位平台下运行的,开发环境是VS2010,由于缺乏VC2010的运行库文件才导致了程序无法正常打开和运行,因此需要补齐VC2010的运行库文件。

     

    解决问题

    下面介绍一种工具来查找问题,方便大家后期定位问题,这款工具的名称为:depends.exe

    我们从文件夹中依次找到…\VC\redist\Debug_NonRedist\x64\Microsoft.VC100.DebugCRT\目录下两个文件msvcp100d.dll和msvcr100d.dll放到程序目录下面,再次运行程序,则问题就迎刃而解。

    展开全文
  • 有的项目现场将硬盘录像机通过GB28181协议接入到EasyCVR平台后,直播预览正常,但是播放设备录像时则出现无法加载画面的情况。 直播预览画面正常: 播放设备录像一直加载: 因此我们对系统进行wireshark抓包...

    EasyCVR视频结构化平台支持的协议广泛,其中就包括GB28181协议及海康摄像头常见的Ehome协议。有的项目现场将硬盘录像机通过GB28181协议接入到EasyCVR平台后,直播预览正常,但是播放设备录像时则出现无法加载画面的情况。

    直播预览画面正常:

    93.png

    播放设备录像一直加载:

    95.png

    因此我们对系统进行wireshark抓包,抓包文件如下:

    96.png

    通过以上信息,可以看出GB28181点播设备录像的SIP流程正常,收流TCP链接成功建立,问题在于视频流的发送者(NVR设备)没有发送视频流数据。

    有可能是设备不支持TCP发送设备录像,因此我们尝试通过将配置界面中的传输协议由TCP改为UDP来解决该问题。

    98.png

    修改后设备录像能够成功播放。

    99.png

    视频传输都会涉及到UDP或者TCP协议,关于这两者的区别及运用方法,大家可以阅读本文简单了解一下:如何正确使用UDP及TCP协议。此外EasyGBS最新的测试版本已经可以下载测试,欢迎了解。

    展开全文
  • RTSP协议视频平台EasyNVR有直播版和录像版,录像版可以直接进行录像存储和回放,但是很多用户由于没有回放需求,就会使用硬盘录像机作为视频存储设备。 最近有用户反馈发现自己的海康硬盘录像机无法通过rtsp连接到...
  • 1、首先我们先访问硬盘录像机的web地址,如果不知道我们可通过宇视的搜索工具“EZTools”来确认硬盘录像机的地址: 2、进入到宇视的硬盘录像机后,点击网络配置,再点击国标28181,默认情况该功能是关闭的,点击...
  • 将RTSP、RTMP、HTTP、HLS等各种各样的网络流媒体先拉取到本地,进行转换,再以标准RTMP/flv协议的方式推流到RTMP流媒体服务器、CDN等,进行直播分发。 搭建EasyRTMPLive拉RTSP流转RTMP测试环境 今天主要为大家...
  • 有的项目现场将硬盘录像机通过GB28181协议接入到EasyCVR平台后,直播预览正常,但是播放设备录像时则出现无法加载画面的情况。 直播预览画面正常: 播放设备录像一直加载: 因此我们对系统进行wireshark抓包...
  • 解决多个辅录像机接入监控网络的协议,解决辅录像机接入录像延迟卡顿的现象,优化监控播放
  • 经常碰到用户咨询我们,TSINGSEE青犀视频研发的视频平台能否支持海康的硬盘录像机接入,由于对现场没有录像回看的需要,因此仅用硬盘录像机就能满足录像功能,这种情况下能否用我们的流媒体视频平台。 刚好前几天...
  • EasyCVR视频平台前端可以接入硬盘录像机、摄像头、编码器等设备,也可以直接调用硬盘录像机的录像进行回看。有用户现场反馈,通过EasyCVR调取录像机录像,但是对接easyplayer后,发现没有进度条。 于是该现场做了一...
  • 这里以宇视的硬盘录像机为例,宇视的国标设置项一般是位于根栏目下的平台配置选项中,而海康或大华的国标配置位于网络配置项下,见下图: 1、基本的配置选项主要就是sip编码、域、ip、密码几项,这里需要注意的是...
  • 数字硬盘录像机NVR/DVR或者带SD卡存储的摄像头通过GB28181协议接入LiveGBS后,通过GB28181信令可以实时的查看数字硬盘录像机里面的录像。 提供了完整的设备录像API接口 查询录像列表 开始回放 回放流保活 回放流...
  • 屏幕录像机

    2014-02-13 23:47:59
    在xp_sp1上安装高清屏幕录像机需先安装.NET Framework 1.1 运行库,然后运行”安装卸载.exe“。 使用百度搜索“.NET Framework 1.1”可以找到.NET Framework 1.1的下载地址。 在xp_sp2,xp_sp3,vista,win7上安装高清...
  • 你是否也有这样的疑问,这台录像机,可以接什么摄像机呢?能不能全部都接300万甚至400万的高清摄像机?能不能接500万的摄像机?搭配有道NVR接入能力详解1 单路最高像素单路最高像素意味着录像机每一路最大能接入多少...
  • RTSP协议视频平台EasyNVR有直播版和录像版,录像版可以直接进行录像存储和回放,但是很多用户由于没有回放需求,就会使用硬盘录像机作为视频存储设备。 最近有用户反馈发现自己的海康硬盘录像机无法通过rtsp连接到...
  • 近期有客户向我们反馈EasyNVR无法拉取RTSP视频流的情况,我们对该客户进行了详细的询问,了解到客户是通过路由器把内网的录像机映射到公网来,公网已经可以访问到录像机的WEB管理页面了,但是在公网通过EasyNVR却...
  • 海康大华GB/T28181协议IP网络摄像头硬件录像机没有上报告警报警信息4、搭建GB28181视频直播平台 4、搭建GB28181视频直播平台 支持 Windows Linux 及其它CPU架构(国产、嵌入式…)操作系统 安装包下载 安装使用说明...
  • 由于涉及到网络情况,很多项目团队在使用流媒体平台来接入摄像头或者硬盘录像机的时候,会碰到视频通道接入不上来的情况。比如有项目将硬盘录像机接入EasyGBS国标视频云平台之后,显示设备在线,但是点进去后会发现...
  • 一、问:开机后,硬盘录像机无法正常启动答:可能原因:1.输入电源不正确2.开关电源线接触不好3.开关电源坏4.硬盘损坏或硬盘线问题 2 二、问:硬盘录像机启动几分钟后会自动重启或经常死机答:可能原因:1...
  • 海康威视硬盘录像机 RTSP 设置

    万次阅读 2019-05-25 15:12:07
    海康威视硬盘录像机 RTSP 设置 1. 主码流与子码流 /ch1/main/av_stream /ch1/sub/av_stream 2. RTSP rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream username 用户名,例如 ...
  • 有用户使用GB28181协议在EasyCVR平台内连接设备,出现了通道内的视频 和硬盘录像机内的视频不匹配的情况。该用户有两个硬盘录像机,分别接入了不同的摄像头,当这两个硬盘录像机同时接入EasyCVR后,EasyCVR
  • 有用户使用GB28181协议在EasyCVR平台内连接设备,出现了通道内的视频 和硬盘录像机内的视频不匹配的情况。该用户有两个硬盘录像机,分别接入了不同的摄像头,当这两个硬盘录像机同时接入EasyCVR后,EasyCVR
  • 高清硬盘录像机,非指市面上监控领域所宣传的模拟高清或者仿高清录像机,而是真正的高清硬盘录像机,是指具有HDMI、DVI、SDI、VGA、色差、S端子等物理结构的高清输入接口,同时还支持1080P高分辨率参数输入以及录制...
  • 新增了一套大华存储设备,现在只保存不同录像机中的三四个画面,录像机有大华和海康两种不同品牌的,大华能正常显示,海康的只有两三个能正常显示,剩余显示掉线状态,但海康所有设备均为正常工作状态 如何能解决将...
  • 数字硬盘录像机NVR/DVR或者带SD卡存储的摄像头通过GB28181协议接入LiveGBS后,通过GB28181信令可以实时的查看数字硬盘录像机里面的录像。 提供了完整的设备录像API接口 查询录像列表 开始回放 回放流保活 回放流...
  • 雄迈录像机开放哪些端口

    千次阅读 2017-02-24 08:03:02
    雄迈录像机开放哪些端口

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,444
精华内容 3,777
关键字:

录像机协议