最近做了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位表示帧率,目前取值从1到30,高三位表示解交错,可选0,1,2其中0做解交错,2不做解交错。

WIDTH和HEIGHT表示视频数据高度和宽度,一个字节最大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,关键帧ID为000001FD,非关键帧ID为000001FC。

给一个例子:

mepg-4 的码流分析相关推荐

  1. 完成一个H.265/HEVC码流分析工具

    经过大约一个月左右的业余时间,终于初步完成一个H.265/HEVC码流分析工具.时间包括平时的周末.晚上,以及调休的集中时间.当然,中秋回家过节不写代码.截至今天,经过多种H.265序列测试,也有各种 ...

  2. 我的HEVC码流分析工具MFC小笔记:树形控件使用及窗口缩放

    大约1个半月前,发布了自己写的HEVC码流分析工具.当时的版本显示语法元素使用是的Edit控件.很多主流分析工具都使用树形控件,看上去觉得比较高端,于是在纠结一天后下定决心自己也实现树形的HEVC语法 ...

  3. IPTV码流分析指标

    针对IPTV码流可以分析如下指标(参考蓝拓扑公司的IPTV码流分析产品) 视频内容质量分析 被动式的视频平均意见分(MOS)测量 实时对所选的IPTV 和VOD 节目进行音视频回放 MPEG PES ...

  4. 实现一个avs2码流分析工具

    最近在做avs2编码器项目,但是却没有成熟的码流分析工具,于是抽空学习了QT,业余时间写了一个avs2码流分析工具. 软件的界面如下: 图1.avs2码流分析仪界面 UI的左边框为NAL列表或者语法元 ...

  5. FFmpeg入门详解之12:Elecard Stream Analyzer码流分析工具

    简介 Elecard Stream Analyzer是一款简单小巧的码流分析工具,通过该软件,用户可以快速的分析查看视频序列码流:软件操作简单,使用方便,用户只需将视频文件导入软件内,系统就会自动帮您 ...

  6. 一个H.265/HEVC码流分析工具

    经过大约一个月左右的业余时间,终于初步完成一个H.265/HEVC码流分析工具.时间包括平时的周末.晚上,以及调休的集中时间.当然,中秋回家过节不写代码.截至今天,经过多种H.265序列测试,也有各种 ...

  7. H265/HEVC视频分层码流分析语义元素解释

    H265/HEVC视频分层码流分析语义元素解释 H265分层结构 H265码流结构 Ffmpge 抽取H264,H265码流的命令 视频参数集VPS 序列参数集SPS(Sequence Paramet ...

  8. android代码流分析工具,视频码流分析工具(Elecard StreamAnalyzer)下载 v4.0.171116 官方版 - 比克尔下载...

    Elecard StreamAnalyzer是一个专业的视频码流分析工具,拥有码流错误报告.TS错误侦测和基于ETSI TR101-290的分析功能,能够对编码器媒体流进行深入的句法分析,支持H.26 ...

  9. H.264码流分析及编解码调试

    一.H.264码流分析 1. 选择一个.mp4或者.264文件. 2. 在码流分析仪软件中打开该文件,从几个层次进行分析: (1) 分析SPS和PPS里都包含哪些主要的信息,给出参数值.(例如分辨率. ...

最新文章

  1. java -version cmd_java如何运行步骤cmd?Java执行cmd命令方法有哪些?
  2. C语言step-by-step(四)(循环控制)
  3. python函数教程:global 和 nonlocal的详细用法
  4. 用py2exe打包成一个exe文件
  5. Spring 注解 @Resource和@Autowired
  6. 同步手绘板——json
  7. Objective-C的hook方案(一): Method Swizzling
  8. java 算法基础之一寻找最大公约数
  9. python面向对象编程(1)
  10. C++ 动态结构体数组与map
  11. Python代码格式化规范
  12. LabView---双通道示波器(内含信号发生器)
  13. 范围求和 II-c语言解决
  14. 一个SAP开发人员的双截棍之路
  15. python程序文件的扩展名是-python脚本文件的扩展名是什么
  16. C++多线程编程实战01:std::thread
  17. 畜牧养殖APP系统开发源码
  18. 中国报纸今年十大流行语发布:虐俘和审计风暴
  19. 猜数字小游戏(Python)
  20. java_home的配置

热门文章

  1. c++ 提取傅里叶描述子_SQL 子查询的优化
  2. spring 整合c3p0连接池
  3. 视频帧率(Frame rate)
  4. 计算机专业本科生和研究生比较
  5. 中专毕业计算机,我是一个中专毕业生,学的是计算机专业,对pho..._求职实习_帮考网...
  6. 高质量 C++/C 编程指南
  7. 上海市高校大学生程序设计邀请赛 C:小花梨判连通
  8. 艾永亮:如何“睡”出一只11亿美元的独角兽?
  9. Unity学习-配置vuforia
  10. 性能:到底什么是性能测试