容器格式之FLV介绍 FLVFlash 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 字节固定为FLVVersion1 字节FLV 版本通常为 1Flags1 字节bit0: 保留, bit2: 音频标志, bit4: 视频标志DataOffset4 字节文件头大小通常为 91.2 文件体结构文件体由一系列FLV TagPreviousTagSize组成-------------------------------------------------------------- | 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 100msTimestamp Extension1B时间戳高 8 位与低 24 位组合成完整时间戳Stream ID3B流标识通常为 00x00 00 00Tag 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 ID值FFmpeg CodecID说明PCM0x00PCM_S16BE/PCM_U8无压缩 PCMADPCM0x10ADPCM_SWFADPCM 压缩MP30x20MP3MPEG-1 Layer 3PCM_LE0x30PCM_S16LE/PCM_U8小端 PCMNellymoser 16kHz0x40NELLYMOSERNellymoser 编码Nellymoser 8kHz0x50NELLYMOSER8kHz 采样Nellymoser0x60NELLYMOSER标准 NellymoserPCM_ALAW0x70PCM_ALAWA-law 编码PCM_MULAW0x80PCM_MULAWμ-law 编码AAC0xA0AAC高级音频编码Speex0xB0SPEEXSpeex 编码采样率映射采样率标志值实际采样率Special0x00特殊Nellymoser 用11025 Hz0x0411.025 kHz22050 Hz0x0822.05 kHz44100 Hz0x0C44.1 kHz2.2 视频tag结构视频数据前有一个标志字节----------------------------------------- | Enhanced FLV Flag1bit|FrameType(3bit) | CodecID(4bit) | -----------------------------------------视频帧类型帧类型标志值说明Key Frame0x10关键帧I帧可独立解码Inter Frame0x20预测帧P帧Disposable Inter0x30可丢弃帧Generated Key0x40生成关键帧保留Video Info0x50视频信息/命令帧视频编码格式映射Codec ID值FFmpeg CodecID说明H.2630x02FLV1Sorenson H.263Screen0x03FLASHSVScreen VideoVP60x04VP6FOn2 VP6VP6 Alpha0x05VP6AVP6 带 AlphaScreen 20x06FLASHSV2Screen Video 2H.2640x07H264AVCReal H.2630x08H263真正的 H.263MPEG-40x09MPEG4MPEG-4 Part 2HEVC0x0CHEVCH.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帧率fpsvideodatarateNumber视频码率kbpsaudiodatarateNumber音频码率kbpsaudiocodecidNumber音频编码 IDvideocodecidNumber视频编码 IDaudiosamplerateNumber音频采样率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 格式元信息解析视频参数、关键帧索引

相关新闻

最新新闻

Java高并发底层原理(七)volatile 到底解决了什么问题

Java高并发底层原理(七)volatile 到底解决了什么问题

缓存一致性协议能够协调多个 CPU Core 对同一条 Cache Line 的读写,但 Java 程序仍然需要明确一件事:一个线程修改变量以后,另一个线程什么时候必须看到这个修改? volatile 就是 Java 提供的一种内存语义。它不负责把一段代码变成…

2026/7/7 16:07:50
【板子】kmp

【板子】kmp

#include <iostream> #include <string> #include <vector> using namespace std;// 求模式串p的next数组&#xff08;最长border&#xff09; vector<int> getNext(const string &p) {int n p.size();vector<int> next(n 1, 0); // next[…

2026/7/7 16:07:50
B站缓存视频格式转换:m4s-converter技术解析与实用指南

B站缓存视频格式转换:m4s-converter技术解析与实用指南

B站缓存视频格式转换&#xff1a;m4s-converter技术解析与实用指南 【免费下载链接】m4s-converter 一个跨平台小工具&#xff0c;将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 当你在B站缓存了珍贵的教学视…

2026/7/7 16:07:50
LTC6904与PIC32MX675F256L构建高精度方波发生器方案

LTC6904与PIC32MX675F256L构建高精度方波发生器方案

1. 项目背景与核心价值在嵌入式系统开发中&#xff0c;精确的时钟信号就像交响乐团的指挥棒&#xff0c;它决定了整个系统能否和谐运转。LTC6904这颗来自ADI的硅振荡器芯片&#xff0c;配合PIC32MX675F256L这款Microchip的32位微控制器&#xff0c;能够构建出精度高达0.5%的方波…

2026/7/7 16:07:50
控制系统串联校正 3 种方法对比:超前/滞后/滞后-超前适用场景与选择决策树

控制系统串联校正 3 种方法对比:超前/滞后/滞后-超前适用场景与选择决策树

控制系统串联校正方法实战指南&#xff1a;从理论到工程决策在工业自动化与机电系统设计中&#xff0c;控制系统的性能优化是一个永恒的话题。当我们面对一个响应迟缓、超调过大或稳态误差不达标的系统时&#xff0c;串联校正往往成为工程师的首选武器箱。不同于教科书上抽象的…

2026/7/7 16:07:50
高压安全隔离技术:ISOM8710与PIC18LF25K50应用解析

高压安全隔离技术:ISOM8710与PIC18LF25K50应用解析

1. 高压安全隔离技术背景与需求解析在工业控制和电力系统中&#xff0c;高压电路的安全隔离是一个至关重要的技术环节。传统的高压开关柜操作存在明显的安全隐患&#xff1a;当操作人员需要接触10kV及以上电压等级的电气设备时&#xff0c;即使设备已经断电&#xff0c;残余电荷…

2026/7/7 16:02:50

月新闻