Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用mp4parser将元数据写入mp4文件?_Android_Metadata_Mp4_Mp4parser - Fatal编程技术网

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

Android 如何使用mp4parser将元数据写入mp4文件?,android,metadata,mp4,mp4parser,Android,Metadata,Mp4,Mp4parser,我正在使用mp4parser对从原始视频文件重新编码的h264和aac文件进行mux,如何将原始视频的元数据写入新的mp4文件?或者有没有一种通用的方法将元数据写入mp4文件?似乎“mp4parser”库()支持在Android中将元数据写入mp4文件。然而,我发现除了代码库中的一些示例之外,几乎没有关于如何实现这一点的文档。我很幸运地看到了以下示例,它将XML元数据写入“moov/udta/meta”框中: 元数据和MP4确实是个问题。没有普遍支持的规范。但这只是问题的一部分 问题(1):何

我正在使用mp4parser对从原始视频文件重新编码的h264和aac文件进行mux,如何将原始视频的元数据写入新的mp4文件?或者有没有一种通用的方法将元数据写入mp4文件?

似乎“mp4parser”库()支持在Android中将元数据写入mp4文件。然而,我发现除了代码库中的一些示例之外,几乎没有关于如何实现这一点的文档。我很幸运地看到了以下示例,它将XML元数据写入“moov/udta/meta”框中:


元数据和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;
}
有些人用它来编写与苹果兼容的元数据,但即使我的代码中有一些类,我也从来没有真正弄清楚什么是有效的,什么是无效的。你可能想看看苹果的规格


是的:我每年发布这篇文章要迟到。

< P>如果你考虑替代方案,你可能会为了这个目的去看看JCodec。它现在有了API(和一个匹配的CLI)

他们的文档包含许多示例:

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

或者通过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
如果您想编辑/删除android元数据,则需要使用不同的功能集(因为它的存储方式不同于iTunes元数据):

或者,通过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
MetadataEditor mediaMeta=MetadataEditor.createFrom(新建)
文件(“File.mp4”);
Map meta=mediaMeta.getKeyedMeta();
put(“com.android.capture.fps”,MetaValue.createFloat(25.);
mediaMeta.save(false);//快速模式关闭

Hi Tim,googlecode页面清楚地表明项目已经转移到github。例如:及
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
byte[] bytes = "©ART".getBytes("iso8859-1");
int fourcc =
    ByteBuffer.wrap(bytes).order(ByteOrder.BIG_ENDIAN).getInt();
./metaedit -sk com.android.capture.fps,float=25.0 file.mp4
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