====================以下為IPCAM 基本====================
HuntStreamHeader(DATAHEADER) => HuntSystemHeader =>
以下為實際送: (system frame (uctype=0);
i frame (uctype=1,4);
p frame(uctype=2,3) ;
faceframe(uctype=41);
motionFrame(uctype=6);
fisheyeFrame (uctype=39);
AIFrame (uctype=42)
AI_OSD_frame(uctype=32)
====================以下為IPCAM 人臉====================
*uctype=41: //face
預計送法 : DATAHEADER => FACE_RECOGNITION HEADER=> FACE_RECOGNITION BODY=>THUMBNAIL DATA (沒用,影像?)=>FACE_RECOGNITION BODY=>THUMBNAIL DATA
//_FACE_RECOGNITION_HEADER 大小為18
typedef struct _FACE_RECOGNITION_HEADER
{
unsigned short face_count; //Total number of faces //偵測到的人臉數量
unsigned short inwidth; //input width //目前stream的解析度寬度
unsigned short inheight; //input height //目前stream的解析度高度
unsigned int length; //(sizeof(FACE_RECOGNITION_BODY)* face_count + total_thumbnail_size)
// +---------------+---------------+---------------+---------------+
// |0|1|2|3|4|5|6|7|0|1|2|3|4|5|6|7|0|1|2|3|4|5|6|7|0|1|2|3|4|5|6|7|
// +---------------+---------------+---------------+---------------+
// |商湯(0x01) | 版本佔3bytes |
// |閱面(0x02) | |
// +---------------+---------------+---------------+---------------+
unsigned int version; //version
unsigned int body_size; //單個body struct size (sizeof(FACE_RECOGNITION_BODY)) body_size=242
}__attribute__((packed)) FACE_RECOGNITION_HEADER;
FACE_RECOGNITION BODY (有好幾版v1.1 ~v9 ;以FACE_RECOGNITION_HEADER::body_size 區分)
====================以下為IPCAM Fisheye====================
*uctype=39
size:240 bytes
typedef struct _FISHEYE_HEADER
{
int Mode; 0
int Display; 4
int x1[FISHEYE_CHANNEL_SIZE][FISHEYE_AREA_SIZE]; 8
int y1[FISHEYE_CHANNEL_SIZE][FISHEYE_AREA_SIZE]; 40
int x2[FISHEYE_CHANNEL_SIZE][FISHEYE_AREA_SIZE]; 72
int y2[FISHEYE_CHANNEL_SIZE][FISHEYE_AREA_SIZE]; 104
int posx[FISHEYE_CHANNEL_SIZE][FISHEYE_AREA_SIZE]; 136
int posy[FISHEYE_CHANNEL_SIZE][FISHEYE_AREA_SIZE]; 168
int channel; 200
int limit_x_min[FISHEYE_CHANNEL_SIZE]; 204
int limit_x_max[FISHEYE_CHANNEL_SIZE]; 212
int limit_y_min[FISHEYE_CHANNEL_SIZE]; 220
int limit_y_max[FISHEYE_CHANNEL_SIZE]; 228
int speed; 236
} __attribute__((packed)) FISHEYE_HEADER;
====================以下為IPCAM AI====================
uctype=42: // 人形偵測?
isHuntIpcamAIFeature
new HuntAIFeatureHeader
unsigned int obj_num; 0
------依據obj_num數量決定重覆幾次------------ size: 16
unsigned short left; 4 20
unsigned short top; 6 22
unsigned short width; 8 24
unsigned short height; 10 26
unsigned char rect_color_R; 12 28
unsigned char rect_color_G; 13 29
unsigned char rect_color_B; 14 30
unsigned char line_color_R; 15 31
unsigned char line_color_G; 16 32
unsigned char line_color_B; 17 33
unsigned char line_size; 18 34
char point_num; 19 35
========================================
uctype=32: // 文字資訊
isHuntIpcamAI_OSD
new HuntAIFeatureOSDHeader
size:167 bytes.
typedef struct _TEXT_PRINT_EXTEND_HEADER
{
char text[30]; 0
char color; 30 //文字顏色 0/1/2/3/4/5: Red/White/Blue/Black/Yellow/Green
char size; 31 //文字大小 0/1/2: Small/Medium/Big default: 1(Medium)
char position; 32 //文字出現的位置 0/1/2/3: LeftTop/RightTop/LeftBottom/RightBottom
char order; 33 //跟著position設定顯示文字排列順序 (0,1,2,3)
int time; 34 //文字閃爍的時間 (-2:clear all, -1:close, 0:always, 1:1s, 2:2s, ...., 120:120s)
char extend_text[128]; 38
char fixFlag; 166
}TEXT_PRINT_EXTEND_HEADER
========================================
===================以下為NVR 基本(QT)=====================
QT header 順序=> _DATAHEADER , DVRFRAME_HEADER_V2, Image_header_V3
已知:
iss & fltk : Image_header_V2
android 中 已整 uctype(_DATAHEADER ):
private final static int HUNT_HEADER_TYPE_SYSTEM_FRAME = 0;
private final static int HUNT_HEADER_TYPE_I_FRAME = 1;
private final static int HUNT_HEADER_TYPE_P_FRAME = 2;
private final static int HUNT_HEADER_TYPE_B_FRAME = 3;
private final static int HUNT_HEADER_TYPE_JPEG_FRAME = 4;
protected final static byte HUNT_HEADER_TYPE_AUDIO = 5;
private final static int HUNT_HEADER_TYPE_MOTION = 6;
protected final static byte HUNT_HEADER_TYPE_CHAT = 11;
private final static int HUNT_HEADER_TYPE_DVR_STREAM = 14;
private final static int HUNT_HEADER_TYPE_HYBRID_STREAM = 19;
private final static int HUNT_HEADER_TYPE_NVR_STREAM = 21;
private final static int HUNT_HEADER_TYPE_NVR_36_STREAM = 24;//qt
private final static int HUNT_HEADER_TYPE_FISHEYE_INFO = 39;
private final static int HUNT_HEADER_TYPE_FACE_STREAM = 41;
private final static int HUNT_HEADER_TYPE_AI_FEATURE = 42;
private final static int HUNT_HEADER_TYPE_AI_OSD = 32;
=============================================
total len:20
typedef struct _DATAHEADER // Audio 或 Video Frame 所需的 header
{
unsigned char ucID[4]; // 識別碼,請用"3297" //pos end:4
unsigned char ucHeaderLen; // length of _DataHeader, 0xFF 保留供將來擴充用 //5
unsigned char ucType; // pos end:6
// Mask1~~~Mask3 total 32 bit(4 byte)
unsigned int Mask1:1;
unsigned int uiTimeMsec:10; // time millisecond
unsigned int uiReserved1:3; // 每個bit都是1
unsigned int Mask2:1;
unsigned int uiTimeSecHigh:16; // time second
unsigned int Mask3:1; // pos end:10
unsigned short usTimeSecLow; // time second //pos end:12
unsigned int Mask4:1;
unsigned int uiLength:24; // data length (Byte)
unsigned int uiReserved2:6; // 每個bit都是1
unsigned int Mask5:1; //pos end:16
unsigned short usSendCount:15; // send出去的frame,包system,I,P,B,J..... //18
unsigned short Mask6:1;
unsigned short usEncoderCount:15; // Encoder出來的frame,encoder只要切換就重算 //20
unsigned short Mask7:1;
} __attribute__((packed)) DATAHEADER ;
QT重點在:
Dataheader.ucType =0x 3, 0x 2, 0x 9, ox 7 //QT
Dataheader.ucType = (QT: 24 ,)
Dataheader.uiLength = sizeof(DVRFRAME_HEADER_V2);//下個frame長
ipcam:
Dataheader.ucType =' 3', '2', '9', '7' // ascii :0x33, 0x 32, 0x 39,ox 37
=============================================
DVRFRAME_HEADER_V2 //QT, hybrid
typedef struct _DVRFRAME_HEADER_V2
{
unsigned char ucVideoSystem; //NT=1;PAL=2
unsigned short usHeight; //影像高
unsigned short usWidth; //影像寬
unsigned char ucCompress:4; //0:mpeg4 1:h.264 2.jpeg 3:pcm 4:adpcm
unsigned char ucFrameType:4; //0:I 1:P 2:B
unsigned char ucCh; //Channel index
unsigned int uiDataLen; //資料長度
unsigned char ucSerial; //流水號 0-255
unsigned char ucPlayback; //0x80:PB/LIVE FF:0x40 RF:0x20 PAUSE:0x10
unsigned char ucArg; //回放時之速度
unsigned char ucImageSource; //0: DVR 1:IPCam //2: audio
} __attribute__((packed)) DVRFRAME_HEADER_V2;
QT 重點:
// DVRFRAME_HEADER_V2
dvrheader.usHeight = 0; //影像高
dvrheader.usWidth = 0; //影像寬
dvrheader.ucFrameType = 5;
dvrheader.ucCh = 0;
dvrheader.uiDataLen = pImage_header->u32Len+sizeof(struct Image_header_V3);
dvrheader.ucSerial = 0;
dvrheader.ucArg = get_speed(pMobileUserClient->nAction,pMobileUserClient->nSpeed);;
dvrheader.ucPlayback = 0x80;
=============================================
例如v3 header //QT 使用
typedef struct Image_header_V3
{
unsigned int nStartCode; //FFFFFFAA
time_t tSec; //時間
unsigned int tuSec;
unsigned int nLen; //Frame 的資料長度
unsigned long long nRec_ch; //紀錄錄影當時的頻道
unsigned short nChA; //Channel number
unsigned short nChB:4; // For Video:Reaolution, For Audio:Audio Type
unsigned short nFrameType:2; // 0: MPEG4 , 1: H264 , 2: ALL_AUDIO , 3: MJPEG
unsigned short nKeyframe:1; // 0: P-Frame , 1: I-Frame
unsigned short nVideosystem:1; // 0: NTSC , 1: PAL
unsigned short Capture:1; // 0: Analog , 1: IPCAM
unsigned short nRes:1; // 不使用,預設為 0
unsigned short field:2; // 不使用,預設為 3
unsigned short Reserver:4;
}__attribute__((packed)) Image_header_V3;
------------------------------------------------
int time_t int int (long long) short short
4 4 4 4 8 2 2 //占的位子大小(單位btye)
最後那個short為2byte,包含
nchB , nFrameType,nKeyframe,nVideosystem, //總和1byte
Capture,nRes,field,Reserver //總和1byte
以上是送
---------------------------------------
以下是收
如到因為little ending 所以會反過來,
如果為getshort(26)//26為起始位置
收到順序為Reserver,field,nRes,Capture,
nVideosystem,nKeyframe,nFrameType:2,nchB:4
所以: nFrameType 取為& 00 30
//30表示 0011(nVideosystem,nKeyframe,nFrameType:2)
0000(nchB)
=============================================
//fltk, iss 使用
typedef struct Image_Header_V2 {
unsigned int nStartCode; //FFFFFFAA
/*time_t*/ unsigned int tSec; //時間 unsigned int for 64-bit issue
//unsigned long long tSec; //時間 unsigned int for 64-bit issue
unsigned int tuSec;
unsigned int nLen; //Frame 的資料長度
unsigned int nRec_ch; //
unsigned short nChA; //Channel number
unsigned short nChB:4; // For Video:Reaolution, For Audio:Audio Type
unsigned short nFrameType:2; // 0: MPEG4 , 1: H264 , 2: ALL_AUDIO , 3: MJPEG
unsigned short nKeyframe:1; // 0: P-Frame , 1: I-Frame
unsigned short nVideosystem:1; // 0: NTSC , 1: PAL
unsigned short Capture:1; // 0: Analog , 1: IPCAM
unsigned short nRes:1; //
unsigned short field:2; //
unsigned short Reserver:4;
} Image_Header_V2;
============以下為NVR Fisheye=============
*uctype=39
size:240 bytes.
typedef struct FisheyeInfo
{
unsigned int u32Chnn; 0
int u32Mount; 4
int u32Display; 8
int u32Speed; 12
int mainx1[FISHEYE_AREA_SIZE]; 16
int mainy1[FISHEYE_AREA_SIZE]; 32
int mainx2[FISHEYE_AREA_SIZE]; 48
int mainy2[FISHEYE_AREA_SIZE]; 64
int subx1[FISHEYE_AREA_SIZE]; 80
int suby1[FISHEYE_AREA_SIZE]; 96
int subx2[FISHEYE_AREA_SIZE]; 112
int suby2[FISHEYE_AREA_SIZE]; 128
int posx[FISHEYE_CHANNEL_SIZE][FISHEYE_AREA_SIZE]; 144
int posy[FISHEYE_CHANNEL_SIZE][FISHEYE_AREA_SIZE]; 176
int limit_x_min[FISHEYE_CHANNEL_SIZE]; 208
int limit_x_max[FISHEYE_CHANNEL_SIZE]; 216
int limit_y_min[FISHEYE_CHANNEL_SIZE]; 224
int limit_y_max[FISHEYE_CHANNEL_SIZE]; 232
} FisheyeInfo;
====================以下為NVR人臉====================
*uctype=41: //face
同IPCAM 人臉
====================以下為IPCAM AI====================
*uctype=
沒有留言:
張貼留言