如何使用mp4parser将Apple元信息写入MP4文件

时间:2013-06-07 18:35:38

标签: java itunes mp4 mp4parser

我正在使用mp4parser库将iTunes兼容的元信息添加到某些MP4文件中。此示例已简化,因为它不会检查框是否可用,但会重现该问题。

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

好消息是文件可以导入iTunes, Series-Name 显示在正确的位置。但是,MP4文件已损坏,无法启动电影。如何在不破坏文件的情况下添加此类元信息?

1 个答案:

答案 0 :(得分: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中,我不得不删除Apple相关内容,因为它需要重大工作。你暂时被RC-23困住了。