当前位置: 首页 > news >正文

容器格式之FLV介绍

FLV(Flash Video)是 Adobe 推出的流媒体封装格式,主要承载 H.263/H.264 视频、MP3/AAC 音频,结构极简,适合网络边下载边播放。整体分为两大块:FLV Header(文件头)+FLV Body(数据体,由一个个 Tag 组成)

一、FLV文件格式

FLV文件 = [FLV Header] + [PreviousTagSize0(4字节)] + [Tag1] + [PreviousTagSize1(4字节)] + [Tag2] + ...

  • Header:固定 9 字节,描述文件版本、是否含音视频
  • PreviousTagSize:每个 Tag 后紧跟 4 字节,记录上一个 Tag 总长度(用于反向遍历)
  • Tag:真正存储音视频 / 脚本元数据的单元

1.1 文件头

+----------------+----------------+----------------+----------------+ | Signature(3B) | Version(1B) | Flags(1B) | DataOffset(4B) | | "FLV" | 0x01 | 音频/视频标志 | 文件数据偏移 | +----------------+----------------+----------------+----------------+

关键字段说明:

字段大小说明
Signature3 字节固定为FLV
Version1 字节FLV 版本,通常为 1
Flags1 字节bit0: 保留, bit2: 音频标志, bit4: 视频标志
DataOffset4 字节文件头大小,通常为 9

1.2 文件体结构

文件体由一系列FLV Tag+PreviousTagSize组成:

+-------------+------------------+-------------+------------------+ | PreviousTagSize0 | tag1 | PreviousTagSize1 | tag2 | | (4 字节) | (可变长度) | (4 字节) | (可变长度) | +-------------+------------------+-------------+------------------+

每个 Tag 结束后追加 4 字节无符号大端整数,存储前一个 Tag 的完整字节长度

  • 文件第一个 Tag 前固定为00 00 00 00(无前序 Tag)
  • 作用:播放器可从文件末尾倒序读取 Tag,快速定位最后一帧

1.2.1 tag

+-----------+-----------+-----------+-----------+-----------+ | Type(1B) | Size(3B) | Time(3B) | TimeExt(1B)| StreamID(3B)| | 标签类型 | 数据大小 | 时间戳 | 时间戳扩展 | 流 ID(0) | +-----------+-----------+-----------+-----------+-----------+ | Tag Data (可变长度) | +-----------------------------------------------------------+
字段大小说明示例
Tag Type1BTag 类型标识0x08=音频,0x09=视频,0x12=元数据
Data Size3BTag Data 的字节长度(大端序)0x00 00 10= 16 字节
Timestamp3B时间戳低 24 位(毫秒)0x00 00 64= 100ms
Timestamp Extension1B时间戳高 8 位与低 24 位组合成完整时间戳
Stream ID3B流标识,通常为 00x00 00 00
Tag Data可变实际数据内容音频/视频/元数据

时间戳计算

// 时间戳由 3 字节低位 + 1 字节高位组成 dts = avio_rb24(s->pb); // 读取低 24 位 dts |= (unsigned)avio_r8(s->pb) << 24; // 组合高 8 位

二、tag详解

2.1音频tag结构

音频数据前有一个标志字节:

+---------------------------------------------------+ | CodecID(4bit) | SampleRate(2bit) | Size(1bit) | Channel(1bit) | +---------------------------------------------------+

音频编码格式映射:

Codec IDFFmpeg CodecID说明
PCM0x00PCM_S16BE/PCM_U8无压缩 PCM
ADPCM0x10ADPCM_SWFADPCM 压缩
MP30x20MP3MPEG-1 Layer 3
PCM_LE0x30PCM_S16LE/PCM_U8小端 PCM
Nellymoser 16kHz0x40NELLYMOSERNellymoser 编码
Nellymoser 8kHz0x50NELLYMOSER8kHz 采样
Nellymoser0x60NELLYMOSER标准 Nellymoser
PCM_ALAW0x70PCM_ALAWA-law 编码
PCM_MULAW0x80PCM_MULAWμ-law 编码
AAC0xA0AAC高级音频编码
Speex0xB0SPEEXSpeex 编码

采样率映射:

采样率标志实际采样率
Special0x00特殊(Nellymoser 用)
11025 Hz0x0411.025 kHz
22050 Hz0x0822.05 kHz
44100 Hz0x0C44.1 kHz

2.2 视频tag结构

视频数据前有一个标志字节:

+-----------------------------------------+ | Enhanced FLV Flag(1bit)|FrameType(3bit) | CodecID(4bit) | +-----------------------------------------+

视频帧类型:

帧类型标志说明
Key Frame0x10关键帧(I帧),可独立解码
Inter Frame0x20预测帧(P帧)
Disposable Inter0x30可丢弃帧
Generated Key0x40生成关键帧(保留)
Video Info0x50视频信息/命令帧

视频编码格式映射:

Codec IDFFmpeg CodecID说明
H.2630x02FLV1Sorenson H.263
Screen0x03FLASHSVScreen Video
VP60x04VP6FOn2 VP6
VP6 Alpha0x05VP6AVP6 带 Alpha
Screen 20x06FLASHSV2Screen Video 2
H.2640x07H264AVC
Real H.2630x08H263真正的 H.263
MPEG-40x09MPEG4MPEG-4 Part 2
HEVC0x0CHEVCH.265(增强 FLV)

增强FLV

增强 FLV 扩展了视频编码支持,通过 FourCC 标识:

// 增强 FLV 的编码检测 if (enhanced_flv) { codec_id = avio_rb32(s->pb); // 读取 FourCC switch (codec_id) { case MKBETAG('h', 'v', 'c', '1'): // "hvc1" par->codec_id = AV_CODEC_ID_HEVC; break; case MKBETAG('a', 'v', '0', '1'): // "av01" par->codec_id = AV_CODEC_ID_AV1; break; case MKBETAG('v', 'v', 'c', '1'): // "vvc1" par->codec_id = AV_CODEC_ID_VVC; break; } }

2.3 元数据tag

┌─────────────────────────────────────────────────────────────────┐ │ 元数据 Tag Data 结构 │ ├─────────────┬──────────────────┬───────────────────────────────┤ │ Type(1B) │ String Length │ String Value │ AMF Object │ │ (AMF类型) │ (2B) │ (可变) │ (可变) │ └─────────────┴──────────────────┴───────────────────────────────┘

2.3.1 元数据类型

typedef enum { AMF_DATA_TYPE_NUMBER = 0x00, // 8字节浮点数 AMF_DATA_TYPE_BOOL = 0x01, // 布尔值 AMF_DATA_TYPE_STRING = 0x02, // 字符串 AMF_DATA_TYPE_OBJECT = 0x03, // 对象 AMF_DATA_TYPE_NULL = 0x05, // 空值 AMF_DATA_TYPE_UNDEFINED = 0x06, // 未定义 AMF_DATA_TYPE_MIXEDARRAY = 0x08, // 混合数组 AMF_DATA_TYPE_ARRAY = 0x0a, // 数组 AMF_DATA_TYPE_DATE = 0x0b, // 日期 } AMFDataType;

2.3.2 元数据关键字段

字段名类型说明
durationNumber视频时长(秒)
widthNumber视频宽度(像素)
heightNumber视频高度(像素)
framerateNumber帧率(fps)
videodatarateNumber视频码率(kbps)
audiodatarateNumber音频码率(kbps)
audiocodecidNumber音频编码 ID
videocodecidNumber视频编码 ID
audiosamplerateNumber音频采样率
audiosamplesizeNumber音频位深
stereoBoolean是否立体声
encoderString编码器信息

2.3.3 关键帧索引(keyframes)

元数据中包含关键帧索引,用于快速 Seek:

// keyframes 对象结构 { "keyframes": { "times": [0, 1000, 2000, ...], // 关键帧时间戳数组 "filepositions": [100, 5000, 12000, ...] // 关键帧文件偏移数组 } }

2.3.4 tag比较

ag 类型标识主要内容特殊处理
音频0x08音频采样数据解析编码格式、采样率、声道
视频0x09视频帧数据解析帧类型、编码格式、CTS
元数据0x12AMF 格式元信息解析视频参数、关键帧索引
http://www.jsqmd.com/news/1141985/

相关文章:

  • UG95与PIC32MX675F256L在工业自动化中的高性价比通信方案
  • CVE-2025-32462与CVE-2025-32463漏洞深度解析与修复指南
  • 网络安全认证全解析:NISP、CISP、PTE、CISSP职业路径与备考指南
  • milvus | 第 3 章:Milvus 源码地图与阅读方法
  • WSEN-ISDS三轴MEMS传感器与PIC32微控制器的运动检测方案
  • 基于74HC32与MKV44F256VLH16的键盘管理系统设计
  • OpenRGB:终极免费开源RGB统一控制解决方案,告别多软件混乱时代
  • 定时器中断跨文件使用变量
  • 蓝牙5.4 LE Audio开发实战:IDC777-1与STM32L4A6RG方案解析
  • 大数据开发工具-Transwarp Data Studio
  • STM32与WSEN-ISDS传感器硬件协同设计与姿态解算实践
  • STM32与EM3080-W构建高效条形码解码系统
  • INI配置文件安全风险剖析:渗透测试中的敏感信息泄露与利用
  • GTA5线上小助手:解锁洛圣都无限可能的终极开源方案
  • STM32与L9958电机驱动系统设计与优化
  • Netcat for Windows:终极网络调试瑞士军刀解决方案
  • Python快速上手:调用企业工商API接口,构建供应商画像
  • 高精度ADC方案设计:基于ADS131M02与PIC18F46K42
  • 多传感器融合时间同步方案对比:PPS+RTC vs PTP vs 硬件触发3种模式
  • 高效智能的KKManager:Illusion游戏模组管理终极解决方案
  • 工业级数字隔离器与高性能微控制器的技术解析与应用
  • 探索消费级GPU虚拟化的3种技术实现路径:从硬件限制到软件突破
  • TPAFE0808与STM32L031C6在工业控制中的高精度信号采集方案
  • IS31FL3731与PIC18F97J94的LED驱动方案解析
  • PIC18微控制器扩展EEPROM存储方案与优化实践
  • EM3080-W条码扫描模块与TM4C1294微控制器的工业应用
  • LV30条码扫描器与PIC18LF4682微控制器的工业级解码系统设计
  • Stable Diffusion本地部署:免费无限生成AI绘画的完整指南
  • ASM330LHH与STM32C031C6在运动跟踪中的低功耗方案
  • 工业级4-20mA电流环方案设计与优化实践