PS(MPG)文件格式分析

来源:互联网 发布:解数独的软件 编辑:程序博客网 时间:2024/06/06 20:10

   ps文件分析

    PS文件有三种类型的: vob   dat  mpg

    PS_DAT_PACK_SIZE                2352
    PS_VOB_PACK_SIZE                2048
    PS_MPG_PACK_SIZE                2324

    与TS文件类似,是固定包长的。

    打开文件,可以看到文件以0x0000 01B9结束,即 MPEG_Program_end_code,

    之前有很多个0x0000 00BA字段,即为program pack的开始标志,代表每个packet的开始。

    program packet 的结构如下所示:

  

        可以看出program pack由3部分组成:pack_header+system_header+PES_packets,其中system_header当且仅当pack是第一个数据包时才存在。

       1    system_header

            

                   

       2 packet header

            

       

        第 5 个byte的 前两个比特 reserved中,左边为 01 ,右边为 00, 分别表示左边为 MPEG2,右边为MPEG1,所以上边packet header结构图是mpeg2的。

 

  3   PES packet

   

       

             第一个packet的  PES packet:起始地址:0x0000 0020

                                     packet_start_code_prefix(3B):0x 00 00 01

                                     stream_id(1B):0xBE(BE为Padding stream)

                                     PES_packet_length(2B):0x07 DA,跳过该长度的填充字节,刚好为下一个pack的起始标志:0x000001BA 。 从0x0800地址开始为第二个pack包, 该包的构造格式为pack_header+PES。

 

    4 

          分析下个包。 由 pack_header + pes packet 构成。 pack_header 整体结构同前面一样,这里就不叙述。唯一变的就是system_clock_reference_base_14_0 和 system_clock_reference_extension 这两数据在改变。

                   

                        stream_id = 0xeo - oxef为video。  0xc0 - 0xCF为audio

                  PTS全称为presentation time stamp。   DTS全称为dedoding time stamp。    因为除了PTS_DTS_flag为11外,其余6个标志都为0,所以直接进入视频序列:Video Sequence,其结构定义如下:

           

       4.1    Sequence Header

         

             sequence header:起始地址:0x0000 0824

                                       sequence_header_code(4B):0x 0000 01B3

                           

               4.2           Sequence extension

 

                sequence extension:起始地址:0x0000 082d;如果有这一项说明是MPEG-2文件,否则为MPEG-1文件

                                             extension_start_code(4B):0x0000 01B5

                                          

 

              4.3      extension&user data

                   接下来如果为 extension&user data[i](extension data的开始符为0x0000 01B5,user data的开始符为0x0000 01B2),Group of pictures header 是0x0000 01B8。

                   extension data       0x 000001B5  

                     

              4.4       Group of pictures header   

 

                         start_code         0x000001B8

                          

                                                           

                              

                                                                               

                                    

                               

                                  picture_coding_type = 1  表示I帧  2 3 表示B P帧,      第一个grooup  为I帧  其他可以为 B P帧

 

                        picture data

                            picture data: 起始地址:0x0000 0850,picture data分为多个slice片,而每个slice又分为多个Microblock,Microblock继续分为Block块。

             13818-2中定义的picture_data()如下:

                picture_data() { 

                      do {

                            slice()

                      } while ( nextbits() == slice_start_code )

                      next_start_code()

                 }              

                Slice
                slice() {

                        slice_start_code                                                32

                        if (vertical_size > 2800)

                               slice_vertical_position_extension           3

                        if (<sequence_scalable_extension() is present in the bitstream>) {

                               if (scalable_mode == “data partitioning” )

                                        priority_breakpoint                              7

                         }

                        quantiser_scale_code                                       5 

                        if ( nextbits() == ‘1’ ) {

                              intra_slice_flag                                              1 

                              intra_slice                                                       1

                             reserved_bits                                                  7 

                              while ( nextbits() == ‘1’ ) {

                                   extra_bit_slice /* with the value ‘1*/   1 

                                   extra_information_slice                          8 

                              }

                        }

                       extra_bit_slice /* with the value ‘0’ */          1 

                       do {

                            macroblock()

                       } while ( nextbits() != ‘000 0000 0000 0000 0000 0000’ )

                       next_start_code()

               }

          从文件内容分析,从0x0000 0850单元为第一个slice(0000 0101),共有7个slice,第7个slice的起始单元为0x0000  fe04,紧接着开始下一个packe,直到0x0000 3000才开始第一个音频pack包,后面的数据视频pack和音频数据成交叉状态。文件结尾标志为0x0000 01B9。

         

                 

                      

        

                      

 

     

           

 

                          

原创粉丝点击