moov box(movie box):包含若干子box,这些子box共同描述了媒体播放必需的元数据。
测试文件:
链接:https://pan.baidu.com/s/1lFrIJqI5TzQAhLH1SOGMDQ
提取码:u98c
搞了一张结构图 大概看看 每部分数据 都由 head与 data两部分组成
这个图是根据测试文件做的 跟其他文件有点区别是正常的
解析代码:
public static void main(String[] args) throws Exception {
RandomAccessFile in = new RandomAccessFile("F:/测试文件/video/testKongBu.mp4", "r");//任意流(随机流) 我还是比较喜欢叫任意流
/**
* 跳过ftyp
*/
int len = in.readInt();
in.skipBytes(len-4);
/**
* 解析moov 这是一个很大的box 需要分步去解析 首先看第一层的结构
*/
int length;
byte[] bType = new byte[4];
/*
* moov 数据头
*/
length = in.readInt();
in.read(bType);
System.out.println("moovLength="+length);
System.out.println("moov="+new String(bType));
/*
* moov数据内容
*/
int mvhdLen;
byte[] mvhd = new byte[4];
mvhdLen = in.readInt();
in.read(mvhd);
System.out.println("mvhdLength="+mvhdLen);
System.out.println("mvhd="+new String(mvhd));
in.skipBytes(mvhdLen-8);//跳过mvhd的data部分
for(int i=0;i<4;i++) {//测试文件 trak有四个 这里只是演示
int trakLen;
byte[] tType = new byte[4];
trakLen = in.readInt();
in.read(tType);
System.out.println("trakLen="+trakLen);
System.out.println("trak="+new String(tType));
in.skipBytes(trakLen-8);//跳过trak部分
}
/*
* udta 这部分以下不属于moov box
*/
int udtaLen;
byte[] udta =new byte[4];
udtaLen = in.readInt();
in.read(udta);
System.out.println("---------这以下不属于moov box-----------");
System.out.println("udta="+udtaLen);
System.out.println("udta="+new String(udta));
in.skipBytes(udtaLen-8);
/*
* free
*/
int freeLen;
byte[] free = new byte[4];
freeLen = in.readInt();
in.read(free);
System.out.println(freeLen);
System.out.println(""+new String(free));
in.skipBytes(freeLen-8);
/*
* mdat
*/
int mdatLen;
byte[] mdat = new byte[4];
mdatLen = in.readInt();
in.read(mdat);
System.out.println("mdat="+mdatLen);
System.out.println("mdat="+new String(mdat));
in.skipBytes(mdatLen-8);
in.close();
}
解析结果: