用于检查视频元数据的Java库(如果它是1080p,720p等)

Dan*_*yan 10 java video metadata

我目前正在寻找一个查看视频元数据的库,看看视频是1080p,720p还是最不能获得基本元数据(分辨率,比特率等),这样我就可以进行计算来检查自己.

我希望图书馆的大小,跨平台,它可以支持许多主要格式.像https://github.com/drewnoakes/metadata-extractor,当然还有视频.

我试着四处寻找,一无所获,这样的图书库存在吗?

Dan*_*yan 3

我还没有尝试过,但似乎Java MP4 Parser库正是我一直在寻找的。它能够跨平台读取和编辑元数据,并且文件大小似乎很轻。

github 文档摘录:

Java MP4 解析器

用于读取、写入和创建 MP4 容器的 Java API。操作容器与编码和解码视频和音频不同。使用图书馆

该库发布到 Maven 存储库。每个版本都会推送到发布在发布页面上的临时存储库。根据请求,可以将特定版本推送到 Maven 中心。

  <dependency>
    <groupId>com.googlecode.mp4parser</groupId>
    <artifactId>isoparser</artifactId>
    <version>1.1.7</version>
  </dependency>
Run Code Online (Sandbox Code Playgroud)

对于不使用依赖项管理工具的项目,每个版本的工件(jar、javadoc-jar、source-jar)都附加到版本页面。请注意,该项目需要aspectj-rt.jar库。

你能做什么?

MP4 解析器的典型任务是:

  • 将音频/视频复用为 MP4 文件
  • 附加使用相同编码设置的录音
  • 添加/更改元数据
  • 通过省略帧来缩短录音 我的示例将全部使用 H264 和 AAC,因为这两种编解码器对于 MP4 文件来说是最典型的。AC-3 也并不罕见,因为该编解码器在 DVD 中广为人知。还有带有 H263/MPEG-2 视频轨道的 MP4 文件,但它们不再像大多数 Android 手机那样广泛使用。你也可以

复用音频/视频

API 和流程非常简单:

您将每个原始格式文件包装到适当的 Track 对象中。

H264TrackImpl h264Track = new H264TrackImpl(new FileDataSourceImpl("video.h264")); AACTrackImpl aacTrack = new AACTrackImpl(new FileDataSourceImpl("audio.aac"));

然后将这些 Track 对象添加到 Movie 对象中

Movie movie = new Movie();
movie.addTrack(h264Track);
movie.addTrack(aacTrack);
Run Code Online (Sandbox Code Playgroud)

Movie 对象被送入 MP4Builder 以创建容器。

Container mp4file = new DefaultMp4Builder().build(movie);
Run Code Online (Sandbox Code Playgroud)

将容器放入适当的水槽中。

FileChannel fc = new FileOutputStream(new File("output.mp4")).getChannel(); mp4file.writeContainer(fc); fc.close(); 在某些情况下,帧速率是在带外发出信号或提前已知的,因此 H264 并不真正包含它。在这种情况下,您必须将其提供给构造函数。

有以下格式的 Track 实现:

  • H264
  • 亚克力
  • 交流3
  • EC3

另外两个字幕轨道不直接包装原始格式,但它们在概念上相似。

典型问题

音频和视频不同步。每当时间可能出现问题时,请确保开始

音频先于视频开始

在 AAC 中,始终有采样率/1024 样本/秒,因此每个样本的持续时间为 1000 * 1024 / 采样率毫秒。

  • 48KHz => ~21.3ms
  • 44.1KHz => ~23.2ms

通过从一开始就省略样本,您可以轻松缩短音轨。根据需要删除多个。您将无法将音频和视频与此完全匹配,但人类的感知对早期音频比对晚期音频更敏感。

请记住:如果某人距离仅 10 米,则音频和视频之间的延迟 >30 毫秒。大脑已经习惯了!

AACTrackImpl aacTrackOriginal = new AACTrackImpl(new FileDataSourceImpl("audio.aac")); // 删除第一个样本并将 AAC 轨道缩短约 22 毫秒 CroppedTrack aacTrackShort = new CroppedTrack(aacTrackOriginal, 1, aacTrack.getSamples().size());

使用相同的编码设置附加录音

需要强调的是,您不能附加任何两个轨道:

  • 不同的分辨率
  • 不同的帧速率

你不能做什么?

从电影创建 JPEG。不 - 这不是解码器。MP4 解析器不知道如何做到这一点。从 JPEG 创建电影