2013-06-07 3 views
0

나는 mp4parser 라이브러리를 사용하여 일부 MP4 파일에 iTunes 호환 메타 정보를 추가하고 있습니다. 이 예제는 상자를 사용할 수 있는지 확인하지 않고 문제를 재현하기 때문에 단순화되었습니다.mp4parser로 MP4 파일에 Apple 메타 정보를 쓰는 방법

FileChannel fcr = new RandomAccessFile(srcFile, "r").getChannel(); 
FileChannel fcw = new RandomAccessFile(dstFile, "rw").getChannel(); 

IsoFile isoFile = new IsoFile(fcr); 

MovieBox moov = isoFile.getBoxes(MovieBox.class).get(0); 
UserDataBox udta = moov.getBoxes(UserDataBox.class).get(0); 
MetaBox meta = udta.getBoxes(MetaBox.class).get(0); 
AppleItemListBox apple = meta.getBoxes(AppleItemListBox.class).get(0); 

AppleShowBox box = box = new AppleShowBox(); 
box.setValue("Series-Name"); 
apple.addBox(box); 

isoFile.getBox(fcw); 
fcw.force(true);fcw.close(); 
fcr.close(); 

좋은 소식은 파일을 아이튠즈로 가져올 수 있습니다와 시리즈 - 이름가 올바른 위치에 표시되어 있습니다. 그러나 MP4 파일이 손상되어 영화를 시작할 수 없습니다. 파일을 손상시키지 않고 이런 종류의 메타 정보를 어떻게 추가 할 수 있습니까?

답변

1

mdat 상자의 오프셋을 늘리면 파일의 데이터 오프셋을 변경하는 것이 가장 가능성이 높습니다. 청크 오프셋 상자의 항목은 추가 한 바이트 수만큼 정확히 증가시켜야합니다. 당신은 수정 여기에이 코드를 사용할 수 있습니다 : 드문 경우에

private void correctChunkOffsets(IsoFile tempIsoFile, long correction) { 
    List<Box> chunkOffsetBoxes = Path.getPaths(tempIsoFile, "/moov[0]/trak/mdia[0]/minf[0]/stbl[0]/stco[0]"); 
    for (Box chunkOffsetBox : chunkOffsetBoxes) { 

     LinkedList<Box> stblChildren = new LinkedList<Box>(chunkOffsetBox.getParent().getBoxes()); 
     stblChildren.remove(chunkOffsetBox); 

     long[] cOffsets = ((ChunkOffsetBox) chunkOffsetBox).getChunkOffsets(); 
     for (int i = 0; i < cOffsets.length; i++) { 
      cOffsets[i] += correction; 
     } 

     StaticChunkOffsetBox cob = new StaticChunkOffsetBox(); 
     cob.setChunkOffsets(cOffsets); 
     stblChildren.add(cob); 
     chunkOffsetBox.getParent().setBoxes(stblChildren); 
    } 
} 

는 MDAT 상자가 먼저와 메타 데이터가 마지막으로, 당신은 그것을 변경할 필요가 없습니다. https://mp4parser.googlecode.com/svn/trunk/examples/src/main/java/com/googlecode/mp4parser/stuff/ChangeMetaData.java

가주의 :

나는 그것이 중요한 작업을 필요로하기 때문에 애플 관련 물건을 제거했다 최신 버전 1.0-RC-24에서 전체 예를 들어 여기 봐. 잠시 동안 RC-23에 붙어 있습니다.