java MP4解析 第二步 解析moov box

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();
    }

解析結果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章