android数据流格式,android rtmp推流直播学习(三)----rtmp数据格式简单分析

1.数据获取

对于rtmp格式数据获取,网上有许多工具,有兴趣的同学可以上网找一下;本文用到的方法是自己通过代码获取rtmp数据流进行分析。

获取方式:

参照雷神rtmp收流器增加流文件输出代码:

FILE *logo = fopen("rtmp.txt","wb");

while(nRead=RTMP_Read(rtmp,buf,bufsize)){

//fwrite(buf,1,nRead,fp);

for (i = 0; i < nRead; ++i)

{

unsigned char c = buf[i];

if (c / 16)

{

fprintf(logo, "%x ", c);

}

else

{

fprintf(logo, "0%x ", c);

}

}

fprintf(logo, "\n");

fprintf(size,"%5dByte\n",nRead);

countbufsize+=nRead;

RTMP_LogPrintf("Receive: %5dByte, Total: %5.2fkB\n",nRead,countbufsize*1.0/1024);

}

最终rtmp.txt文件的内容如下:

1564c9d130bf

PFMQSO})W7W}H%3~@R`1)7A.png

图中只截取了开始的几帧数据用于分析

2.数据分析

rtmp数据组成:FLV Header(9字节) + FLV Body(很多字节) 组成,

FLV Header

FLV Header组成:文件类型(3字节)+版本信息(1字节)+流信息(1字节)+FLV头长度(4字节)

如上图的第一行数据:

46 4c 56 01 05 00 00 00 09

1.文件类型(3字节)

16进制 2进制 ASCII

46 70 F

4c 76 L

56 86 V

2.版本信息(1字节)

一般为0x01

3.流信息(1字节)

0000 0101此flv文件包含视音频 0000 0001此flv文件包含视频 0000 0100此flv文件包含音频

二进制 16进制 流信息

0000 0101 05 包含视音频

0000 0001 01 包含视频

0000 0100 04 包含音频

4.FLV头长度(4字节)

00 00 00 09 长度为9,表示头长度为9个字节

FLV Body

FLV Body由许多数据帧组成,如上图所示的每一帧数据为一种颜色标记,其中每帧数据组成:前一帧数据的长度(4字节)+此帧的头header(11字节)+帧数据(n字节)

1.前一帧数据的长度(4字节)

此长度不包含前一帧的这4个字节

实例分析.以上图数据为例:

第一帧数据:

第2-13行表示一帧数据,其中第二行表示前一数据帧的长度:

00 00 00 00

表示前一数据帧的长度为0,此帧为第一帧数据,故前一数据帧为0

第二帧数据:

第14-17行表示第二帧数据,其中第14行表示第一一帧数据的长度:

00 00 01 30

01 30 转换10进制表示:304,表示前一帧有304个数据,下面我们看下前一帧的总数据:

在图中最长我只设置了30个数据,其中9(4-12行)个最长为270个数据,第13行有23个数据,第三行有11个数据,(第二行的4个字  节不包含在内),总和为:

270+23+11 = 304;

第三帧数据:

第18-20行表示第三帧数据,其中第18行表示第二帧数据的长度:

00 00 00 46

46 转换10进制为:70,表示第15-17有70个数据:11+30+29 = 70

2.此帧的头header(11字节)

帧头组成:

帧类型(1字节)+帧数据部分长度(3字节)+时间戳(3字节)+扩展时间戳(1字节)+流ID(3字节)

1.帧类型(1字节)

0x08 音频

0x09 视频

0x12 脚本

2.帧数据部分长度(3字节)

表示此帧数据部分的长度

3.时间戳(3字节)

每一帧所带的时间错,播放解析时用的

4.扩展时间戳(1字节)

5.流ID(3字节)

总是00 00 00

实例分析:

第一帧数据:

第三行表示第一帧数据的头

12 00 01 25 00 00 00 00 00 00 00

其中第一个字节12表示帧类型:脚本

第2,3,4字节表示数据部分长度:00 01 25转换10进制为293(第4-13行 30x9+23 = 293)

第5,6,7字节表示时间戳:00 00 00

第8字节表示扩展时间戳:00

第9,10,11字节表示流ID: 00 00 00

第二帧数据:

第15行数据:

09 00 00 3b 00 00 00 00 00 00 00

其中第一个字节09 表示帧类型:视频

第2,3,4字节表示数据部分长度:00 00 3b转换10进制为59(第16-17行 30+29 = 59)

第5,6,7字节表示时间戳:00 00 00

第8字节表示扩展时间戳:00

第9,10,11字节表示流ID: 00 00 00

第三帧数据:

第19行数据:

08 00 00 04 00 00 00 00 00 00 00

其中第一个字节08 表示帧类型:音频

第2,3,4字节表示数据部分长度:00 00 04转换10进制为4(第20行 有4个数据)

第5,6,7字节表示时间戳:00 00 00

第8字节表示扩展时间戳:00

第9,10,11字节表示流ID: 00 00 00

由于开始时推流数据时间戳设置是从0开始的,所以刚开始的时间戳为0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值