mepg-4 的码流分析

  最近做了MPEG-4编码的视频文件的分析,找资料的时候费了好大的劲,在这里分享自己的一些心得体会,也算对自己工作的一个总结吧。必须先推荐一个非常好用的码流分析工具:Elecard Stream Analyzer。分析结果可以在图片中看到。

  第一步,先说说如何对获得MPEG-4编码的视频。我的方法是从纯视频格式(.yuv)利用软件ffmpeg经过MPEG-4编码得到.m4v文件,这个文件就是我们所需要分析的文件。

      第二步,得到MPEG-4编码的视频后,我们就可以根据图中所示的文件结构再利用ultraedit分析它的码流结构了。MPEG-4编码与MPEG-2编码最大的不同之处就在于它是基于对象的编码,可以合成媒体对象以创建所需的视听场景以及多路传播和同步媒体数据项的位流,以保证它们在传输过程中的服务质量,并能在接收端与视听场景进行交互。先来分析它的层次结构,它可以分为5个层次(对应着图看,非常清楚):

1. 视频对象序列VOS

2. 视频对象VO

3. 视频对象层VOL

4. 视频对象平面组GOV

5. 视频对象平面VOP(也就是所谓的“帧”)

 

 图1

 (二)下面来详细分析mpeg码流头

 

关于MPEG4 码流(mpeg4 raw data)的格式分析

MPEG4码流开头往往如下:

      

    00 00 01 B0 F5 00 00 01 B5 09 00 00 01 00 00 00
    01 20 08 86 84 00 3F 18 58 21 20 A3 1F 00 00 01
    B2 58 76 69 44 30 30 36 32 00 00 01 B6

 

其格式为:

 

     MP4V type b0 size 5     //vosh
     MP4V type b5 size 5     //vo
     MP4V type 0 size 4   
     MP4V type 20 size 16    //vol
         ParseVol: timeBits 15 timeTicks 24000 frameDuration 1001
     MP4V type b6 size 5606   //vop

其宏定义为:

  #define MP4AV_MPEG4_VOL_START 0x20
  #define MP4AV_MPEG4_VOSH_START 0xB0
  #define MP4AV_MPEG4_VO_START 0xB5
  #define MP4AV_MPEG4_VOP_START 0xB6
  #define MP4AV_MPEG4_USER_DATA_START 0xB2

 

    00 00 01 B0是视频对象序列开始标志(VISOBJSEQ_START_CODE),其后的数据只有一位F4,表示此视频对象编码序列编码的Profile与Level类型是XVID_PROFILE_AS_L4, Profile类型数值定义于xvid.h。

 

    00 00 01 B5是视频对象开始标志(VISOBJ_START_CODE),其后只有一位16进制数据09,从这一位数据可以获得视频对象版本号、视频类型和视频信号类型信息。 

 

    00 00 01 00是视频对象开始标志 (VIDOBJ_START_CODE)。

 

     00 00 01 20是视频对象层开始标志(VIDOBJLAY_START_CODE),其后的11位16进制数据比较重要,解码所需要的VOP纵横比、视频对象形状和图像分辨率等数据都是从这11位数据获得的,详细介绍见图5-11,图中未标记用途的数据表示未使用。

 

 

    00 00 01 B2是用户数据开始标志(USERDATA_START_CODE),十六进制用户数据共有8位。

 

 

    00 00 01 B6是VOP开始标志(VOP_START_CODE),每个VOP编码数据都以VOP标识头开始,VOP标识头比较简单,如果用16进制数据表示其数值为00 00 01 B6。解码的时候,以00 00 01 B6来判定是不是一个VOP的开始,并从VOP标识头后的数据读取编码类型,量化值等参数后完成一帧VOP的解码。

(三)MPEG4码流视频关键帧头部16个字节,非关键帧8个字节。

MPEG4码流视频关键帧头部16个字节,非关键帧8个字节(均包含四字节ID),说明如下:

关键帧:

字节

0

1

2

3

4

5

6

7

8

9

A

B

C

D

E

F

0

0

1

FB

XX

R

W&H

Date time

Length

含义

ID

 

 

图像大小

时间戳

帧长度

非关键帧

字节

0

1

2

3

4

5

6

7

0

0

1

FA

Length

含义

ID

帧长度

      XX:保留。

    RATE: 帧率,低5位表示帧率,目前取值从130,高三位表示解交错,可选012其中0做解交错,2不做解交错。

    WIDTHHEIGHT表示视频数据高度和宽度,一个字节最大256,所以存储的信息为真实高度和宽度的1/8

    TIMESTAMP:帧时间戳:

struct  DateTime                                         

{

  DWORD second      :6;           //  秒  1-60      

  DWORD minute      :6;           //  分  1-60      

  DWORD hour    :5;           //  时  1-24      

  DWORD day     :5;           //  日  1-31      

  DWORD month       :4;           //  月  1-12      

  DWORD year    :6;           //  年  2000-2063 

};

        非关键帧的时间戳是根据帧率和对关键帧的偏移计数计算出来的。

      LENGTH:帧长度,低字节优先,不包括帧头长度(16字节或者8字节,这个需要注意)

         H.264码流跟MPEG4的最大不同在于ID,关键帧ID000001FD,非关键帧ID000001FC

 

给一个例子:

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值