看了MP4Box的源码,后来对照代码参看了H.263的Specification,取宽高的 方法如下:
1. 读前22个bit(不是byte),然后转成int,这个值应该是32(0x20)。这是H.263 stream的start code,表示这是一个H.263的stream
2. 读第36-38bit,转成int,这个值就表示该263 stream的format,对应表如下:
1. 读前22个bit(不是byte),然后转成int,这个值应该是32(0x20)。这是H.263 stream的start code,表示这是一个H.263的stream
2. 读第36-38bit,转成int,这个值就表示该263 stream的format,对应表如下:
"000" - forbidden
"001" - sub-QCIF
"010" - QCIF
"011" - CIF
"100" - 4CIF
"101" - 16CIF
"110" - reserved
"111" - extended PTYPE
"001" - sub-QCIF
"010" - QCIF
"011" - CIF
"100" - 4CIF
"101" - 16CIF
"110" - reserved
"111" - extended PTYPE
具体到宽高,这里直接引用MP4Box中的代码(变量fmt就是36-38bit表示的值):
static void h263_get_pic_size(GF_BitStream *bs, u32 fmt, u32 *w, u32 *h)
{
switch (fmt) {
case 1: *w = 128; *h = 96; break;
case 2: *w = 176; *h = 144; break;
case 3: *w = 352; *h = 288; break;
case 4: *w = 704; *h = 576; break;
case 5: *w = 1409; *h = 1152 ; break;
default: *w = *h = 0; break;
}
}
switch (fmt) {
case 1: *w = 128; *h = 96; break;
case 2: *w = 176; *h = 144; break;
case 3: *w = 352; *h = 288; break;
case 4: *w = 704; *h = 576; break;
case 5: *w = 1409; *h = 1152 ; break;
default: *w = *h = 0; break;
}
}
H.263 Specification中有一张sub-QCIF, QCIF...这些格式对应的宽高的表。
至于framerate,我看MP4Box中处理是这样的:首先从 MP4Box的命令行中看用户有没有给定-fps,如果没有,则设成 15。我觉得我们的 代码可以首先采用上次我们讨论的方案,将1/duration得到,如果出现什么问题, 直接设成15即可。