11

谁能告诉我元数据以常见的视频文件格式存储在哪里?如果它位于文件的开头,或者分散在整个文件中。

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

我希望此元数据将存储在文件的前 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,它会完全失败。

这种方法是否适用于其他常见的视频文件格式以可靠地提取元数据,或者任何常见的格式是否会在整个文件中分散元数据?

我知道容器格式的概念,并且可以使用各种编解码器来表示这些容器内的音频/视频数据。虽然我不熟悉细节。所以我猜这个问题可能适用于容器+编解码器的常见组合?提前致谢。

4

1 回答 1

15

在大量挖掘 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/IEC 14496-12(MPEG-4 第 12 部分)的ISO 基础媒体文件格式。

This format allows metadata to be stored anywhere in the file, but in practice it will be either at the start or the end because the raw captured audio/video data is saved contiguously in the middle. (An exception however, would be "fragmented" MP4 files, which are rare.)

Only files with the metadata stored at the start can be played via progressive download, but it is up to the capture device or decoder to support this.

AFAICT this means that to extract metadata from these files, only the first X bytes of the file would be required, and from that information it could be determined that potentially also the last X bytes would be required. But bytes in the middle would not be required.

于 2013-07-15T16:05:25.837 回答