通过RTMP play分析FLV格式详解

最近做了一个rtmp中转服务程序,通过实践,熟悉rtmp play和push中各类格式,这里总结一下。

程序github地址: https://github.com/runner365/rtmp_relay

rtmp play接收报文分析

第一帧收到的报文:

1) 0x46 4c 56:可参考文后:参考一

字符FLV头

2) 0x01 05

Version TypeFlagsReserved TypeFlagsAudio TypeFlagsReserved TypeFlagsVideo

这个解析的时候,一般不用管

3)0x00 00 00 09

FLV header offset: 也就是从开头9字节后,才是FLV真正的报文头。

4)0x00 00 00 00

这个是第1帧的PreviousTagSize0(前帧长度),因为是第一帧,所以肯定是0;

5)0x08 可参考文后:参考二,参考三

帧开头第一字节:0x08表示音频,0x09表示视频

6)0x00 00 04

帧payload长度:因为音频第一帧是ASC,所以只有4字节。

7) 0x 00 00 00 00

timestamp,时间戳

8) 0x 00 00 00

streamid,流ID

9) 0x AF 00 13 90

音频payload: 0xaf00开头的后面是asc flag, 0xaf01开头的后面是真正的音频数据

0x13 90,也就是0b0001 0011 1001 0000,

ASC flag格式:xxxx xyyy yzzz z000

x字符: aac type,类型2表示AAC-LC,5是SBR, 29是ps,5和29比较特殊ascflag的长度会变成4;

y字符:  sample rate, 采样率, 7表示22050采样率

z字符:  通道数,2是双通道

10) 0x 00 00 00 0F

这个还是PreviousTagSize1,上一帧长度15bytes

11) 0x09 视频类型,新的一帧

12)0x00 00 22

视频帧payload长度

13) 0x00 00 0a 00 

时间戳:这个地方有个大坑,顺序是:a[3] a[0] a[1] a[2],最后一位是最高位。

14) 0x00 00 00

streamid, 流id。

15) 0x 17 00

视频帧开头2字节:

0x17 00: 表示内容是SPS和PPS

0x17 01: 表示内容是I-FRAME

0x27:      表示内容是P-FRAME

16)

0000002bh: 17 00 00 00 00 01 42 C0 1F FF E1 00 0E 67 42 C0 ; ......B??.gB?
0000003bh: 1F 8C 8D 40 F0 28 90 0F 08 84 6A 01 00 04 68 CE ; .實@??.刯...h?
0000004bh: 3C 80 ; <€

第12, 13字节: 0x00 0E是spslen,也就是14字节长度

跳过14字节后,0x01是pps开始的标识,跳过它。

0x00 04是ppslen,也就是4个字节,最后0x68 ce 3c 80就是pps。

参考:

1, The FLV header

  Type Comment
Signature UI8 Signature byte always ‘F‘ (0x46)
Signature UI8 Signature byte always ‘L‘ (0x4C)
Signature UI8 Signature byte always ‘V‘ (0x56)
Version UI8 File version (for example, 0x01 for FLV version 1)
TypeFlagsReserved UB [5] Shall be 0
TypeFlagsAudio UB [1] 1 = Audio tags are present
TypeFlagsReserved UB [1] Shall be 0
TypeFlagsVideo UB [1] 1 = Video tags are present
DataOffset UI32 The length of this header in bytes

Signature: FLV 文件的前3个字节为固定的‘F’‘L’‘V’,用来标识这个文件是flv格式的.在做格式探测的时候,

如果发现前3个字节为“FLV”,就认为它是flv文件.

Version: 第4个字节表示flv版本号.

Flags: 第5个字节中的第0位和第2位,分别表示 video 与 audio 存在的情况.(1表示存在,0表示不存在)

DataOffset : 最后4个字节表示FLV header 长度.

2,FLV body整体

Field Type Comment
PreviousTagSize0 UI32 Always 0
Tag1 FLVTAG First tag
PreviousTagSize1 UI32
Size of previous tag, including its header, in bytes. For FLV version1,

this value is 11 plus the DataSize of the previous tag.

Tag2 FLVTAG Second tag
... ... ...
PreviousTagSizeN-1 UI32 Size of second-to-last tag, including its header, in bytes.
TagN FLVTAG Last tag
PreviousTagSizeN UI32 Size of last tag, including its header, in bytes

FLV header之后,就是 FLV File Body.

FLV File Body是由一连串的back-pointers + tags构成.back-pointers就是4个字节数据,表示前一个tag的size.

3,FLV body细节

Field Type Comment
Reserved UB [2] Reserved for FMS, should be 0
Filter UB [1] Indicates if packets are filtered.
0 = No pre-processing required.
1 = Pre-processing (such as decryption) of the packet is
required before it can be rendered.
Shall be 0 in unencrypted files, and 1 for encrypted tags.
See Annex F. FLV Encryption for the use of filters.
TagType UB [5]
Type of contents in this tag. The following types are
defined:
8 = audio
9 = video
18 = script data

DataSize UI24 Length of the message. Number of bytes after StreamID to
end of tag (Equal to length of the tag – 11)
Timestamp UI24 Time in milliseconds at which the data in this tag applies.
This value is relative to the first tag in the FLV file, which
always has a timestamp of 0.
TimestampExtended UI8 Extension of the Timestamp field to form a SI32 value. This
field represents the upper 8 bits, while the previous
Timestamp field represents the lower 24 bits of the time in
milliseconds.
StreamID UI24 Always 0.
AudioTagHeader IF TagType == 8
AudioTagHeader
 
VideoTagHeader IF TagType == 9
VideoTagHeader
 
EncryptionHeader IF Filter == 1
EncryptionTagHeader
 
FilterParams IF Filter == 1
FilterParams
 
Data IF TagType == 8
AUDIODATA
IF TagType == 9
VIDEODATA
IF TagType == 18
SCRIPTDATA
Data specific for each media t
时间: 2024-11-18 13:06:16

通过RTMP play分析FLV格式详解的相关文章

FLV格式详解

Overview Flash Video(简称FLV),是一种流行的网络格式.目前国内外大部分视频分享网站都是采用的这种格式. File Structure 从整个文件上开看,FLV是由The FLV header 和 The FLV File Body 组成. 1.The FLV header Field Type Comment Signature UI8 Signature byte always 'F' (0x46) Signature UI8 Signature byte always

多媒体封装格式详解---MP4

MP4文件格式详解--结构概述 http://blog.csdn.net/pirateleo/article/details/7061452 一.基本概念 1. 文件,由许多Box和FullBox组成. 2. Box,每个Box由Header和Data组成. 3. FullBox,是Box的扩展,Box结构的基础上在Header中增加8bits version和24bits flags. 4. Header,包含了整个Box的长度size和类型type.当size==0时,代表这是文件中最后一个

BMP格式详解

BMP格式详解 BMP文件格式详解(BMP file format) BMP文件格式,又称为Bitmap(位图)或是DIB(Device-Independent Device,设备无关位图),是Windows系统中广泛使用的图像文件格式.由于它可以不作任何变换地保存图像像素域的数据,因此成为我们取得RAW数据的重要来源.Windows的图形用户界面(graphical user interfaces)也在它的内建图像子系统GDI中对BMP格式提供了支持. 下面以Notepad++为分析工具,结合

多媒体开发之---h264格式详解

http://blog.csdn.net/bluebirdssh/article/details/6533501 http://blog.csdn.net/d_l_u_f/article/details/7260772 http://blog.csdn.net/sunnylgz/article/details/7680262 http://blog.csdn.net/heanyu/article/details/6204414 多媒体开发之---h264格式详解,布布扣,bubuko.com

大端小端格式详解

1. 什么是大端,什么是小端: 所谓的大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中: 所谓的小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中. 2.为什么会有大小端: 为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit.但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于8位的处

(原创)高性能IP数据库格式详解 qqzeng-ip.dat

高性能IP数据库格式详解 qqzeng-ip.dat 编码:UTF8           字节序:Little-Endian 返回多个字段信息(如:亚洲|中国|香港|九龙|油尖旺|新世界电讯|810200|Hong Kong|HK|114.17495|22.327115) ------------------------ 文件结构 --------------------------- //文件头 16字节(4-4-4-4) [索引区第一条流位置][索引区最后一条流位置][前缀区第一条的流位置]

Linux下可执行文件格式详解

Linux下面,目标文件.共享对象文件.可执行文件都是使用ELF文件格式来存储的.程序经过编译之后会输出目标文件,然后经过链接可以产生可执行文件或者共享对象文件.Linux下面使用的ELF文件和Windows操作系统使用的PE文件都是从Unix系统的COFF文件格式演化来的. 我们先来了解一些基本的想法. 首先,最重要的思路是一个程序从人能读懂的格式转换为供操作系统执行的二进制格式之后,代码和数据是分开存放的,之所以这样设计有这么几个原因: 1.程序执行之后,代码和数据可以被映射到不同属性的虚拟

avi 格式详解

http://blog.csdn.net/becomly/article/details/6283004 http://blog.csdn.net/easecom/article/details/4508094 VI(Audio Video Interleaved 的缩写)是一种RIFF(Resource Interchange File Format的缩写)文件格式,多用于音视频捕捉.编辑.回放等应用程序 中.通常情况下,一个AVI文件可以包含多个不同类型的媒体流(典型的情况下有一个音频流和一

(转)Excel自定义格式详解

”G/通用格式”:以常规的数字显示,相当于”分类”列表中的”常规”选项.例:代码:”G/通用格式”.10显示为10:10.1显示为10.1. 2. “#”:数字占位符.只显有意义的零而不显示无意义的零.小数点后数字如大于”#”的数量,则按”#”的位数四舍五入.例:代码:”###.##”,12.1显示为12.10;12.1263显示为:12.13 3.”0”:数字占位符.如果单元格的内容大于占位符,则显示实际数字,如果小于点位符的数量,则用0补足.例:代码:”00000”.1234567显示为12