织梦CMS - 轻松建站从此开始!

罗索

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

罗索客 发布于 2009-09-11 12:04 点击:次 
AVI文件解码把我的头都弄大了,真是的~
TAG:

目前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:
00: I Frame
01: P Frame
10: B Frame

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

static char *Find_VOP_Start(unsigned char *addrp, unsigned int FindSizes)
{
int i = 0;
while(i < FindSizes)
{
        if(addrp[i] == 0x00)
        if(addrp[i + 1] == 0x00)
        if(addrp[i + 2] == 0x01)
        if(addrp[i + 3] == 0xB6)
                break;
        i++;
}

if(i < FindSizes - 4)
        return addrp + i + 4;
else
        return 0;
}

unsigned int *p = Find_VOP_Start(VLCData, VLCSize);
switch(*p & 0xC0)
{
case 0x00:
        // I Frame
        break;
case 0x40:
        // P Frame
        break;
case 0x80:
        // B Frame
        break;
}

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

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

(佚名)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/200909/7460.html]
本文出处:网络博客 作者:佚名
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容