2014-10-27 70 views

回答

0

似乎“mp4parser”库(https://code.google.com/p/mp4parser/)支持将元数据写入Android中的mp4文件。不过,我发现这里没有关于如何做到这一点的文档,除了代码库中的几个例子之外。我有一些运气的例子,其写入XML元数据到“MOOV/UDTA /元”框:

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

+0

Hi Tim,googlecode页面明确指出该项目已移至github。示例如下:https://github.com/sannies/mp4parser/blob/master/examples/src/main/java/com/googlecode/mp4parser/stuff/MetaDataInsert.java和https://github.com/sannies/mp4parser /blob/master/examples/src/main/java/com/googlecode/mp4parser/stuff/MetaDataRead.java – 2015-10-15 16:51:05

2

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

  • 习题(1):当写元数据
  • 习题(2):写什么

习题(1)是比较容易解决:只要延长DefaultMp4Builder或FragmentedMp4Builder上您自己并覆盖

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

有意义的东西。例如: -

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

一些人使用的书写苹果兼容的元数据,但即使在我的代码有一些课程我从来没有真正想通了什么可行,什么不是。你可能想看看苹果的规格here

是的:我发布这一年到最后。

0

如果你考虑一下你可能想要看JCodec的替代方案。它现在有org.jcodec.movtool.MetadataEditor API(和一个匹配的CLI org.jcodec.movtool.MetadataEditorMain)。

他们的文档中包含许多样品:http://jcodec.org/docs/working_with_mp4_metadata.html

所以基本上,当你想添加一些你需要知道它对应于哪个键(S)的元数据。找出一种方法是检查已经有你需要的元数据的示例文件。为此,您可以运行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