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
使用格式工厂,看到如下
根据标准,定义如下(http://bbs.lmtw.com/dispbbs.asp?boardID=20&ID=124481&star=2&page=15)
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,从这一位数据可以获得视频对象版本号、视频类型和视频信号类型信息,详细介绍见图5-11。
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的解码。
然后利用ffmpeg转码为mp4文件。
附:
xvid yuv->m4v
xvid_encraw.exe -i foreman_cif.yuv -w 352 -h 288
-framerate 15 -csp i420 -o foreman_cif.m4v
ffmpeg m4v->mp4
ffmpeg -s cif -vcodec mpeg4 -i foreman_cif.m4v foreman_cif.mp4