头部是一个大容器,包含两个box -  ftyp和free
 

  1. public void writeHeader() throws IOException{  
  2. writeFtypBox();  
  3. writeFreeBox();  
  4. }  
  5.  
  6.  
  7. private void writeFtypBox() throws IOException{  
  8. write(intTobyte(20));//box_length  
  9. write("ftyp");//box_type (4字节)  
  10. write("isom");//major_brand (4字节)  
  11. write(intTobyte(512));//minor_version (4 字节)  
  12. write("mp41");//compatible_brands (4字节)  
  13. }  
  14.  
  15. private void writeFreeBox() throws IOException{  
  16. write(intTobyte(8));  
  17. write("free");  
  18. }  
  19.  
  20.  
  21. private byte[] intTobyte(int value){  
  22. byte[] data = new byte[4];  
  23. data[3] = (byte)(value);  
  24. data[2] = (byte)(value>>8);  
  25. data[1] = (byte)(value>>16);  
  26. data[0] = (byte)(value>>24);  
  27. return data;  
  28. }  
  29.  
  30. private void write(byte[] data) throws IOException{  
  31. mOutput.write(data);  
  32. }  
  33.  
  34. private void write(String str) throws IOException{  
  35. mOutput.write(str.getBytes());  

 MP4文件有很多box组成,每个box呢,都有一部分共同的属性,还有一部分自己独特的扩展属性,就跟基类和实现类的关系是一样的。

共性部分非常简单

 

  1. aligned(8) class Box (unsigned int(32) boxtype,  
  2. optional unsigned int(8)[16] extended_type) {  
  3. unsigned int(32) size;  
  4. unsigned int(32) type = boxtype;  
  5. if (size==1) {  
  6. unsigned int(64) largesize;  
  7. else if (size==0) {  
  8. // box extends to end of file  
  9. }  
  10. if (boxtype==‘uuid’) {  
  11. unsigned int(8)[16] usertype = extended_type;  
  12. }  

核心的就2个:4个字节的长度(长度为0和1时候有特殊意义),4个字节的type

ftyp box继承于box,在ISO规范中是这样定义的

 

  1. aligned(8) class FileTypeBox  
  2. extends Box(‘ftyp’) {  
  3. unsigned int(32) major_brand;  //ex:isom  
  4. unsigned int(32) minor_version;//ex:512  
  5. unsigned int(32) compatible_brands[]; // to end of the box ex:mp41  

 

 多个3个信息:主版本信息,次版本信息 ,兼容信息