Skip to content

Latest commit

 

History

History
140 lines (135 loc) · 4.24 KB

flv.md

File metadata and controls

140 lines (135 loc) · 4.24 KB

flv 格式

/**
 * https://www.adobe.com/content/dam/acom/en/devnet/flv/video_file_format_spec_v10_1.pdf
 * 
 * FLV 结构:
 * 
 * |  flv header | prevTagSize | tag1 | prevTag1Size | tag2 | prevTag2Size | ......| tagN | prevTagNSize |
 * 
 * FlvHeader(9字节)结构:
 * 
 * F : 第1字节
 * L :  ...
 * V :  ...
 * version : 第4字节
 * TypeFlagsReserved : 第5字节 前5bit 
 * TypeFlagsAudio : 第5字节 bit6  是否有音频
 * TypeFlagsReserved : bit7
 * TypeFlagsVideo : bit8 是否有视频
 * DataOffset : 第6-9字节 header size, 9
 * 
 * 
 * prevTagSize : 4字节 代表上一个tag的长度
 * prevTagSize = TagHeader(11字节) + Tag Payload
 * 
 * flv header 后紧跟的 prevTagSize 值为0
 * 
 * 
 * FlvTag
 * | TagHeader | TagPayload |
 * 
 * TagHeader(11字节)结构:
 * 
 * Reserved : 第一字节 bit 1-2 
 * Filter : bit3  是否需要预处理, 1: 需要预处理(例如 先解密)
 * TagType : bit4-8 取值: 8=audio , 9=video 18= script data
 * DataSize : 3字节 TagPayload的长度
 * Timestamp : 3字节  此tag携带的音、视频帧的pts(单位为ms),值是相对于第一个tag的
 * TimestampExtended : 1字节 扩展timestamp字段,当timestamp3字节存不下数据时用到,代表最高8位,
 * StreamID : 3字节 取值 0 ,无用
 * 
 * TagPayload:
 * 
 *  TagType == 8时 
 *                     header.filter == 1  header.filter == 1
 *    | AudioTagHeader | EncryptionHeader? | FilterParams? | AUDIODATA |
 * 
 *  TagType == 9时 
 *                      filter == 1         filter == 1
 *    | VideoTagHeader | EncryptionHeader? | FilterParams? | VideoDATA |
 * 
 *  TagType == 18时 
 *       filter == 1         filter = 1
 *    | EncryptionHeader? | FilterParams? | ScriptDATA |
 * 
 * 
 * AudioTagHeader结构 (1或2字节):
 * 
 * SoundFormat : bit1-4 表示音频格式。 0:行内pcm数据,平台字节序 3:行内pcm,小端序 10:aac格式 
 * SoundRate : bit5-6  采样率 0=5.5kHz 1=11kHz 2=22kHz  3=44kHz
 * SoundSize : 采样大小 0=8bit 1采样 1=16bit 1采样
 * SoundType : 声道类型 0=单声道 1=立体声
 * AACPacketType : 1字节 如果soundFormat==10 及aac编码格式,则存在这个字节
 *                      0=aac 序列header , 1=aac元数据
 *   
 * 
 * AUDIODATA结构:
 * 
 *    if(flvTag.header.filter===1){
 *        AUDIODATA = EncryptedBody
 *    }else{
 *        if(audioTagHeader.soundFormat ===10 ){
 *          AUDIODATA = AACAudioData
 *        }else{
 *          AUDIODATA = 其他音频格式数据
 *        }
 *    }
 * 
 * AACAudioData结构:
 * 
 *    if(audioTagHeader.aacPacketType==0){
 *        // audioData代表 ISO中定义的AudioSpecificConfig
          *  audioObjectType    5bit
          *  samplingFrquecyIndex   4bit
          *  if(samplingFrquencyIndex === 0xf)
          *     samplingFrequency   24bit
          *  channelConfiguration   4bit |01111000| 
 *    }else{
 *       // audioData代表 原生的aac 帧数据
 *    }
 *    
 * VideoTagHeader结构(AVC格式 5字节):
 * 
 * FrameType : bit 1-4  1=keyFrame  2=inter frame
 * CodecId : bit 5-8  编码器信息  7=AVC
 * AvcPacketType :  1字节  codecId==7时存在   0=avc序列header 1=avc nalU 2=avc end of sequence
 * CompositionTime  : 3字节 codecId==7时存在  取值 0 或者 具体值 单位ms
 * 
 * VIDEODATA结构:
 * 
 *  if(flvTag.header.filter===1){
 *      AUDIODATA = EncryptedBody
 *  }else{
 *      if(videoTagHeader.codecId ===7 ){
 *        VIDEODATA = AVCPACKETDATA
 *      }else{
 *        VIDEODATA = 其他格式
 *      }
 *  }
 * 
 * AVCPACKETDATA结构:
 * 
 * if(videoTagHeader.avcPacketType==0){
 *    // AVCDecoderConfigurationRecord
      *  configurationVerison = 1  uint(8)
      *  avcProfileIndication      uint(8)
      *  profile_compatibility     uint(8)
      *  avcLevelIndication        uint(8)
      *  reserved   `111111`       bit(6)
      *  lengthSizeMinusOne        uint(2)
      *  reserved   `111`          bit(3)
      *  numOfSPS                  uint(5)
      *  for(numOfSPS)
      *    spsLength               uint(16)
      *    spsNALUnit              spsLength个字节
      *  numOfPPS                  uint(8)
      *  for(numOfPPS)
      *     ppsLength              uint(16)
      *     ppsNALUnit             ppsLength个字节
 * }else{
 *    // Nal units数据
 * }
 * 
 */