wireshark+rtmp协议分析

参考博客http://www.rosoo.net/a/201405/16980.html

                http://www.cnblogs.com/russinovich/p/9240944.html

  • 使用wireshark抓包工具

  1. 如何使用wireshark中常见的过滤选项包括协议类型、端口号、stream eq、ip地址
  2. 遇到本地回路不能抓包的问题可以参考https://blog.csdn.net/iriszx999/article/details/70154885博客,也可以通过npcap来抓包,首先要禁用掉wincap,重新启动wireshark就会出现loopback的过滤选项
  3. 通过wireshark,要学会如何重网络包中获取视频帧的数据,这里主要针对rtmp协议。
     
  •  抓取网络包

  1. 打开wireshark抓包工具,设置tcp监听
  2. 打开vlc选择网络串流播放,输入rtmp播放地址,开始播放
  3. 将wireshark监听的网络包保存为本地文件
  •  分析网络包

  1. 抓取的网络包中包括又rtmp协议类型,通过设置rtmpt 过滤,可以得到video以及audio的包数据
  2.  RTMP协议封包由一个包头和一个包体组成,包头可以是4种长度的任意一种:12, 8, 4,  1 byte(s).完整的RTMP包头应该是12bytes,包含了时间戳,AMFSize,AMFType,StreamID信息, 8字节的包头只纪录了时间戳,AMFSize,AMFType,其他字节的包头纪录信息依次类推 。包体最大长度默认为128字节,通过chunkSize可改变包体最大长度,通常当一段AFM数据超过128字节后,超过128的部分就放到了其他的RTMP封包中,包头为一个字节.
    完整的12字节RTMP包头每个字节的含义: 如下不同的包头数据 05 00 34 df 00 00 55 08 01 00 00 00为12个字节,45  00 00 16 00 00 54 08 ,第一个字节(最高两位可知包头长度)与0xC0分别得到为0x00和0x40;查表可知分别对应的是12个字节和8个字节。后6位为保留位,用来确定channelid (02~07范围),通常45表示位服务器保留FMS2发送音视频数据;

    02    Ping 和ByteRead通道 
    
    03   Invoke通道 我们的connect() publish()和自字写的NetConnection.Call() 数据都是在这个通道的 
    04   Audio和Vidio通道 
    05   06 07 服务器保留,经观察FMS2用这些Channel也用来发送音频或视频数据 
  3. 分析后11或者7个字节对应的参数信息,时间戳为接下来的后三个字节如例子中00 34 df  表示为13535单位为毫秒,时间戳主要分为两种:绝对和相对之分。 后三个字节为rtmp包的大小,如果超过了rtmp的最大长度128字节,那么下一个同类型的rtmp包头只占一个字节,一般为0xC?开头。streamid为4个字节如上为streamid=0x01;也可通过streamid=(channelid-4)/5+1表示。

  4. 包体:VideoTagHeader的头1个字节,也就是接跟着StreamID的1个字节包含着视频帧类型及视频CodecID最基本信息.一般为17或者27,那么streamid后的字节表达含义可以查表得出

    Field
    Type
    Comment
    Frame Type
    UB [4]
    Type of video frame. The following values are defined:
    1 = key frame (for AVC, a seekable frame)
    2 = inter frame (for AVC, a non-seekable frame)
    3 = disposable inter frame (H.263 only)
    4 = generated key frame (reserved for server use only)
    5 = video info/command frame
    CodecID
    UB [4]
    Codec Identifier. The following values are defined:
    2 = Sorenson H.263
    3 = Screen video
    4 = On2 VP6
    5 = On2 VP6 with alpha channel
    6 = Screen video version 2
    7 = AVC
    AVCPacketType
    IF CodecID == 7
    UI8
    The following values are defined:
    0 = AVC sequence header
    1 = AVC NALU
    2 = AVC end of sequence (lower level NALU sequence ender is not required or supported)
    CompositionTime
    IF CodecID == 7
    SI24
    IF AVCPacketType == 1
    Composition time offset
    ELSE
    0
    See ISO 14496-12, 8.15.3 for an explanation of composition
    times. The offset in an FLV file is always in milliseconds.
  5. 搜索wireshark中17 00 00 00 00可以获取视频对应的AVC sequence header相关信息,17表示avc格式且为key-frame,那么后面4个零分别表达的意思为:00表示UI8 无符号整形,表示此为avc sequence header部分,00 00 00 表示cts (pts-dts差值)SI24(三个字节)为0,这也就是为什么可以通过17 00 00 00 00 来搜索avc sequence header部分的原因。下图表示的avc sequence header部分的表示,分别为sps和pps。

                                                                                       

发布了38 篇原创文章 · 获赞 5 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/zhiyanzhai563/article/details/81156142