首页 > 其他分享 >FLV文件分析

FLV文件分析

时间:2023-04-26 21:58:13浏览次数:27  
标签:分析 文件 reserved int unsigned FLV Tag bit

很久没看,做下关于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其实是由两部分组成,Tag header(11 Byte)+Tag data(实际数据域)。Tag Header中存放着 TagType、DataSize等字段信息。而Tag data部分就是实际数据域信息,后面会分别讲述数据域(Tag data)。 其中FLV tag官方文档定义如下:

针对FLV Tag相关字段,解释下其中含义:

2.2 Tag data 

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时,即AVC sequence header,AVCDecoderConfigurationRecord在

ISO 14496-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;
                }
        }
}

标签:分析,文件,reserved,int,unsigned,FLV,Tag,bit
From: https://www.cnblogs.com/shu-jie/p/17357471.html

相关文章

  • Geotools处理shape文件
    shape文件结构filename.shp:shapesfilename.shx:索引文件filename.dbf:结构化数据文件filename.qix:空间索引文件filename.fix:fid索引文件filename.sld:样式文件依赖<dependency><groupId>org.geotools</groupId><artifactId>gt-main</artifactId>......
  • cmake包含单独.hpp文件
    myproject/├──CMakeLists.txt├──main.cpp└──include└──hello.hpp#OpenCVfind_package(OpenCVREQUIRED)include_directories(${OpenCV_INCLUDE_DIRS})#Eigenfind_package(Eigen3REQUIRED)include_directories(${EIGEN3_INCLUDE_DIR})include_dire......
  • <packaging>war</packaging>在pom.xml文件里添加这个会导致404的出现
    Maven,javaweb我在pom.xml文件里面添加了这行代码<packaging>war</packaging>就会导致jsp界面的运行失败但是还无道理呀,以往都可以运行成功的啊我通过一行一行注释代码创建项目找到的答案,找了我好久。<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.......
  • python的文件路径操作(转)
    1.1绝对路径不同操作系统下绝对路径的表现形式是不一样的,以Windows系统为例,一个文件的路径可能是这样的:D:\files\data\ndvi.tif其中:D:\:表示根文件夹,是文件所在的盘符,即D盘。D:\files\data:表示文件所在的文件夹的路径,即D盘的files文件夹的子文件夹data。ndvi.tif:表示文件名......
  • oracle 分析函数 RANK、DENSE_RANK、ROW_NUMBER
    Row_number函数返回一个唯一的值,当碰到相同数据时,排名按照记录集中记录的顺序依次递增。 Dense_rank函数返回一个唯一的值,除非当碰到相同数据时,此时所有相同数据的排名都是一样的。 Rank函数返回一个唯一的值,除非遇到相同的数据时,此时所有相同数据的排名是一样的,同时会在最后一条......
  • oracle 分析函数 NTILE
    用SCOTT/TIGER登录。NTILE函数对一个数据分区中的有序结果集进行划分,将其分组为各个桶,并为每个小组分配一个唯一的组编号。SQL:SELECTENAME,SAL,NTILE(2)OVER(ORDERBYSALASCNULLSLAST)FROMEMP;结果:SQL:SELECTENAME,SAL,NTILE(3)OVER(ORDERBYSALASCNULLSLAST......
  • oracle 分析函数 FIRST_VALUE、LAST_VALUE
    用SCOTT/TIGER登录。FIRST_VALUE、LAST_VALUE是两个分析函数。返回结果集中排在第一位和最后一位的值。使用FIRST_VALUE:SELECTDEPTNO,JOB,SUM(SAL),FIRST_VALUE(SUM(SAL))OVER(PARTITIONBYDEPTNOORDERBYSUM(SAL))FROMEMPGROUPBYDEPTNO,JOBORDERBYDEPTNO,JOB;......
  • oracle 分析函数 LAG、LEAD
    用SCOTT/TIGER登录。LAG()和LEAD()统计函数可以在一次查询中取出同一字段的前N行的数据和后N行的值。这种操作可以使用对相同表的表连接来实现,不过使用LAG和LEAD有更高的效率。SQL:SELECTJOB,SAL,LAG(SAL)OVER(ORDERBYJOB)FROMEMP;结果:SQL:SELECTJOB,SAL,LAG(SAL,2)......
  • struts1 上传文件
    java代码:packagecom.struts1.form;importorg.apache.struts.action.ActionForm;importorg.apache.struts.upload.FormFile;publicclassUploadFileFormextendsActionForm{ privatestaticfinallongserialVersionUID=1L; privateFormFileformFile; pu......
  • POT超阈值模型和极值理论EVT分析|附代码数据
    全文链接:http://tecdat.cn/?p=16845最近我们被客户要求撰写关于极值理论的研究报告,包括一些图形和统计输出。本文依靠EVT对任何连续分布的尾部建模。尾部建模,尤其是POT建模,对于许多金融和环境应用至关重要POT模型其主要动机是为高洪水流量的概率模型提供实用工具。但是,EVT的优......