0
点赞
收藏
分享

微信扫一扫

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

读思意行 2022-07-27 阅读 101


编者:李国帅


介绍:

因为一个媒体文件不一定包含一种流类型可能包含视频、音频、字幕,甚至多路视频,多路音频(多声道),双字幕。所以必要对帧进行分组,        而不仅仅是因为存在关键帧和非关键帧的问题。

 

         文件内容:文件头(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)

 

举报

相关推荐

0 条评论