FLV音视频存储规范
一、
FLV(Flash Video)是Adobe公司推出的一种流媒体播放格式,广泛应用于网络视频传输,其设计目标是为互联网高效传输音视频内容提供支持,本文将详细解析FLV文件的结构和相关规范。
二、FLV文件结构
FLV文件头
字段 | 类型 | 描述 |
Signature1 | UI8 | 固定值'F' (0x46) |
Signature2 | UI8 | 固定值'L' (0x4C) |
Signature3 | UI8 | 固定值'V' (0x56) |
Version | UI8 | FLV版本号,一般为0x01 |
TypeFlagsReserved | UB5 | 保留字段,必须为0 |
TypeFlagsAudio | UB1 | 音频流标志位 |
TypeFlagsVideo | UB1 | 视频流标志位 |
TypeFlagsReserved2 | UB2 | 保留字段,必须为0 |
DataOffset | UI32 | 文件头大小,通常为9字节 |
FLV文件体
FLV文件体由多个Tag组成,每个Tag包含以下内容:
Previous Tag Size(4 bytes):前一个Tag的大小,第一个Tag此值为0。
Tag Header(11 bytes):包括Tag类型、数据大小和时间戳等。
Tag Type(UI24):标识Tag的类型(音频、视频、脚本)。
Data Size(UI24):数据区大小,不包括包头。
Timestamp(UI24):时间戳,单位为毫秒。
Timestamp Extended(UI8):扩展时间戳,当基本时间戳超过0xFFFFFF时使用。
Stream ID(UI24):流ID,对于FLV总是0。
音频标签(Audio Tag)
字段 | 类型 | 描述 |
SoundFormat | UB4 | 音频格式: 0: Linear PCM, platform endian 1: ADPCM 2: MP3 3: Linear PCM, little endian 4: Nellymoser 16-kHz mono 5: Nellymoser 8-kHz mono 6: Nellymoser 7: G.711 A-law logarithmic PCM 8: G.711 mu-law logarithmic PCM 9: reserved 10: AAC 11: Speex 14: MP3 8-Khz 15: Device-specific sound |
SoundRate | UB2 | 采样率: 0: 5.5-kHz 1: 11-kHz 2: 22-kHz 3: 44-kHz 4: reserved 5: reserved 6: reserved 7: reserved 8: reserved 9: reserved 10: reserved 11: reserved 12: reserved 13: reserved 14: reserved 15: reserved |
SoundSize | UB1 | 采样大小: 0: snd8Bit 1: snd16Bit |
SoundType | UB1 | 声道: 0: 单声道 1: 立体声/双声道 |
AACPacketType | UI8 | AAC特有字段: 0: AAC sequence header 1: AAC raw 2: AAC sequence end Reserved: 其他值 |
AACDataSize | UI8 | AAC数据大小 |
AACData | UI8[n] | AAC数据 |
视频标签(Video Tag)
字段 | 类型 | 描述 |
FrameType | UI24 | 帧类型: 关键帧(keyframe) 差异帧(interframe) |
CodecID | UI24 | 编码ID: 1: Sorenson H.263 2: Screen video 3: On2 VP6 4: On2 VP6 with alpha channel 5: Screen video version 2 6: On2 VP6 with alpha channel 7: Screen video version 2 8: AVC (H.264) Reserved: 其他值 |
AVCPacketType | UI8 | AVC特有字段: 0: AVC序列头 1: AVC NALU单元 2: AVC序列结束 Reserved: 其他值 |
CompositionTime | UI24 | 合成时间,单位毫秒 |
四、FLV文件示例分析
假设我们有一个FLV文件,其头部信息如下:
Signature1 = 'F' Signature2 = 'L' Signature3 = 'V' Version = 0x01 TypeFlagsReserved = 0b00000 TypeFlagsAudio = 0b00001 TypeFlagsVideo = 0b00000001 DataOffset = 9
这个文件头表示该FLV文件包含音频和视频流,文件头长度为9字节,接下来是一个音频标签和一个视频标签的具体解析。
音频标签示例
PreviousTagSize0 = 0 TagType = 8 DataSize = 0x0000001C Timestamp = 0x00000000 TimestampExtended = 0x00 StreamID = 0x00000000 SoundFormat = 10 (AAC) SoundRate = 3 SoundSize = 1 SoundType = 1 AACPacketType = 1 AACDataSize = 0x00 AACData = ... (AAC数据)
这个音频标签表示一个AAC格式的音频数据包,包含AAC原始数据。
视频标签示例
PreviousTagSize1 = 0x1C TagType = 9 DataSize = 0x00000020 Timestamp = 0x00000001 TimestampExtended = 0x00 StreamID = 0x00000000 FrameType = 1 (关键帧) CodecID = 7 (AVC) AVCPacketType = 1 CompositionTime = 0x01B4
这个视频标签表示一个H.264编码的关键帧,包含NALU单元和合成时间信息。
五、相关问题与解答
FLV文件是否支持多音频流?
答:不支持,一个FLV文件最多只能包含一个音频流和一个视频流,如果需要多路复用,可以使用其他容器格式如MP4。
FLV文件中的时间戳如何理解?
答:FLV文件的时间戳表示的是该标签相对于第一个标签的时间偏移量,单位为毫秒,时间戳用于同步音视频播放。
3. FLV文件相比其他容器格式有何优缺点?
答:优点是封装后的文件较小,适合网络传输;缺点是不支持多音轨和多视频轨,功能较为简单。
以上内容就是解答有关“flv音视频存储规范”的详细内容了,我相信这篇文章可以为您解决一些疑惑,有任何问题欢迎留言反馈,谢谢阅读。
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/734479.html