基础知识参看 : http://www.docin.com/p-367796495.html
当用一副图像来作为一个VO的时候,VOP就对应于具体某一帧了,因为VOP是VO特定时间点的表现
mpeg-4提出了视频对象(Video Object )的概念,将一幅图像分为几个视频对象。例如一幅图像中,人物作为一个对象,背景为另一个对象。VOP(Video Object Plant )-视频对象平面,是一个VO的时间采样。但是实际的编码器中,还是将整个图像作为一个对象处理,这样VOP就与以往帧的概念完全相同。P帧,即前向参考帧,是以当前帧之前的I、P帧为参考帧的编码图像。B帧,双向参考帧,以当前帧之前和之后的图像帧为参考帧的编码图像。而一个gov是由一个由i帧开始的,若干P、B帧组成的一个图像组,具体包含多少帧图像,由相关的编码器参数决定。

今天就把MPEG4码流的分析和它的I,P,B Frame的判定方法在这里简要记录一下吧,供日后的翻看和大家的参考。!

MPEG4码流分析:

0x00, 0x00, 0x01, 0xB0作为一个VOS的开始;

0x00, 0x00, 0x01, 0xB6作为一个VOP的开始,紧跟着VOP开始的,有一个2bit 的标志,用来表示这个Frame到底是一个 I Frame,P Frame,B Frame抑或是S Frame(GMS-VOP)

标志如下:

00: I Frame

01: P Frame

10: B Frame

11: S Frame

但是,有关这 2bit 是在0xB6的后面字节的高位还是低位,却没有很明确的描述。

于是又回头开始针对某个MPEG4编码好的文件开始分析,结果终于发现,判定方法如下:

1.可以写一个判定VOP,或者VOS开头的函数:

static unsigned char *Find_VOP_Start(unsigned char *addrp, unsigned int FindSizes)

{

while(pos < FindSizes)

{

if(addrp[pos] == 0x00)

if(addrp[pos + 1] == 0x00)

if(addrp[pos + 2] == 0x01)

if(addrp[pos + 3] == 0xB0)

break;        //判断是否是VOS头

if(addrp[pos] == 0x00)

if(addrp[pos + 1] == 0x00)

if(addrp[pos + 2] == 0x01)

if(addrp[pos + 3] == 0xB6)

break;        //判断是否是VOP

pos++;

}

if(pos< FindSizes - 4)

{

return addrp+pos+4;

}

else

return NULL;

}

2. 读一个MPEG4码流文件,然后利用刚才写的函数搜索StartCode:

size_t nRead = fread(lpSrc, 1, lSize, fp);

fseek(fp, 0, SEEK_SET);

while (!feof(fp))

{

unsigned char *p=Find_VOP_Start(lpSrc,lSize);

if (pos)    //pos为文件当前指针

{

length=pos-poslast+header;   //每帧长度为两个StartCode之间的字节数

if (length

{

//长度小于一定值,则不够一帧大小,表示在I frame前面的VOS,VO,VOL头

header=length;

}

else

{

header=0;

if (0==(nInput=fread(buffer,1,length,fp))) break; //读取一帧大小数据,

//调用解码器接口,进行解码测试操作;……

}

}

if (p==NULL) break;

//判定VOS是哪种profile

if (*(p-1)==0xB0)

{

if (*p==0xF5)  printf("VOS Header start,Advanced Simple Profile level 5!/n");

else if (*p==0x1) printf("VOS Header start,Simple Profile level 1!/n");

else if (*p==0x2)  printf("VOS Header start,Simple Profile level 2/n!");

……

else  printf("VOS Header Start,Other profile@level/n!");

}

if (*(p-1)==0xB6)

{

//判定是I,P,B ,S  Frame

if ((*p & 0xC0)==0x00)       printf("VOP-I frame # %d, ", frames++);

else if ((*p & 0xC0)==0x40) printf("VOP-P frame # %d, ", frames++);

else if ((*p & 0xC0)==0x80) printf("VOP-B frame # %d, ", frames++);

else if ((*p & 0xC0)==0xC0) printf("VOP-S frame # %d, ", frames++);

else   printf("VOP-unknown type frame # %d, ",frames++);

}

//继续查找下一个VOS/VOP的StartCode

poslast=pos;

pos=pos+4;

}

今天就把MPEG4码流的分析和它的I,P,B Frame的判定方法在这里简要记录一下吧,供日后的翻看和大家的参考。!

MPEG4码流分析:

0x00, 0x00, 0x01, 0xB0作为一个VOS的开始;

0x00, 0x00, 0x01, 0xB6作为一个VOP的开始,紧跟着VOP开始的,有一个2bit 的标志,用来表示这个Frame到底是一个 I Frame,P Frame,B Frame抑或是S Frame(GMS-VOP)

标志如下:

00: I Frame

01: P Frame

10: B Frame

11: S Frame

但是,有关这 2bit 是在0xB6的后面字节的高位还是低位,却没有很明确的描述。

于是又回头开始针对某个MPEG4编码好的文件开始分析,结果终于发现,判定方法如下:

1.可以写一个判定VOP,或者VOS开头的函数:

static unsigned char *Find_VOP_Start(unsigned char *addrp, unsigned int FindSizes)

{

while(pos < FindSizes)

{

if(addrp[pos] == 0x00)

if(addrp[pos + 1] == 0x00)

if(addrp[pos + 2] == 0x01)

if(addrp[pos + 3] == 0xB0)

break;        //判断是否是VOS头

if(addrp[pos] == 0x00)

if(addrp[pos + 1] == 0x00)

if(addrp[pos + 2] == 0x01)

if(addrp[pos + 3] == 0xB6)

break;        //判断是否是VOP

pos++;

}

if(pos< FindSizes - 4)

{

return addrp+pos+4;

}

else

return NULL;

}

2. 读一个MPEG4码流文件,然后利用刚才写的函数搜索StartCode:

size_t nRead = fread(lpSrc, 1, lSize, fp);

fseek(fp, 0, SEEK_SET);

while (!feof(fp))

{

unsigned char *p=Find_VOP_Start(lpSrc,lSize);

if (pos)    //pos为文件当前指针

{

length=pos-poslast+header;   //每帧长度为两个StartCode之间的字节数

if (length

{

//长度小于一定值,则不够一帧大小,表示在I frame前面的VOS,VO,VOL头

header=length;

}

else

{

header=0;

if (0==(nInput=fread(buffer,1,length,fp))) break; //读取一帧大小数据,

//调用解码器接口,进行解码测试操作;……

}

}

if (p==NULL) break;

//判定VOS是哪种profile

if (*(p-1)==0xB0)

{

if (*p==0xF5)  printf("VOS Header start,Advanced Simple Profile level 5!/n");

else if (*p==0x1) printf("VOS Header start,Simple Profile level 1!/n");

else if (*p==0x2)  printf("VOS Header start,Simple Profile level 2/n!");

……

else  printf("VOS Header Start,Other profile@level/n!");

}

if (*(p-1)==0xB6)

{

//判定是I,P,B ,S  Frame

if ((*p & 0xC0)==0x00)       printf("VOP-I frame # %d, ", frames++);

else if ((*p & 0xC0)==0x40) printf("VOP-P frame # %d, ", frames++);

else if ((*p & 0xC0)==0x80) printf("VOP-B frame # %d, ", frames++);

else if ((*p & 0xC0)==0xC0) printf("VOP-S frame # %d, ", frames++);

else   printf("VOP-unknown type frame # %d, ",frames++);

}

//继续查找下一个VOS/VOP的StartCode

poslast=pos;

pos=pos+4;

}

MPEG4基础知识简介以及 判断MPEG4的I, P, B帧相关推荐

  1. Windows通用克隆系统入门基础知识简介

    Windows通用克隆系统入门基础知识简介 这里的Windows是指微软的Windows 2000/XP/2003(后文中未经说明的,凡是Windows均指这三种系统):所谓的通用克隆,俗名万能克隆, ...

  2. Linux中文件描述符1,linux内核中的文件描述符(一)--基础知识简介

    原标题:linux内核中的文件描述符(一)--基础知识简介 Kernel version:2.6.14 CPU architecture:ARM920T Author:ce123(http://blo ...

  3. SpringCloud(1) 架构演进和基础知识简介

    一.传统架构演进到分布式架构 简介:讲解单机应用和分布式应用架构演进基础知识 (画图) 高可用 LVS+keepalive 1.单体应用:开发速度慢.启动时间长.依赖庞大.等等 2.微服务:易开发.理 ...

  4. IT:后端进阶技术路线图(初级→中级→高级)、后端开发工程师(技术方向分类之后台业务开发/中间件/内核/分布式架构)基础知识简介、技术路线/技术趋势指南(如何选择自己的技术方向)之详细攻略

    IT:后端进阶技术路线图(初级→中级→高级).后端开发工程师(技术方向分类之后台业务开发/中间件/内核/分布式架构)基础知识简介.技术路线/技术趋势指南(如何选择自己的技术方向)之详细攻略 目录 后端 ...

  5. linux内核中的文件描述符(一)--基础知识简介

    linux内核中的文件描述符(一)--基础知识简介 Kernel version:2.6.14 CPU architecture:ARM920T Author:ce123(http://blog.cs ...

  6. IC卡(智能卡)基础知识简介

    目录 IC卡(智能卡)基础知识简介 1.何为IC卡(智能卡) 2.IC卡的相关规范 3.智能卡如何管理其存储器 4.智能卡如何对信息存取过程进行控制 IC卡(智能卡)基础知识简介 IC卡(智能卡)基础 ...

  7. 计算机电源的输出电压包括,计算机电源的基础知识简介

    计算机电源的基础知识简介 1.简述计算机机箱的分类. 机箱根据不同的分类别标准有不同的分类,首先根据机箱的外形可以把机箱分为卧式和立式两种. 按照机箱的尺寸又可以分为超薄.半高.3/4高.全高等4种类 ...

  8. InSAR基础知识简介

    InSAR基础知识简介 合成孔径雷达干涉测量 雷达相位 跨轨干涉仪&沿轨干涉仪 地形干涉测量 干涉图解译 相干 1.配准 2.去除平地相位 3.大气延迟相位 4.多视和滤波处理.去除散斑 5. ...

  9. 101-相机基础知识简介

    101-相机基础知识简介 一.相机主要部件 二.色彩滤镜矩阵(Color Filter Array) Quad Bayer 备忘 简单介绍Camera的相关术语与原理 一.相机主要部件 Camera主 ...

最新文章

  1. 53 Paramiko的使用
  2. 线性表的顺序存储结构(数据结构篇)
  3. servlrt程序的入口点是_刚刚,微信偷偷更新,小程序又放大招了!
  4. Jeesite信息化快速开发平台
  5. 利用水的浮力测量物体的重量,这个方法称象可靠吗?
  6. python结巴_python结巴(jieba)分词
  7. Python实现定时自动关闭的tkinter窗口
  8. powershell 使用_使用PowerShell提取Azure成本
  9. 浅谈 MVC3 WebMail 发送邮件
  10. css+js调整当前界面背景音量
  11. 2022年8种高级威胁预测出炉、FBI就零日漏洞发出警报|11月22日全球网络安全热点
  12. 【图像】焦距与景深的关系
  13. 联想服务器能够上固态硬盘吗,拯救我的台式机:Lenovo 联想 固态硬盘 入手记
  14. hihocoder #1613 : 墨水滴 bfs+优先队列
  15. Dhrystone简介
  16. linux分区方案为user,Ubuntu 为用户分配磁盘空间Linux 硬盘分区方案
  17. 苹果取消iPhone 13显示屏的维修限制,Face ID不再受影响
  18. float与double的MAX-MIN
  19. (解决)虚拟机黑屏,界面显示:/dev/sda1: clean, xxxxx/yyyyyy files, aaaaaa/bbbbbbb blocks....
  20. 软件测试app crash是什么意思,APP常见崩溃原因和测试方法整理

热门文章

  1. Python实现元胞自动机——十字路口
  2. 阿里云大数据ACA认证考试总结
  3. STC12C5A60S2单片机驱动超声波
  4. blog10 提取候选词的输入文本
  5. 云计算、数据中心的现状和未来发展
  6. Linux命令提示符
  7. 怎样申请微信公众平台接口测试帐号
  8. 【如何处理Windows 8 系统自带微软拼音简捷输入法无法删除】
  9. 计算机网络知识点(四) 介质访问控制子层
  10. DLNA的几个小实验