从不完整的视频文件中提取元数据

12

有人能告诉我元数据存在哪些常见视频文件格式中吗?它是否位于文件开头附近还是分散在整个文件中。

我正在使用远程对象存储处理许多视频文件,我想从这些文件中提取元数据,特别是视频持续时间和视频尺寸,而不必将整个文件内容流式传输到本地计算机。

我希望这些元数据存储在文件的前X个字节中,因此我可以只获取从文件开头开始的字节范围,而不是整个文件,将这个部分文件数据传递给ffprobe

为了测试目的,我创建了一个22MB的MP4文件,并使用以下命令向ffprobe提供仅前1MB的数据:

head -c1024K '2013-07-04 12.20.07.mp4' | ffprobe -

它会输出:

avprobe version 0.8.6-4:0.8.6-0ubuntu0.12.04.1, Copyright (c) 2007-2013 the Libav developers
  built on Apr  2 2013 17:02:36 with gcc 4.6.3
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x1a6b7a0] stream 0, offset 0x10beab: partial file
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'pipe:':
  Metadata:
    major_brand     : isom
    minor_version   : 0
    compatible_brands: isom3gp4
    creation_time   : 1947-07-04 11:20:07
  Duration: 00:00:09.84, start: 0.000000, bitrate: N/A
    Stream #0.0(eng): Video: h264 (High), yuv420p, 1920x1080, 20028 kb/s, PAR 65536:65536 DAR 16:9, 29.99 fps, 30 tbr, 90k tbn, 180k tbc
    Metadata:
      creation_time   : 1947-07-04 11:20:07
    Stream #0.1(eng): Audio: aac, 48000 Hz, stereo, s16, 189 kb/s
    Metadata:
      creation_time   : 1947-07-04 11:20:07

我发现第一个1MB就足以提取视频时长9.84秒和视频尺寸1920x1080,尽管ffprobe打印了关于检测到部分文件的警告。如果我提供的数据小于1MB,则会完全失败。

这种方法对于其他常见的视频文件格式可靠地提取元数据是否有效,还是某些常见格式会将元数据散布在整个文件中?

我知道容器格式的概念以及各种编解码器可能用来表示这些容器内的音频/视频数据。虽然我不熟悉细节。所以我猜这个问题可能适用于常见的容器和编解码器组合? 预先感谢您的回答。

1个回答

18

经过查阅 MP4、3GP 和 AVI 规格说明书,我发现:

AVI

元数据存储在 AVI 文件的开头,根据AVI 文件格式规范

视频持续时间并不是直接存储在 AVI 文件中的,但可以通过计算(以微秒为单位)dwMicroSecPerFrame x dwTotalFrames 得出。

规格说明书没有显式提到,但从规格内容可以看出,许多元数据项可以直接从 AVI 文件内的偏移量读取,而无需解析。但是,使用这种经验法则可能存在风险。

偏移量 32: dwMicroSecPerFrame,偏移量 48: dwTotalFrames,偏移量 64: dwWidth,偏移量 68: dwHeight。

因此,对于 AVI 文件,只需读取前 X 个字节即可提取元数据。

MP4、3GP(3GPP)、3G2(3GPP2)

所有这些文件格式都基于ISO 基础媒体文件格式,也称为 ISO/IEC 14496-12(MPEG-4 第 12 部分)。

该格式允许将元数据存储在文件的任何位置,但实际上它通常存储在开头或结尾,因为原始捕获的音频/视频数据是连续保存在中间的。(然而,有一个例外情况:被“分段”的 MP4 文件很少见,参见这里。)

仅存储在开头的文件可以通过渐进式下载播放,但这取决于捕获设备或解码器是否支持。

根据我的理解,这意味着要从这些文件中提取元数据,只需要使用文件的前X个字节,从这些信息中可以确定可能还需要文件的最后X个字节。但是中间的字节不是必需的。


在实践中,可以依赖从文件开头获取元数据吗? - rosmcmahon
这种方法在某些编解码器(DXV和HAP)的视频中失败,因为每个工具都需要整个文件。你有没有针对这些问题的更新或解决方案? - Allen Ellis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接