编者:李国帅
qq:9611153 微信lgs9611153
时间:2012/7/4 15:52:16
介绍:
因为一个媒体文件不一定包含一种流类型可能包含视频、音频、字幕,甚至多路视频,多路音频(多声道),双字幕。所以必要对帧进行分组, 而不仅仅是因为存在关键帧和非关键帧的问题。
文件内容:文件头(256字节)+ 帧组1(配置帧组)----帧组2-----...-----帧组N
帧组:本组头部(64字节)+帧头数组(帧数*64字节)+帧数据数组(帧数据,变长)
详细介绍:
下表对文件头进行了描述
内容 地址 字节数(bytes) 备注
公司描述 00 10 SUNSHINE
视频类型 10 1 存储的媒体类型
设备厂家信息 11 1 媒体所属产品
原始文件名 12 64 Filename, 不含路径
版本 76 2 文件格式版本
加密标志 78 1 指示文件是否加密
开始时间 79 14 yyyyMMddhhmmss
标题 93 32 文字标题
音频类型 125 1 存放音频类型,如果>0则表示有音频,并。
影片长度 126 4 影片毫秒总数
总帧数 130 4 影片总视频帧数
保留 134 122 保留
对帧组进行了描述
内容 地址 字节数(bytes) 所属类别 备注
本组帧数 0 2 本组头部 本组的帧数,对于配置帧组为1
帧头及帧数据长度 2 4 本组头部 该帧组中所有帧头和帧数据的总长度
上一帧组偏移 6 8 本组头部 上一帧组在文件中的位置
保留字段 14 50 本组头部
帧头数组 64 64×N 帧头数组 本组的所有帧头数据
帧数据数组 64(N+1) 帧数据 本组的所有帧数据
下表对帧头进行了描述
内容 地址 字节数(bytes) 备注
时间戳 00 4 相对于第一帧的毫秒数:音频帧相对于第一音频帧,视频帧相对于第一视频帧。
帧索引 04 4 从1开始递增的整数
校验和 8 16 检验和并加密
帧类型 24 1 表示此帧类型,如I帧、P帧等
移动侦测值 25 2 对运动窗口的检测数据,0-100整数
帧偏移 27 8 该帧在文件中的位置(首字节位置为0)
当前帧大小 35 4 当前帧数据大小
保留 39 25 保留字段
FILE FORMAT:
// |-----256-----|------64----- one group -64---------------------|----------other groups -------------|
// | file header | group header | frame header(s) | frame data(s) | ...................................|
//第一个组设定为配置帧,只有一个数据块。
文件结构体实例:
#define LEN_FILE_HEADER 256
#define LEN_GROUP_HEADER 64
#define LEN_FRAME_HEADER 64
#define MAX_GROUP_FRAMES 30 //本地录像不需要 1024
#pragma pack(push)
#pragma pack(1)
typedef struct
{
GroupHeader headerGroup;
FrameHeader headerFrame;
char FrameData[100];
}GroupConfig;
typedef struct
{
LONGLONG FrameOffset; // Frame offset from file
LONG lTimeStamp; // Time stamp//相对"开始时间"的毫秒数
LONG lFrameIndex; // start from 1 //whole index, begin with the first non-configure frame //increasing 1
LONG lFrameSize; // Size of this frame
BYTE cbMobileCheckVal[2];// Mobile frame check value, 0-100
BYTE cbCheckSum[16]; // Encrypted CheckSum, set zero
BYTE cbFrameType; // Frame Type 帧类型
BYTE cbReserved[25];
}FrameHeader;//描述了帧头64
/*
帧类型说明
帧类型:高3位 '111'
0:配置帧-媒体文件配置
1:数据帧
4:视频帧-由on_video_sample函数接收的帧
6:音频帧-由on_audio_sample函数接收的帧
低5位'11111'
0:I帧 (视频)
1:P帧 (视频)
2:B帧 (视频)
3:JPEG帧 (视频)
4:碎片帧 (视、音频)
5:无效帧 (视、音频)
*/
typedef struct
{
LONGLONG llPrevGroupAddr;//前一组地址
LONG lLength; // total length of frame headers and data //组内数据长度=帧头+帧数据[不带组头的]
WORD wFrames; // total frames of current group组内帧数
BYTE cbReserved[50];
}GroupHeader;//描述了组头64
typedef struct
{
char szCompanyDesc[10]; // Company Description
BYTE cbMediaType; //文件类型
BYTE cbProductInfo; // Owned Product: 0-通用,1-安讯士产品,2-HIKV, …(目前该字段均填写1)
char szOrgFileName[64]; //原始文件名
BYTE cbVersion[2]; //版本
BYTE cbEncrypt; // 加密标志
BYTE cbAudio; // If its Exist Audio
char cbStartTime[14]; // 开始时间yyyyMMddhhmmss
char cbEndTime[14]; //结束时间,如果lDuration=0,要从cbEndTime计算持续时间
char szTitle[32]; // Text Title标题
LONG lDuration; // 持续时间
LONG lVideoFrames; // total video frames 视频帧数
BYTE cbReserved[108];
}FileHeader;//描述了文件头结构256
#pragma pack(pop)