【问题标题】:Media Information Extractor for Java [closed]Java的媒体信息提取器[关闭]
【发布时间】:2010-01-30 16:05:25
【问题描述】:

我需要一个可以处理常见媒体格式的媒体信息提取库(纯 Java 或 JNI 包装器)。我主要将它用于视频文件,我至少需要这些信息:

  1. 视频长度(运行时)
  2. 视频比特率
  3. 视频帧率
  4. 视频格式和编解码器
  5. 视频大小(宽 X 高)
  6. 音频频道
  7. 音频格式
  8. 音频比特率和采样率

周围有几个库和工具,但我找不到 Java。

【问题讨论】:

  • 我们在这里讨论什么格式/编码?人们对媒体格式的“通用”有不同的定义。
  • 我的意思是 MPEG、DivX、XviD、Matroska、Real Video、Windows Media 视频格式;用于音频的 MP3 和 AC3。没有特定的格式是我需要的,所以格式支持越多,对我来说就越好。
  • subs4me 是否仅用于 Linux 平台?当我尝试您的示例时,由于 lib if (!(Platform.isLinux()))return; 中的这一行,我遇到了异常
  • JavaCv 是一个基于 openCV 和/或 ffmpeg 的包装器。您可以使用它获取所有这些信息。示例代码:OpenCVFrameGrabber frameGrabber = new OpenCVFrameGrabber(video_in); frameGrabber.getFrameRate();

标签: java media information-extraction


【解决方案1】:

在问了这个问题几天后,我找到了MediaInfo,它提供了有关视频或音频文件的数十个技术和标签信息。

subs4mesource tree 中有一个 MediaInfo 的 JNI 包装器 我觉得非常有用。下面是一些代码 sn-ps,展示了如何从媒体文件中提取一些信息:

String fileName   = "path/to/my/file";
File file         = new File(fileName);
MediaInfo info    = new MediaInfo();
info.open(file);

String format     = info.get(MediaInfo.StreamKind.Video, i, "Format", 
                        MediaInfo.InfoKind.Text, MediaInfo.InfoKind.Name);
int bitRate       = info.get(MediaInfo.StreamKind.Video, i, "BitRate", 
                        MediaInfo.InfoKind.Text, MediaInfo.InfoKind.Name);
float frameRate   = info.get(MediaInfo.StreamKind.Video, i, "FrameRate", 
                        MediaInfo.InfoKind.Text, MediaInfo.InfoKind.Name);
short width       = info.get(MediaInfo.StreamKind.Video, i, "Width", 
                        MediaInfo.InfoKind.Text, MediaInfo.InfoKind.Name);

int audioBitrate  = info.get(MediaInfo.StreamKind.Audio, i, "BitRate", 
                        MediaInfo.InfoKind.Text, MediaInfo.InfoKind.Name);
int audioChannels = info.get(MediaInfo.StreamKind.Audio, i, "Channels", 
                        MediaInfo.InfoKind.Text, MediaInfo.InfoKind.Name);

请注意,上面的代码是一个基本示例,不包含任何错误检查(这在实际场景中是一个坏习惯)。另请注意,您可以使用 MediaInfo 提取的信息不限于上述信息。查看 MediaInfo 的原始输出,了解您可以提取或读取哪种媒体信息MediaInfo C++ SDK

【讨论】:

  • subs4me 是否仅用于 Linux 平台?当我尝试您的示例时,由于 lib if (!(Platform.isLinux()))return; 中的这一行,我遇到了异常
  • 我不确定 subs4me 是否完全可移植。我在 Windows 上使用上面的代码没有任何问题。
  • 嗨 Emre,你能分享一下 subs4me 的用法吗?我只是将它的 jar 文件放入我的项目中并获取 MediaInfo。但是在调用 MediaInfo info = new MediaInfo(); 类时会抛出 java.lang.NoClassDefFoundError。有任何遗漏或必要的步骤,所以我可以使用 subs4me 吗?我搞不清楚了。谢谢。
  • 嗨 PTY,我没有使用 subs4me。当我提到我的问题时,我只是使用 subs4me 附带的示例包装器,而不是 subs4me 本身。我不知道 subs4me 是如何工作的。
  • 如果您要使用 FileBot 源中的 MediaInfo 包装器(由 subs4me 复制),请从实际维护的原始源中获取它:github.com/svn2github/filebot/blob/master/source/net/filebot/…
【解决方案2】:

你不需要一个框架来处理这些东西,例如 AVI 视频容器格式有一个 56 byte header 包含所有相关的元数据。 There's bunch of other formats on that site too,所有这些似乎都很容易实现。

【讨论】:

  • 我不是在编写媒体信息提取工具,所以我不想学习每种媒体格式并实现正确的提取类。另请注意,有许多容器格式具有更复杂的结构(其中一些是专有的),AVI 是最简单的情况之一。
【解决方案3】:

试试Xuggler。这是一些 Xuggler source code 查询媒体文件并打印出各种有用的元数据。

  • 艺术

【讨论】:

  • 已弃用:使用 javacv
【解决方案4】:

您是否尝试过 Java Media Framework API http://java.sun.com/javase/technologies/desktop/media/jmf/,但我不确定它是否有足够的支持,因为上面使用 FFMpeg 的 Xuggle,使用它的唯一优势是跨平台支持。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多