FLV 格式解析

2025-02-09  本文已影响0人  简单Timor

简介

FLV(Flash Video)是现在非常流行的流媒体格式,由于其视频文件体积轻巧、封装播放简单等特点,使其很适合在网络上进行应用,目前主流的视频网站无一例外地使用了FLV格式。另外由于当前浏览器与Flash Player紧密的结合,使得网页播放FLV视频轻而易举,也是FLV流行的原因之一。

FLV是流媒体封装格式,我们可以将其数据看为二进制字节流。总体上看,FLV包括文件头(File Header)和文件体(File Body)两部分,其中文件体由一系列的Tag及Tag Size对组成。


截屏2025-02-08 13.45.45.png

FLV格式解析

先来一张图,这是一个FLV视频,使用的是UltraEdit的二进制查看工具。


截屏2025-02-08 13.48.22.png

FLV Header

header部分 = Signature(3 Byte) + Version(1 Byte) + Flags(1 Bypte) + DataOffset(4 Byte)

FLV Body

FLV的body部分是一系列的back-pointers+tag构成的

tag组成

tag type+tag data size+Timestamp+TimestampExtended+stream id+ tag data

图上第一个tag:

tag的划分

图中红色部分是我标出"("与")"前后的的两个back-pointers,都是4个字节。而括号中间就是第一个TAG。那是怎么计算的呢?我们就以这个做个示例。

tag的内容

前面已经提到tag分3种: script、Audio 和 video。我们一个个看

script

脚本Tag一般只有一个,是flv的第一个Tag,用于存放flv的信息,比如duration、audiodatarate、creator、width等。
首先介绍下脚本的数据类型。所有数据都是以数据类型+(数据长度)+数据的格式出现的,数据类型占1byte,数据长度看数据类型是否存在,后面才是数据。
一般来说,该Tag Data结构包含两个AMF包。AMF(Action Message Format)是Adobe设计的一种通用数据封装格式,在Adobe的很多产品中应用,简单来说,AMF将不同类型的数据用统一的格式来描述。第一个AMF包封装字符串类型数据,用来装入一个“onMetaData”标志,这个标志与Adobe的一些API调用有,在此不细述。第二个AMF包封装一个数组类型(srs返回为object类型),这个数组中包含了音视频信息项的名称和值。具体说明如下

[图片上传中...(截屏2025-02-08 14.09.17.png-306782-1738994960018-0)]
截屏2025-02-08 14.09.29.png

上图为第一个AMF包

表示数组,类似Map。后面4个字节为数组的个数。然后是键值对,第一个为键,2个字节为长度。后面跟具体的内容。接着3个字节表示值的类型,然后根据类型判断长度。
上图我们可以判断,总共有13个键值对。
第一个长度为8个字节是duration。值类型是0x004073,第一个字节是00,所以是double,8个字节。
第二个长度5个字节是width。值也是double类型,8个字节。
依次解析下去...

Audio

截屏2025-02-08 14.11.15.png
截屏2025-02-08 14.11.27.png
截屏2025-02-08 14.11.41.png

视频中第二个tag为音频tag
stream-id之后:

video

由于kobe视频音频编码是pcm,查找视频tag太难,使用<<东风破>> mv视频


截屏2025-02-08 14.21.54.png

我们看到数据部分: 视频信息+数据 视频信息,1个字节。

StreamId之后的数据就表示是VideoTagHeader,如果是avc,VideoTagHeader会多出4个字节的信息就是AVCPacketType和CompositionTime

0x01+sps[1]+sps[2]+sps[3]+0xFF+0xE1+sps size+sps+01+pps size+pps

sps[1]=0x64 sps[2]=00 sps[3]=0D sps size=0x001B=27(占两个字节) 跳过27个字节后,是0x01 pps size=0x0005=118(占两个字节) 跳过5个字节,就到了back-pointers。

这是第二个video tag其实和之前图一样,只是我圈出来关键信息。先看下格式 frametype=0x17=00010111 AVCPacketType =1 Composition Time=0x000043 后面就是NALU DATA

https://chensi.moe/blog/2015/11/20/flv-format/

上一篇 下一篇

猜你喜欢

热点阅读