1)演示程序/Mfc分类Demo中有04.远程抓图19.枪球联动等功能说明
关于视音频的数据格式有两种
// 编码格式, 包括音频和视频
struct AV_CFG_EncodeFormat
{
AV_int32 nStructSize;
AV_BOOL bAudioEnable; // 音频使能
AV_int32 nAudioBitRate; // 音频比特率
CFG_AUDIO_FORMAT emAudioCompression; // 音频压缩模式
AV_int32 nAudioDepth; // 音频采样深度
AV_int32 nAudioFrequency; // 音频采样频率
AV_int32 nAudioMode; // 音频编码模式
AV_int32 nAudioPack; // 音频打包模式, 0-DHAV, 1-PS
AV_BOOL bVideoEnable; // 视频使能
AV_int32 nVideoBitRate; // 视频比特率
CFG_BITRATE_CONTROL emVideoBitRateControl; // 码流控制模式
CFG_VIDEO_COMPRESSION emVideoCompression; // 视频压缩模式
AV_int32 nVideoFPS; // 视频帧率
AV_int32 nVideoGOP; // 视频I帧间隔
AV_int32 nVideoWidth; // 视频宽度
AV_int32 nVideoHeight; // 视频高度
CFG_IMAGE_QUALITY emVideoQuality; // 视频图像质量
AV_int32 nVideoPack; // 视频打包模式, 0-DHAV, 1-PS
};
尝试使用如下代码设置视音频数据的格式为PS,而不是大华的私有流协议,暂时无效
NET_ENCODE_VIDEO_PACK_INFO struEnCodeInfo = { 0 };
struEnCodeInfo.dwSize = sizeof(struEnCodeInfo);
//指定主码流
struEnCodeInfo.emFormatType = EM_FORMAT_MAIN_NORMAL;
//先查看当前的视频流格式
bool bRet = CLIENT_GetConfig(id, NET_EM_CFG_ENCODE_VIDEO_PACK, 1, (void*)&struEnCodeInfo, sizeof(struEnCodeInfo));
DWORD err = 0;
if (!bRet)
{
err = CLIENT_GetLastError()&(0x7fffffff);
}
//设置PS流格式
struEnCodeInfo.emPackType = EM_PACK_PS;
bRet = CLIENT_SetConfig(id, NET_EM_CFG_ENCODE_VIDEO_PACK, 1, (void*)&struEnCodeInfo, sizeof(struEnCodeInfo));
bRet = CLIENT_GetConfig(id, NET_EM_CFG_ENCODE_VIDEO_PACK, 1, (void*)&struEnCodeInfo, sizeof(struEnCodeInfo));
注意:06.编码配置例子中对视音频的编码可以设置,目前通过OnVideoDlgToStu设置PS,抓包没有找到对应的PS头字段,需要保存文件分析
2)工程编译问题
问题1)
1>BSWndContainer.obj : error LNK2019: 无法解析的外部符号 _xMonitorFromWindow@8,该符号在函数 “int __cdecl GetCurrentScreenMonitorRect(struct HWND__ *,struct tagRECT &)” (?GetCurrentScreenMonitorRect@@YAHPAUHWND__@@AAUtagRECT@@@Z) 中被引用
1>BSWndContainer.obj : error LNK2019: 无法解析的外部符号 _xGetMonitorInfo@8,该符号在函数 “int __cdecl GetCurrentScreenMonitorRect(struct HWND__ *,struct tagRECT &)” (?GetCurrentScreenMonitorRect@@YAHPAUHWND__@@AAUtagRECT@@@Z) 中被引用
源代码
#include “BSWndContainer.h”
#pragma warning(disable:4706)
//#define COMPILE_MULTIMON_STUBS
#include <multimon.h>
#pragma warning(default:4706)
修改后
#include “BSWndContainer.h”
#pragma warning(disable:4706)
#define COMPILE_MULTIMON_STUBS //取消注释
#include <multimon.h>
#pragma warning(default:4706)
问题2)
error C3861: “_Min”: 找不到标识符
源代码:
int nMinChannel = _Min(m_ChannelNum, _Min(nNum, MAX_RECORD_CHANNEL));
修改后:
int nMinChannel = min(m_ChannelNum, min(nNum, MAX_RECORD_CHANNEL));
大华私有流对接优势
1)大华设备进行rtsp交互耗时1500毫秒
2)SDK私有协议对接耗时600毫秒
3)如下是大华私有视频流的说明
1.2 DHFS视频监控帧格式解析
帧是视频监控数据组成的基本单位,视频监控数据是由许多帧按照一定的顺序组合而成,帧存在多种类型,而且帧的大小不固定,每个帧的起始位置不一定只出现在扇区或块的起始地址,它可以出现在任何合理的物理地址范围内。大华视频监控文件中视频帧是由其自定义的网络通讯协议封装RTP载荷的H.264码流组成,大华视频帧与一般的H.264编码的视频帧是不同的,它对原始H.264视频数据进行了多次封装。
由于大华视频每帧中都含有特定的网络通讯协议头部信息和尾部信息,通过分析帧中网络通讯协议头或尾部的数据特点可以实现对视频帧进行搜索和定位,经过大量实验发现其帧起始特定标志为大写字母DHAV,十六进制表示为0x44484156,帧结束标志为小写字母dhav,十六进制表示为0x64686176(见图1)。大华帧头部结构中记录了基本的视频属性信息,例如帧的编号、帧所属通道号、帧长度以及帧的创建时间等等。这些属性是视频监控数据进行通道分离与重组的关键信息,其中与视频监控恢复相关的属性信息,如表1所示,头部结构中相对DHAV标识偏移量为0x04描述的是帧类型;如图1中偏移0x06位置描述通道号,此帧的通道号是0x0005,具体含义表示为6通道,因为通道号是0作为基数表示1通道;0x08描述的是此帧编号,考虑到大小端表达形式,十六进制表示为0x47D0;相对DHFS偏移0x0C是此帧的长度,此帧长度是0x00000F80,十进制表示为3698字节;相对DHAV偏移0x10是描述此帧的创建时间信息,十六进制表示为0x39308EBB。如图1中dhav后四个字节为帧长度,十六进制表达式为0x20F8,转换成十进制为8840字节,用于校验。尾部结束标志为小写字母dhav,具体帧尾部结构见表2。
图1 DHFS文件系统的帧头与帧尾
Fig.1 Frame head and tail in DHFS
2 DHFS视频监控存储方式研究
2.1 DHFS视频文件存储方式分析
视频监控采用实时文件顺序存储方式,整体的基本布局结构如图2上所示,从文件系统数据区可以分析出大华视频监控文件系统的标识,视频监控存储块大小等信息,这些参数对于大华视频监控数据的恢复有十分重要的作用,例如DHFS会实时分配给各个视频通道2 MB存储空间,该值由启动扇区中相应参数定义,各通道的视频片段以2 MB为分割,在磁盘中顺序交替存储,但是有些情况下也存在连续存放单一通道2 MB视频片段的情况,假设CHn表示所属通道的2 MB视频片段,在只有3个通道的视频监控系统中,DHFS文件系统中各通道视频片段存储排列情况如图2下所示,视频片段代表视频存储过程中一个2 MB的视频数据块,其中编号为1~6的视频片段为正常录制视频监控的情况,各个通道视频片段交替存储。编号6~10属于连续录制同一通道监控视频的情况。如果DHFS文件系统误格式化或部分视频覆盖的情况下,视频监控系统的文件系统遭到破坏,视频监控的恢复需要通过通道分离与重组进行还原,即分离出1、4、8编号的视频片段,重组成通道一的视频监控文件,分离出2、5、9、10编号的视频片段,重组成通道二的视频监控文件,分离出3、6、7编号的视频片段,重组成通道三的视频监控文件。因此对于DHFS文件系统数据取证问题,将转化成如何确
表1 DHFS帧头部结构
Table 1 Frame head structure of DHFS
┌───────┬───────┬─────────────────────┐
│偏移量 │占用字节 │含义 │
├───────┼───────┼─────────────────────┤
│0x00 │4 │帧起始标识0x44484156 │
├───────┼───────┼─────────────────────┤
│0x04 │2 │帧类型 │
├───────┼───────┼─────────────────────┤
│0x06 │2 │帧通道 │
├───────┼───────┼─────────────────────┤
│0x08 │4 │帧编号 │
├───────┼───────┼─────────────────────┤
│0x0C │4 │帧长度 │
├───────┼───────┼─────────────────────┤
│0x10 │4 │帧创建时间 │
└───────┴───────┴─────────────────────┘
表2 DHFS帧尾部结构
Table 2 Frame tail structure of DHFS
┌────────┬────────┬───────────────────┐
│偏移量 │占用字节 │含义 │
├────────┼────────┼───────────────────┤
│0x00 │4 │帧结束标识0x64686176 │
├────────┼────────┼───────────────────┤
│0x04 │4 │帧长度 │
└────────┴────────┴───────────────────┘
原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/191206.html