如何在媒体文件存储帧数据

编者:李国帅

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)

 

猜你喜欢

转载自blog.csdn.net/lgs790709/article/details/84791541
0条评论
添加一条新回复