海康SDK包可以从海康的官网上下载到。
海康SDK可用于开发海康相机,海康DVR等,主要分两块,取码流模块,解码模块;大华的SDK跟海康的类似。
1 取码流模块。
主要函数解释如下:
// 打开
NET_DVR_Init :初始化SDK,初始化SOCKET等。
NET_DVR_Login_V30 :登陆,建立业务链路。
NET_DVR_SetAudioMode:设置声卡模式,是独占,还是共享。
NET_DVR_RealPlay:开始点播视频。
NET_DVR_OpenSoundShare:共享模式下开启声音。
NET_DVR_SetRealDataCallBack:设置码流回调,在回调函数里就能得到码流。
NET_DVR_SetStandardDataCallBack用于捕获实时码流数据(标准码流)。回调的第一个包是40个字节的文件头,供后续解码使用,之后回调的是标准码流(含12字节的RTP头)。此函数目前仅支持对于支持RTSP协议取流的设备的标准码流回调。
NET_DVR_GetDVRConfig:登陆以后可以获取设备的配置信息。
//关闭
NET_DVR_StopRealPlay:关闭视频点播。
NET_DVR_Logout_V30:退出登陆。
NET_DVR_Cleanup:反初始化。
NET_DVR_GetLastError:得到错误号。
2 解码模块
解码后的分辨率主要为yuv420,yv12.
主要函数的解码如下:
PlayM4_GetPort:获取未使用的通道号,起始位101,上限为500,估计是支持同时解码400路。
PlayM4_SetStreamOpenMode:设置流播放模式。有流模式(会尽量保证实时性,防止数据阻塞,而且数据检查严格),文件模式(跟流模式相反)。
PlayM4_FreePort:释放已使用的通道号。
PlayM4_CloseStream:关闭流,估计是释放为解码准备的BUF。
PlayM4_SetDecCallBack:设置解码后的回调。
PlayM4_Play:开始解码。
PlayM4_PlaySoundShare:以共享方式打开声音。
PlayM4_InputData:输入数据。
AnalyzeDataInputData:分析码流根式。
PlayM4_Stop:停止解码。
PlayM4_CloseStream:关闭流,估计是释放BUF。
PlayM4_StopSoundShare:关闭声音。
3 调用DEMO
参见海康SDK的DEMO。
4遇到的问题
1.录像有音频,但解码后没有音频回调。
答:
可能1:确保配置成音视频混合。
可能2: PlayM4_PlaySoundShare(lPort); PlayM4_Play(lPort, NULL);改成: PlayM4_Play(lPort, NULL);PlayM4_PlaySoundShare(lPort);
2.用解码前回调录的视频,解码后有跳帧。
答:解码前加上 PlayM4_CheckDiscontinuousFrameNum(m_nChannelID,FALSE);
3.PlayM4_InputData()之后出现错误“buffer is overflow”。
答:设置的buf过小,PlayM4_OpenStream设置BUF的大小改成6*1024*1024。
4.时间戳是什么时候打的?
答:实时流,解码前数据可能是多包,打时间戳不合适,解码后的时间戳是数据编码时的时间戳;如果是录像,解码后的时间戳是打的相对时间戳。
附:
/*******************海康全局错误码 begin**********************/
#define NET_DVR_NOERROR 0 //没有错误
#define NET_DVR_PASSWORD_ERROR 1 //用户名密码错误
#define NET_DVR_NOENOUGHPRI 2 //权限不足
#define NET_DVR_NOINIT 3 //没有初始化
#define NET_DVR_CHANNEL_ERROR 4 //通道号错误,比如输入-1通道
#define NET_DVR_OVER_MAXLINK 5 //连接到DVR的客户端个数超过最大
#define NET_DVR_VERSIONNOMATCH 6 //版本不匹配
#define NET_DVR_NETWORK_FAIL_CONNECT 7 //连接服务器失败
#define NET_DVR_NETWORK_SEND_ERROR 8 //向服务器发送失败
#define NET_DVR_NETWORK_RECV_ERROR 9 //从服务器接收数据失败
#define NET_DVR_NETWORK_RECV_TIMEOUT 10 //从服务器接收数据超时
#define NET_DVR_NETWORK_ERRORDATA 11 //传送的数据有误
#define NET_DVR_ORDER_ERROR 12 //调用次序错误
#define NET_DVR_OPERNOPERMIT 13 //无此权限
#define NET_DVR_COMMANDTIMEOUT 14 //DVR命令执行超时
#define NET_DVR_ERRORSERIALPORT 15 //串口号错误
#define NET_DVR_ERRORALARMPORT 16 //报警端口错误
#define NET_DVR_PARAMETER_ERROR 17 //参数错误
#define NET_DVR_CHAN_EXCEPTION 18 //服务器通道处于错误状态
#define NET_DVR_NODISK 19 //没有硬盘
#define NET_DVR_ERRORDISKNUM 20 //硬盘号错误
#define NET_DVR_DISK_FULL 21 //服务器硬盘满
#define NET_DVR_DISK_ERROR 22 //服务器硬盘出错
#define NET_DVR_NOSUPPORT 23 //服务器不支持
#define NET_DVR_BUSY 24 //服务器忙
#define NET_DVR_MODIFY_FAIL 25 //服务器修改不成功
#define NET_DVR_PASSWORD_FORMAT_ERROR 26 //密码输入格式不正确
#define NET_DVR_DISK_FORMATING 27 //硬盘正在格式化,不能启动操作
#define NET_DVR_DVRNORESOURCE 28 //DVR资源不足
#define NET_DVR_DVROPRATEFAILED 29 //DVR操作失败
#define NET_DVR_OPENHOSTSOUND_FAIL 30 //打开PC声音失败
#define NET_DVR_DVRVOICEOPENED 31 //服务器语音对讲被占用
#define NET_DVR_TIMEINPUTERROR 32 //时间输入不正确
#define NET_DVR_NOSPECFILE 33 //回放时服务器没有指定的文件
#define NET_DVR_CREATEFILE_ERROR 34 //创建文件出错
#define NET_DVR_FILEOPENFAIL 35 //打开文件出错
#define NET_DVR_OPERNOTFINISH 36 //上次的操作还没有完成
#define NET_DVR_GETPLAYTIMEFAIL 37 //获取当前播放的时间出错
#define NET_DVR_PLAYFAIL 38 //播放出错
#define NET_DVR_FILEFORMAT_ERROR 39 //文件格式不正确
#define NET_DVR_DIR_ERROR 40 //路径错误
#define NET_DVR_ALLOC_RESOURCE_ERROR 41 //资源分配错误
#define NET_DVR_AUDIO_MODE_ERROR 42 //声卡模式错误
#define NET_DVR_NOENOUGH_BUF 43 //缓冲区太小
#define NET_DVR_CREATESOCKET_ERROR 44 //创建SOCKET出错
#define NET_DVR_SETSOCKET_ERROR 45 //设置SOCKET出错
#define NET_DVR_MAX_NUM 46 //个数达到最大
#define NET_DVR_USERNOTEXIST 47 //用户不存在
#define NET_DVR_WRITEFLASHERROR 48 //写FLASH出错
#define NET_DVR_UPGRADEFAIL 49 //DVR升级失败
#define NET_DVR_CARDHAVEINIT 50 //解码卡已经初始化过
#define NET_DVR_PLAYERFAILED 51 //调用播放库中某个函数失败
#define NET_DVR_MAX_USERNUM 52 //设备端用户数达到最大
#define NET_DVR_GETLOCALIPANDMACFAIL 53 //获得客户端的IP地址或物理地址失败
#define NET_DVR_NOENCODEING 54 //该通道没有编码
#define NET_DVR_IPMISMATCH 55 //IP地址不匹配
#define NET_DVR_MACMISMATCH 56 //MAC地址不匹配
#define NET_DVR_UPGRADELANGMISMATCH 57 //升级文件语言不匹配
#define NET_DVR_MAX_PLAYERPORT 58 //播放器路数达到最大
#define NET_DVR_NOSPACEBACKUP 59 //备份设备中没有足够空间进行备份
#define NET_DVR_NODEVICEBACKUP 60 //没有找到指定的备份设备
#define NET_DVR_PICTURE_BITS_ERROR 61 //图像素位数不符,限24色
#define NET_DVR_PICTURE_DIMENSION_ERROR 62 //图片高*宽超限, 限128*256
#define NET_DVR_PICTURE_SIZ_ERROR 63 //图片大小超限,限100K
#define NET_DVR_LOADPLAYERSDKFAILED 64 //载入当前目录下Player Sdk出错
#define NET_DVR_LOADPLAYERSDKPROC_ERROR 65 //找不到Player Sdk中某个函数入口
#define NET_DVR_LOADDSSDKFAILED 66 //载入当前目录下DSsdk出错
#define NET_DVR_LOADDSSDKPROC_ERROR 67 //找不到DsSdk中某个函数入口
#define NET_DVR_DSSDK_ERROR 68 //调用硬解码库DsSdk中某个函数失败
#define NET_DVR_VOICEMONOPOLIZE 69 //声卡被独占
#define NET_DVR_JOINMULTICASTFAILED 70 //加入多播组失败
#define NET_DVR_CREATEDIR_ERROR 71 //建立日志文件目录失败
#define NET_DVR_BINDSOCKET_ERROR 72 //绑定套接字失败
#define NET_DVR_SOCKETCLOSE_ERROR 73 //socket连接中断,此错误通常是由于连接中断或目的地不可达
#define NET_DVR_USERID_ISUSING 74 //注销时用户ID正在进行某操作
#define NET_DVR_SOCKETLISTEN_ERROR 75 //监听失败
#define NET_DVR_PROGRAM_EXCEPTION 76 //程序异常
#define NET_DVR_WRITEFILE_FAILED 77 //写文件失败
#define NET_DVR_FORMAT_READONLY 78 //禁止格式化只读硬盘
#define NET_DVR_WITHSAMEUSERNAME 79 //用户配置结构中存在相同的用户名
#define NET_DVR_DEVICETYPE_ERROR 80 /*导入参数时设备型号不匹配*/
#define NET_DVR_LANGUAGE_ERROR 81 /*导入参数时语言不匹配*/
#define NET_DVR_PARAVERSION_ERROR 82 /*导入参数时软件版本不匹配*/
#define NET_DVR_IPCHAN_NOTALIVE 83 /*预览时外接IP通道不在线*/
#define NET_DVR_RTSP_SDK_ERROR 84 /*加载高清IPC通讯库StreamTransClient.dll失败*/
#define NET_DVR_CONVERT_SDK_ERROR 85 /*加载转码库失败*/
#define NET_DVR_IPC_COUNT_OVERFLOW 86 /*超出最大的ip接入通道数*/
#define NET_DVR_MAX_ADD_NUM 87 /*添加标签(一个文件片段64)等个数达到最大*/
#define NET_DVR_PARAMMODE_ERROR 88 //图像增强仪,参数模式错误(用于硬件设置时,客户端进行软件设置时错误值)
#define NET_DVR_CODESPITTER_OFFLINE 89 //视频综合平台,码分器不在线
#define NET_DVR_BACKUP_COPYING 90 //设备正在备份
#define NET_DVR_CHAN_NOTSUPPORT 91 // 通道不支持该操作
#define NET_DVR_CALLINEINVALID 92 // 高度线位置太集中或长度线不够倾斜
#define NET_DVR_CALCANCELCONFLICT 93 // 取消标定冲突,如果设置了规则及全局的实际大小尺寸过滤
#define NET_DVR_CALPOINTOUTRANGE 94 // 标定点超出范围
#define NET_DVR_FILTERRECTINVALID 95 // 尺寸过滤器不符合要求
#define NET_DVR_DDNS_DEVOFFLINE 96 //设备没有注册到ddns上
#define NET_DVR_DDNS_INTER_ERROR 97 //DDNS 服务器内部错误
#define NET_DVR_ALIAS_DUPLICATE 150 //别名重复 //2011-08-31 通过别名或者序列号来访问设备的新版本ddns的配置