Java的媒体信息提取器
我需要一个可以处理常见媒体格式的媒体信息提取库(纯Java或JNI包装器)。 我主要将它用于video文件,我至少需要这些信息:
- video长度(运行时)
- video比特率
- video帧率
- video格式和编解码器
- video大小(宽X高)
- 音频频道
- 音频格式
- 音频比特率和采样率
有几个库和工具,但我找不到Java。
在问了几天这个问题之后,我发现MediaInfo提供了很多关于video或音频文件的技术和标签信息。
在subs4me的源代码树中有一个用于MediaInfo的JNI包装器,我发现它非常有用。 以下是一些代码片段,展示了如何从媒体文件中提取一些信息:
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的哪种媒体信息。
FileBot源包含原始且维护得最好的MediaInfo JNA包装器:
https://github.com/filebot/filebot/blob/master/source/net/filebot/mediainfo/MediaInfo.java
我已经在我的OSS FileBot中使用MediaInfo本机库超过2年了。 在所有平台上都能很好地工作。 Windows,Linux,MacOS甚至嵌入式Linux(ARM)。
你不需要这个东西的框架,例如AVIvideo容器格式有一个包含所有相关元数据的56字节头 。 该网站上还有许多其他格式 ,所有这些格式似乎都非常简单。
试试Xuggler 。 这是一些Xuggler 源代码 ,用于查询媒体文件并打印出各种有用的元数据。
- 艺术
您是否尝试过Java Media Framework API http://java.sun.com/javase/technologies/desktop/media/jmf/但是我不确定它是否会有足够的支持作为上面使用FFGpeg的Xuggle,这是使用的唯一优势这将是跨平台支持。