zoukankan      html  css  js  c++  java
  • 从wireshark数据中分析rtmp协议,并提取出H264视频流

    我写的小工具 rtmp_parse.exe
    使用用法如先介绍下:

    -sps  [文件路径] 解析 sps 数据 文件当中的内容就是纯方本的hexstring: 如 42 E0 33 8D 68 05 00 5B A1 00 00 03 00 ……
    -pps  [文件路径] 解析 pps 数据 文件格式同上
    -rtmp [文件路径] 解析并保存h264视频流数据(从wireshark抓出来的hexstring)

    下载地址:

    链接:https://pan.baidu.com/s/1RhRKoNqTPHLj4mrpryunDQ 密码:v7lb

    解压密码:rtmp

    下载包当中包含了我抓取的wireshark的两个例子。

     


    原理如下:

    1. 利用wireshark抓取rtmp流数据, 分析到rtmp流后,写入过滤条件,如 tcp.stream eq 90

      image
    2. 导出tcp流

      image

    3. 保存16进制的数据为纯文本格式

      image
      一定要选择 Hex转储,然后点击 “Sava as”
      注意,这个流开始的第一个字节一定是03,才是正确的。
      至此,我们有了可以用于分析的rtmp流的数据。

    wireshark保存出来的文件格式规则是

    1. client发给server端的数据是,每一行顶到头写的
    2. server发给client端的数据是,每一行开始空4个空格

    我是基于这点来判断是谁发给谁的数据,从而进行分析的。


    rtmp协议:

        1. 握手,C0,C1, C2 <-> s0,s1,s2。当客户端发送C2,就表示握手已经完成了
        2. 客户端发送 connect命令, 如下数据

          image

        3. 从这儿之后,就可以分析服务器端发送过来的视频数据,首先是sps和pps

          image

    07 00 00 00 00 00 2C 09 01 00 00 00 17
    00
    00 00 00 01  => nal头
    42 E0 33 FF E1 00 18 27 42 E0 33 8D 68 05 00 5B => sps
    A1 00 00 03 00 01 00 00 03 00 3C 0F 10 7A 80
    01
    00 04  => pps len
    28 CE 32 48 => pps

    解析 sps 数据,我得到详细的结构数据如下:
    profile_idc: 66
    constraint_set0_flag: 1
    constraint_set1_flag: 1
    constraint_set2_flag: 1
    constraint_set3_flag: 0
    constraint_set4_flag: 0
    constraint_set5_flag: 0
    reserved_zero_2bits: 0
    level_idc: 51
    seq_parameter_set_id: 0
    chroma_format_idc: 1
    residual_colour_transform_flag: 0
    bit_depth_luma_minus8: 0
    bit_depth_chroma_minus8: 0
    qpprime_y_zero_transform_bypass_flag: 0
    seq_scaling_matrix_present_flag: 0
    log2_max_frame_num_minus4: 12
    pic_order_cnt_type: 2
    log2_max_pic_order_cnt_lsb_minus4: 0
    delta_pic_order_always_zero_flag: 0
    offset_for_non_ref_pic: 0
    offset_for_top_to_bottom_field: 0
    num_ref_frames_in_pic_order_cnt_cycle: 0
    num_ref_frames: 1
    gaps_in_frame_num_value_allowed_flag: 0
    pic_width_in_mbs_minus1: 79
    pic_height_in_map_units_minus1: 44
    frame_mbs_only_flag: 1
    mb_adaptive_frame_field_flag: 0
    direct_8x8_inference_flag: 1
    frame_cropping_flag: 0
    frame_crop_left_offset: 0
    frame_crop_right_offset: 0
    frame_crop_top_offset: 0
    frame_crop_bottom_offset: 0
    vui_parameters_present_flag: 1
    vui.aspect_ratio_info_present_flag: 0
    vui.aspect_ratio_idc: 0
    vui.sar_ 0
    vui.sar_height: 0
    vui.overscan_info_present_flag: 0
    vui.overscan_appropriate_flag: 0
    vui.video_signal_type_present_flag: 0
    vui.video_format: 0
    vui.video_full_range_flag: 0
    vui.colour_description_present_flag: 0
    vui.colour_primaries: 0
    vui.transfer_characteristics: 0
    vui.matrix_coefficients: 0
    vui.chroma_loc_info_present_flag: 0
    vui.chroma_sample_loc_type_top_field: 0
    vui.chroma_sample_loc_type_bottom_field: 0
    vui.timing_info_present_flag: 1
    vui.num_units_in_tick: 768
    vui.time_scale: 16777219
    vui.fixed_frame_rate_flag: 0
    vui.nal_hrd_parameters_present_flag: 0
    vui.vcl_hrd_parameters_present_flag: 0
    vui.low_delay_hrd_flag: 0
    vui.pic_struct_present_flag: 0
    vui.bitstream_restriction_flag: 0
    vui.motion_vectors_over_pic_boundaries_flag: 0
    vui.max_bytes_per_pic_denom: 0
    vui.max_bits_per_mb_denom: 0
    vui.log2_max_mv_length_horizontal: 0
    vui.log2_max_mv_length_vertical: 0
    vui.num_reorder_frames: 0
    vui.max_dec_frame_buffering: 0
    hrd_nal.cpb_cnt_minus1: 0
    hrd_nal.bit_rate_scale: 0
    hrd_nal.cpb_size_scale: 0
    hrd_nal.initial_cpb_removal_delay_length_minus1: 0
    hrd_nal.cpb_removal_delay_length_minus1: 0
    hrd_nal.dpb_output_delay_length_minus1: 0
    hrd_nal.time_offset_length: 0
    hrd_vcl.cpb_cnt_minus1: 0
    hrd_vcl.bit_rate_scale: 0
    hrd_vcl.cpb_size_scale: 0
    hrd_vcl.initial_cpb_removal_delay_length_minus1: 0
    hrd_vcl.cpb_removal_delay_length_minus1: 0
    hrd_vcl.dpb_output_delay_length_minus1: 0
    hrd_vcl.time_offset_length: 0

    解析 pps 得到如下结构数据:
    pic_parameter_set_id: 4
    seq_parameter_set_id: 11
    entropy_coding_mode_flag: 1
    pic_order_present_flag: 1
    num_slice_groups_minus1: 0
    slice_group_map_type: 0
    slice_group_change_direction_flag: 0
    slice_group_change_rate_minus1: 0
    pic_size_in_map_units_minus1: 0
    num_ref_idx_l0_active_minus1: 11
    num_ref_idx_l1_active_minus1: 0
    weighted_pred_flag: 0
    weighted_bipred_idc: 1
    pic_init_qp_minus26: 2
    pic_init_qs_minus26: 0
    chroma_qp_index_offset: 0
    deblocking_filter_control_present_flag: 0
    constrained_intra_pred_flag: 0
    redundant_pic_cnt_present_flag: 0
    _more_rbsp_data_present: 0
    transform_8x8_mode_flag: 0
    pic_scaling_matrix_present_flag: 0
    second_chroma_qp_index_offset: 0

        1. 导出视频数据,下图就是I帧的数据

          image
          图中,09即表示是视频数据

    /*      RTMP_PACKET_TYPE_...                0x00 */
    #define RTMP_PACKET_TYPE_CHUNK_SIZE         0x01
    /*      RTMP_PACKET_TYPE_...                0x02 */
    #define RTMP_PACKET_TYPE_BYTES_READ_REPORT  0x03
    #define RTMP_PACKET_TYPE_CONTROL            0x04
    #define RTMP_PACKET_TYPE_SERVER_BW          0x05
    #define RTMP_PACKET_TYPE_CLIENT_BW          0x06
    /*      RTMP_PACKET_TYPE_...                0x07 */
    #define RTMP_PACKET_TYPE_AUDIO              0x08
    #define RTMP_PACKET_TYPE_VIDEO              0x09
    /*      RTMP_PACKET_TYPE_...                0x0A */
    /*      RTMP_PACKET_TYPE_...                0x0B */
    /*      RTMP_PACKET_TYPE_...                0x0C */
    /*      RTMP_PACKET_TYPE_...                0x0D */
    /*      RTMP_PACKET_TYPE_...                0x0E */
    #define RTMP_PACKET_TYPE_FLEX_STREAM_SEND   0x0F
    #define RTMP_PACKET_TYPE_FLEX_SHARED_OBJECT 0x10
    #define RTMP_PACKET_TYPE_FLEX_MESSAGE       0x11
    #define RTMP_PACKET_TYPE_INFO               0x12
    #define RTMP_PACKET_TYPE_SHARED_OBJECT      0x13
    #define RTMP_PACKET_TYPE_INVOKE             0x14
    /*      RTMP_PACKET_TYPE_...                0x15 */
    #define RTMP_PACKET_TYPE_FLASH_VIDEO        0x16



    最后看一下,从wireshark当中导出的视频截图:

    image

           

     
       

    Technorati Tags: ,,,,
  • 相关阅读:
    5G名词术语
    什么是IPv6
    如何用SecureCRT 登录eNSP模拟器里的设备
    numpy-排序
    numpy-tile 数组复制
    经纬度计算距离与方位角
    numpy-添加操作大全
    高效编程之 concurrent.future
    linux命令 集合
    PostgreSQL-表空间
  • 原文地址:https://www.cnblogs.com/russinovich/p/9240944.html
Copyright © 2011-2022 走看看