Android开发经验谈Android开发Android技术知识

android rtmp推流直播学习(三)----rtmp数据格

2017-11-15  本文已影响339人  君莫醉

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文件的内容如下:


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

android rtmp简单推流项目地址

上一篇 下一篇

猜你喜欢

热点阅读