type
status
date
slug
summary
tags
category
icon
password
Property
Mar 19, 2023 09:00 AM

基础知识

FLV 简介

notion image
notion image
  • Timestamp:指的是 DTS(解码时间戳)
    • DTS(Decoding Time Stamp)和 PTS(Presentation Time Stamp)是用于视频流中时间戳(timestamp)的两个不同的概念
    • PTS表示视频帧应该被显示的时间,即在时间轴上的呈现时间。DTS表示视频帧在解码后显示的时间,即在时间轴上的解码时间。通常,DTS比PTS小一些,因为视频解码器需要一些额外的时间来解码视频帧。如果视频帧的DTS与PTS相同,则可以立即呈现
    • 在处理视频流时,通常会使用DTS对视频进行解码,并使用PTS进行呈现。这是因为解码器需要按顺序解码视频流,并在正确的时间呈现视频帧

大体的解析框架

notion image

FLV header

  • 注:在下面的数据type中,UI表示⽆符号整形,后⾯跟的数字表示其长度是多少位。比如 UI8,表示⽆符号整形,⻓度⼀个字节。UI24是三个字节,UI[8*n]表示多个字节。UB表示位 域,UB5表示⼀个字节的5位。可以参考c中的位域结构体。 FLV头占9个字节,用来标识文件为FLV类型,以及后续存储的⾳视频流。⼀个FLV文件,每种 类型的tag都属于⼀个流,也就是⼀个flv文件最多只有⼀个音频流,⼀个视频流,不存在多个 独立的音视频流在⼀个文件的情况
    • 位域结构体:主要作用是节约内存空间,特别是在需要存储大量标志位的场景下。由于每个标志位只占用一个或几个比特,因此可以让多个标志位共用一个字节或多个字节,从而达到节约内存的目的。使用位域结构体时需要注意的是,由于其底层实现是通过位运算来实现的,因此可能会对程序的可读性和可移植性产生一定的影响。另外,位域结构体的具体实现和字节对齐规则有关,因此在不同的编译器和操作系统下可能会有不同的行为,需要注意跨平台兼容性
    • FLV头的结构如下:
      • notion image
      • 比特流的解析:从左往右解析(以下比特流颜色与上面头部顺序对应)
        • notion image

    FLV Body

    notion image
    • 以下截取为某 Previous Tag Size(从左往右解析):
      • notion image

    FLV Tag

    每⼀个Tag也是由两部分组成:tag headertag data。tag header⾥存放的是当前 tag 的类 型、数据区(tag data)的⻓度等信息

    Tag Header

    Tag Header ⼀般占11个字节的内存空间。FLV Tag 结构如下:
    notion image
    notion image

    Script Tag Data结构(脚本类型、帧类型)

    该类型 Tag ⼜被称为 MetaDataTag,存放⼀些关于FLV视频和⾳频的元信息,⽐如:duration、width、height等。通常该类型 Tag 会作为 FLV ⽂件的第⼀个 tag ,并且只有⼀个,跟在 File Header后。该类型 TagData 的结构如下所示(source.200kbps.768x320.flv⽂件为例):
    notion image
    notion image
    • AMF:全称为Action Message Format,是Adobe公司为Flash Player和AIR应用程序设计的一种数据格式。它基于二进制格式,用于序列化和传输各种类型的数据,如数值、字符串、对象、数组等。AMF包是指基于AMF格式封装的数据包,通常用于在Flash Player和Flash Media Server之间进行通信和数据传输。AMF包可以包含用于控制和传输音视频流的命令和参数,也可以包含用于传输其他类型数据的命令和参数
    • Mediainfo 打开 FLV 中对应参数:
      • notion image
        notion image

        Audio Tag Data结构(音频类型)

        notion image
    • 第一个字节:为音频的信息(仔细看spec发现对于AAC而言,比较有用的字段是 SoundFormat),格式如下:
      • notion image
      • If the SoundFormat indicates AAC, the SoundType should be set to 1 (stereo) and the SoundRate should be set to 3 (44 kHz). However, this does not mean that AAC audio in FLV is always stereo, 44 kHz data. Instead, the Flash Player ignores these values and extracts the channel and sample rate data is encoded in the AAC bitstream.
        • notion image
    • 结论:如果是AAC数据,如果他是AAC RAW, tag data[3] 开始才是真正的AAC frame data。(前面的自字节用作于区分)
      • notion image

        Video Tag Data结构(视频类型)

        notion image
    • 第⼀个字节:包含视频信息,格式如下:
      • notion image

    FLV 时间戳计算

    notion image
    notion image

    FLV 解封装代码分析

    功能强大的 FLV 文件分析和解析器 FlvParser
     
    本文资料来源于网络,此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除。
    FFmpeg 对 FLV 文件进行解码H.264/AVC 视频编码格式分析