FLV文件分析
很久没看,做下关于FLV文件格式知识点回顾!
一、简单介绍
FLV(Flash Video)是Adobe公司推出的一种媒体封装格式。一个FLV文件,每个Tag类型都属于一个流。也就是说一个FLV文件最多只有一路音频流、一个路视频流,不能定义单个类型的多个独立流在一个文件中。 FLV数据以大端序存储,解析时需要注意。比如:0x12C,那么存储时就是0x01 0x2C。FLV封装格式由一个FLV Header和FLV Body组成,其中FLV Body由很多个Tag组成。Tag一般可以分为三种类型:脚本数据类型、音频数据类型、视频数据类型。 一个标准的FLV文件结构如下图所示:二、FLV文件头
(资料图片)
FLV Header官方协议文档定义如下:
针对FLV Header相关字段,解释下其中的含义:
46 4c 56 01 05 20 20 20 09 //就代表该FLV文件包含音频、视频
二、FLV文件Body
FLV Body 官方协议文档定义如下:
针对FLV Body相关字段,解释下其中的含义:
2.1 FLV Tag
每一个tag其实是由两部分组成,Tagheader(11 Byte)+Tagdata(实际数据域)。Tag Header中存放着TagType、DataSize等字段信息。而Tagdata部分就是实际数据域信息,后面会分别讲述数据域(Tag data)。其中FLVtag官方文档定义如下:针对FLV Tag相关字段,解释下其中含义:
2.2 Tagdata
2.2.1 Audio data tags(音频数据tag)
AUDIODATA官方协议文档定义如下:
针对AUDIODATA相关字段,解释下其中的含义:
AACAUDIODATA官方协议定义如下:
其中如果AACPacketType==0时,AudioSpecificConfig结构在ISO 14496-3文档中有定义该结构,部分结
构如下图:
AudioSpecificConfig() { audioObjectType = GetAudioObjectType(); samplingFrequencyIndex; // 4 bslbf if (samplingFrequencyIndex == 0xf) { samplingFrequency; // 24 uimsbf } channelConfiguration; // 4 bslbf sbrPresentFlag = -1; psPresentFlag = -1; if (audioObjectType == 5 || audioObjectType == 29) { // ... } else { extensionAudioObjectType = 0; } switch (audioObjectType) { case 1: case 2: case 3: case 4: //... GASpecificConfig(); break: case ...: //... } if (extensionAudioObjectType != 5 && bits_to_decode() >= 16) { //... }GetAudioObjectType() { audioObjectType; // 5 uimsbf if (audioObjectType == 31) { audioObjectType = 32 + audioObjectTypeExt; // 6 uimsbf } return audioObjectType;}
2.2.2 Video data tags(视频数据Tag)
VIDEODATA官方协议文档定义如下:针对VIDEODATA相关字段,解释下其中的含义:
AVCVIDEOPACKET官方协议定义如下:
其中如果是AVCPacketType==0时,即AVCsequenceheader,AVCDecoderConfigurationRecord在
ISO14496-15中定义如下:
aligned(8) class AVCDecoderConfigurationRecord { unsigned int(8) configurationVersion = 1; unsigned int(8) AVCProfileIndication; unsigned int(8) profile_compatibility; unsigned int(8) AVCLevelIndication; bit(6) reserved = "111111"b; unsigned int(2) lengthSizeMinusOne; bit(3) reserved = "111"b; unsigned int(5) numOfSequenceParameterSets; for (i = 0; i < numOfSequenceParameterSets; i++) { unsigned int(16) sequenceParameterSetLength ; bit(8*sequenceParameterSetLength) sequenceParameterSetNALUnit; } unsigned int(8) numOfPictureParameterSets; for (i = 0; i < numOfPictureParameterSets; i++) { unsigned int(16) pictureParameterSetLength; bit(8*pictureParameterSetLength) pictureParameterSetNALUnit; } if (profile_idc == 100 || profile_idc == 110 || profile_idc == 122 || profile_idc == 144) { bit(6) reserved = "111111"b; unsigned int(2) chroma_format; bit(5) reserved = "11111"b; unsigned int(3) bit_depth_luma_minus8; bit(5) reserved = "11111"b; unsigned int(3) bit_depth_chroma_minus8; unsigned int(8) numOfSequenceParameterSetExt; for (i = 0; i < numOfSequenceParameterSetExt; i++) { unsigned int(16) sequenceParameterSetExtLength; bit(8*sequenceParameterSetExtLength) sequenceParameterSetExtNALUnit; } }}
如果是H265,HEVCDecoderConfigurationRecord定义如下:
aligned(8) class HEVCDecoderConfigurationRecord { unsigned int(8) configurationVersion = 1; unsigned int(2) general_profile_space; unsigned int(1) general_tier_flag; unsigned int(5) general_profile_idc; unsigned int(32) general_profile_compatibility_flags; unsigned int(48) general_constraint_indicator_flags; unsigned int(8) general_level_idc; bit(4) reserved = ‘1111’b; unsigned int(12) min_spatial_segmentation_idc; bit(6) reserved = ‘111111’b; unsigned int(2) parallelismType; bit(6) reserved = ‘111111’b; unsigned int(2) chromaFormat; bit(5) reserved = ‘11111’b; unsigned int(3) bitDepthLumaMinus8; bit(5) reserved = ‘11111’b; unsigned int(3) bitDepthChromaMinus8; bit(16) avgFrameRate; bit(2) constantFrameRate; bit(3) numTemporalLayers; bit(1) temporalIdNested; unsigned int(2) lengthSizeMinusOne; unsigned int(8) numOfArrays; for (j=0; j < numOfArrays; j++) { bit(1) array_completeness; unsigned int(1) reserved = 0; unsigned int(6) NAL_unit_type; unsigned int(16) numNalus; for (i=0; i< numNalus; i++) { unsigned int(16) nalUnitLength; bit(8*nalUnitLength) nalUnit; } }}
-
FLV文件分析
博客园 2023-04-26
-
世界看点:长江汽车产业供应链有限公司和湖北长江车百产业基金成立 王忠林揭牌
湖北日报 2023-04-26
-
多只新能源ETF单日涨超6%,触底反弹还是接棒热点?-世界微头条
第一财经 2023-04-26
-
改签车票紧张!深圳火车站发布“五一”出行提示-每日时讯
深圳特区报 2023-04-26
-
美资金融企业代表团访琼 探寻跨区域合作新机遇 当前热点
中国新闻网 2023-04-26
-
灵活就业社保交多少年才能领取?灵活就业者社保多少钱一月?
律法网 2023-04-26
-
焦点!今日南向资金买卖十大成交榜(2023/4/26)
亚汇网 2023-04-26
-
IEA:预计今年电动车销量达1400万辆 占全球整车市场份额达18%
智通财经 2023-04-26
-
加强粮油收储能力建设 做好首府粮食安全保障 百事通
呼和浩特新闻网 2023-04-26
-
iqoo软件运行异常_要闻速递
互联网 2023-04-26
-
FLV文件分析
博客园 2023-04-26
-
世界看点:长江汽车产业供应链有限公司和湖北长江车百产业基金成立 王忠林揭牌
湖北日报 2023-04-26
-
多只新能源ETF单日涨超6%,触底反弹还是接棒热点?-世界微头条
第一财经 2023-04-26
-
改签车票紧张!深圳火车站发布“五一”出行提示-每日时讯
深圳特区报 2023-04-26
-
美资金融企业代表团访琼 探寻跨区域合作新机遇 当前热点
中国新闻网 2023-04-26
-
灵活就业社保交多少年才能领取?灵活就业者社保多少钱一月?
律法网 2023-04-26
-
焦点!今日南向资金买卖十大成交榜(2023/4/26)
亚汇网 2023-04-26
-
IEA:预计今年电动车销量达1400万辆 占全球整车市场份额达18%
智通财经 2023-04-26
-
加强粮油收储能力建设 做好首府粮食安全保障 百事通
呼和浩特新闻网 2023-04-26
-
iqoo软件运行异常_要闻速递
互联网 2023-04-26
-
独乐乐不如众乐乐 细数探险者昆仑巅峰版的设计小巧思
搜狐科技 2023-04-26
-
观热点:关于教师节诗歌好压抑的字_关于教师节诗歌
互联网 2023-04-26
-
母婴10大品牌_母婴十大品牌
互联网 2023-04-26
-
51岁李亚鹏云南参加泼水节,开心的像个孩子,被泼湿秃顶太醒目
盖饭娱乐 2023-04-26
-
dnf主题曲风一样的勇士_dnf主题曲-新消息
互联网 2023-04-26
-
全球实时:国联证券给予洋河股份买入评级 跨进300亿新起点 厂商同心再出发
每日经济新闻 2023-04-26
-
职务侵占罪被公安机关逮捕后可以做什么
法师兄 2023-04-26
-
长沙婚前医学检查及孕前优生检查是免费项目吗?
本地宝 2023-04-26
-
1个月HIBOR连升6日-环球微头条
观点 2023-04-26
-
文字的世界还清医药费通关攻略
逗游 2023-04-26
-
惊声尖笑百度云未删减_惊声尖笑百度云-今日要闻
互联网 2023-04-26
-
国米重建新转机,2将离队有反转,张康阳或赚1亿,有望与米兰双赢
体坛观察事 2023-04-26
-
2023核能领域国际标准化培训会于山东烟台举行
CBC金属网 2023-04-26
-
世界今日报丨市民出行需求大幅回升,五一假期前一日这一时段城市路网交通压力将明显攀升
北京日报客户端 2023-04-26
-
成都造《宇宙护卫队:风暴力量》动画电影即将上映|新视野
锦观新闻 2023-04-26
-
天天观点:临时股东大会通知提前几天_临时股东大会
互联网 2023-04-26
-
今年西安市将开展首次市级文明旅游示范单位评选
新华网 2023-04-26
-
安卓手机已支持宝马数字钥匙,谷歌、三星首批尝鲜
C114 通信网 2023-04-26
-
天天实时:看空AI的但斌,居然……
新浪财经 2023-04-26
-
孙克任|全球新视野
互联网 2023-04-26