【问题标题】:How to write metadata to mp4 file using mp4parser?如何使用 mp4parser 将元数据写入 mp4 文件?
【发布时间】:2014-10-27 03:58:17
【问题描述】:

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

【问题讨论】:

    标签: android metadata mp4 mp4parser


    【解决方案1】:

    元数据和 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;
    }
    

    有些人用它来编写与苹果兼容的元数据,但即使我的代码中有一些类,我也从未真正弄清楚哪些有效,哪些无效。您可能想查看 Apple 的规范 here

    是的:我要迟到一年才发布。

    【讨论】:

      【解决方案2】:

      '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

      【讨论】:

      【解决方案3】:

      如果您考虑替代方案,您可能希望为此目的查看 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-01
        • 2012-11-06
        • 2013-08-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多