moov box(movie box):包含若干子box,這些子box共同描述了媒體播放必需的元數據。
參考資料:https://blog.csdn.net/u013752202/article/details/80557296
測試文件:
鏈接: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();
}