如何使用mp4parser将元数据写入mp4文件?

时间:2014-10-27 03:58:18

标签: android metadata mp4 mp4parser

我正在使用mp4parser来复用从原始视频文件重新编码的h264和aac文件,如何将原始视频的元数据写入新的mp4文件?或者是否有一种将元数据写入mp4文件的常用方法?

3 个答案:

答案 0 :(得分:2)

元数据和MP4是一个真正的问题。通常没有支持的规范。但这只是问题的一部分。

  • 问题(1):何时编写元数据
  • 问题(2):写什么

Prob(1)相对容易解决:只需自己扩展DefaultMp4Builder或FragmentedMp4Builder并覆盖

protected ParsableBox createUdta(Movie movie) {
    return null;
}

有意义的事情。 E.g:

protected ParsableBox createUdta(Movie movie) {
    UserDataBox udta = new UserDataBox();
    CopyrightBox copyrightBox = new CopyrightBox();
    copyrightBox.setCopyright("All Rights Reserved, me, myself and I, 2015");
    copyrightBox.setLanguage("eng");
    udta.addBox(copyrightBox);
    return udta;
}
有些人用它来编写与苹果兼容的元数据,但即使我的代码中有一些类,我也从未真正弄清楚哪些有效,哪些无效。您可能希望了解Apple的规范here

是的:我一年到晚发布这个帖子。

答案 1 :(得分:0)

似乎'mp4parser'库(https://code.google.com/p/mp4parser/)支持在Android中将元数据写入mp4文件。但是,除了代码库中的一些示例之外,我发现关于如何执行此操作的文档很少甚至没有。我对以下示例感到非常幸运,该示例将XML元数据写入'moov / udta / meta'框中:

https://github.com/copiousfreetime/mp4parser/blob/master/examples/src/main/java/com/googlecode/mp4parser/stuff/ChangeMetaData.java

答案 2 :(得分:0)

如果您考虑替代方案,您可能希望为此目的查看JCodec。它现在具有org.jcodec.movtool.MetadataEditor API(以及匹配的CLI org.jcodec.movtool.MetadataEditorMain)。

他们的文档包含许多示例:http://jcodec.org/docs/working_with_mp4_metadata.html

所以基本上当你想要添加一些元数据时,你需要知道它对应的键。找到答案的一种方法是检查已经拥有所需元数据的示例文件。为此,您可以运行JCodec的CLI工具,该工具将打印出所有现有的元数据字段(带有值的键):

./metaedit <file.mp4>

然后,当您知道要使用的密钥时,可以使用相同的CLI工具:

# Changes the author of the movie
./metaedit -f -si ©ART=New\ value file.mov

或通过Java API执行相同的操作:

MetadataEditor mediaMeta = MetadataEditor.createFrom(new
    File("file.mp4"));
Map<Integer, MetaValue> meta = mediaMeta.getItunesMeta();
meta.put(0xa9415254, MetaValue.createString("New value")); // fourcc for '©ART'
mediaMeta.save(false); // fast mode is off

从文件中删除元数据字段:

MetadataEditor mediaMeta = MetadataEditor.createFrom(new
    File("file.mp4"));
Map<Integer, MetaValue> meta = mediaMeta.getItunesMeta();
meta.remove(0xa9415254); // removes the '©ART'
mediaMeta.save(false); // fast mode is off

要将字符串转换为整数fourcc,您可以使用以下内容:

byte[] bytes = "©ART".getBytes("iso8859-1");
int fourcc =
    ByteBuffer.wrap(bytes).order(ByteOrder.BIG_ENDIAN).getInt();

如果你想编辑/删除android元数据,你需要使用一组不同的功能(因为它的存储方式与iTunes元数据不同):

./metaedit -sk com.android.capture.fps,float=25.0 file.mp4

或者也可以通过API:

MetadataEditor mediaMeta = MetadataEditor.createFrom(new
    File("file.mp4"));
Map<String, MetaValue> meta = mediaMeta.getKeyedMeta();
meta.put("com.android.capture.fps", MetaValue.createFloat(25.));
mediaMeta.save(false); // fast mode is off