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 │幀長度 │
└────────┴────────┴───────────────────┘
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。