ChinaFFmpeg

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7787|回复: 0

[源码] MPEG4码流中,I, P, B Frame的判定

[复制链接]
发表于 2013-10-18 16:06:07 | 显示全部楼层 |阅读模式

群里经常有人问IPB帧的判断,然后研究了一下,发现了这篇帖子,转过来给大伙看看


目前AVI Player的进展不太顺利,虽然AVI文件本身的解析没有问题,完全可以将Video & Audio data正确的抓取出来,但是将Video送给 SPCE3200 做 Decode的时候就完蛋了。真是郁闷~!!

耐着性子跟踪了一下,企图可以找到不能Decode的原因(其实这些都是徒劳的,因为我本身对MPEG4的码流的格式并不懂),但是一无所获。因为自己在MPEG4编码方面的积累实在是太少了!!

后来突然想到,干脆去网上看看,是否有对码流的各个部分的意义的解释吧。于是,就拿0x00, 0x00, 0x01, 0xb6这个 Match Code 开始搜索。

让我高兴的是,竟然真的找到了一些有用的讯息:I,P,B Frame的判定方法!

0x00, 0x00, 0x01, 0xb6作为一个VOL(VOP?)的开始,紧跟着它的,有 2bit 的标志,用来表征这个 Frame到底是一个 I Frame还是 P Frame,抑或是 B Frame:


  1. 00: I Frame
  2. 01: P Frame
  3. 10: B Frame
复制代码

但是,有关这 2bit 是在0xb6的后面字节的高位还是低位,却没有很明确的描述。
于是又回头开始针对某个AVI文件开始分析,结果终于发现,判定方法原来是这个样子滴:

  1. static char *Find_VOP_Start(unsigned char *addrp, unsigned int FindSizes)
  2. {
  3. int i = 0;
  4. while(i < FindSizes)
  5. {
  6.         if(addrp[i] == 0x00)
  7.         if(addrp[i + 1] == 0x00)
  8.         if(addrp[i + 2] == 0x01)
  9.         if(addrp[i + 3] == 0xB6)
  10.                 break;
  11.         i++;
  12. }[/font][/color][/p][p=25, null, left][color=#333333][font=Verdana, Arial, Tahoma]if(i < FindSizes - 4)
  13.         return addrp + i + 4;
  14. else
  15.         return 0;
  16. }[/font][/color][/p][p=25, null, left][color=#333333][font=Verdana, Arial, Tahoma]unsigned int *p = Find_VOP_Start(VLCData, VLCSize);
  17. switch(*p & 0xC0)
  18. {
  19. case 0x00:
  20.         // I Frame
  21.         break;
  22. case 0x40:
  23.         // P Frame
  24.         break;
  25. case 0x80:
  26.         // B Frame
  27.         break;
  28. }[/font][/color][/p][p=25, null, left][color=#333333][font=Verdana, Arial, Tahoma]
复制代码

还是拿图来说明一下吧。下图中,第一个Frame是B Frame,第二个是一个P Frame:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|Archiver|ChinaFFmpeg

GMT+8, 2024-5-2 12:21 , Processed in 0.120130 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表