2013-10-29 90 views
0

我有一个混合视频文件的文件夹(用于Web显示mp4,ogv,webm的多种格式)。在Java中检索这些文件时,我可以通过从文件名拉取扩展名来验证格式。 有没有办法从文件中检索其他信息,如视频和音频编解码器数据?Jave从文件中读取视频/音频编解码器

要创建文件,我使用Java内部的ffmpeg将视频文件转码为我需要的格式和大小,因此当创建文件时,我知道编解码器信息。 如果它没有自动存储在文件的某个地方,有没有办法设置元数据或手动存储信息,以便日后检索?我没有使用数据库来存储文件位置或其他数据,只是简单地从文件系统扫描和检索。

回答

0

视频和音频数据流(例如,H.264/AVC视频,AAC,杜比数字音频等)在被称为容器格式的文件格式内被复用(或“混合”)在一起。 MP4就是这样一种容器格式,其设计能够容纳许多不同类型的视频和音频流(对于某些官方注册类型,请参阅http://www.mp4ra.org/codecs.html)。

不同的容器格式具有标识所包含的不同媒体流的元数据,以帮助确定应使用何种类型的解码器来解码特定媒体流。

如果可以(您说您正在使用Java),请尝试使用ffprobe来确定媒体文件(以及其他元数据)中使用的容器,视频和音频格式。对于所有媒体类型(因为它可能无法识别某些类型),它可能不是100%可靠的,但考虑到您使用ffmpeg编码(ffprobe是ffmpeg派生的工具),它应该完成这项工作。

1

据我所知,没有简单的方法可以通过内容确定文件类型。你必须做出假设,然后用代码测试这些假设(例如,我认为它是X类型,因此我将检查始终存在于类型X的文件中的模式的前Y字节。)

1

我认为ffmpeg可以从您指定为ffmpeg实用程序的源文件中自动获取视频和音频格式。

如果您需要其他用途的元数据,那么您可以尝试Red5服务器源(Java)。有很多读者(包括MP4Reader)可以用来获取元数据。

例如,对于MP4文件MP4Reader扫描在类的构造整个文件,然后你可以从第一标签元数据:

reader = new org.red5.io.mp4.impl.MP4Reader(myFile) 
String v = reader.getVideoCodecId(); // e.g. "avc1" (for h.254), "VP6F" 
String a = reader.getAudioCodecId(); // e.g. "mp4a" (for aac), ".mp3" (for mp3) 
...