动态照片格式 1.0

动态照片是指同时包含静态照片图像和 短视频(包含录音)。通过这种类型的媒体 查看高分辨率的静态图片以及视频和声音,以捕获 拍摄情绪和氛围。

依赖项

以下是本规范的规范性参考资料:

简介

使用“必须”“不得”“必需”“应” “不应该”“建议”“可以”和“可选”符合 IETF 标准 RFC2119 中定义的规范。

动态照片格式

动态照片文件包括主要静态图片文件 JPEGHEICAVIF, 次要视频文件附加到其上。主图片包含 Camera XMP 描述如何显示静态图片文件和视频文件内容的元数据; 和描述如何查找视频文件内容的 Container XMP 元数据。

Ultra HDR JPEG 一样,图片文件可能具有增益图。

文件名模式

写入者应使用符合以下正则表达式的文件名:

^([^\\s\\/\\\\][^\\/\\\\]*MP)\\.(JPG|jpg|JPEG|jpeg|HEIC|heic|AVIF|avif)

读者可能会忽略 XMP 元数据、附加的视频文件或相应视频 。

媒体数据编码

主图片包含容器元素 XMP 元数据目录,用于定义后续媒体的顺序和属性 文件容器中。容器中的每个文件都有一个对应的媒体 目录。媒体内容描述的是文件中的位置 容器和每个串联文件的基本属性。

XMP 属性

两组 XMP 元数据用于定义 动态照片格式。元数据可以按任意顺序显示。

相机元数据

相机元数据对有关如何呈现主要图片和 动态照片的视频部分。

  • 命名空间 URI 为 http://ns.google.com/photos/1.0/camera/
  • 默认命名空间前缀为 Camera

以下属性可能会显示在静态图片文件 XMP 元数据中:

名称

类型

说明

Camera:MicroVideo

Camera:MicroVideoVersion

Camera:MicroVideoOffset

Camera:MicroVideoPresentation
TimestampUs

这些属性是微视频 V1 规范的一部分。它们已从此规范中删除,如果存在,必须忽略。

具体而言,MicroVideoOffset 属性已替换为 GContainer:ItemLength 值,用于在文件中定位视频数据。

Camera:MotionPhoto

Integer

0:表示不应将文件视为动态照片。

1:表示应将文件视为动态照片。

所有其他值均未定义,视为 0。

如果值为零或负数,则文件将始终视为 非动态照片,即使该文件确实附加了视频也不例外。

大多数主流编辑器都支持 XMP,因此静态图片文件 即使附加了 已删除视频。因此,此字段不是确定性的,读者 必须始终确认视频是否存在

Camera:MotionPhotoVersion

Integer

表示动态照片的文件格式版本。本规范定义的版本为“1”。

Camera:MotionPhotoPresentationTimestampUs

Long

Long 值表示与静态图片对应的视频帧的呈现时间戳(以微秒为单位)。值可以设为 -1,表示未设置/未指定。

呈现行为

如果 XMP 数据包中没有 Camera:MotionPhotoPresentationTimestampUs, 读者应使用紧接在时间戳之前的呈现时间戳 最靠近视频轨道中间位置,即视频轨道的时长 除以 2。

如果 XMP 数据包中有 Camera:MotionPhotoPresentationTimestampUs,并且 "application/motionphoto-image-meta"是否出现在视频中, 值必须出现在 primaryImageFrameScoreDescr presentationTimestampUs 字段。如果 Camera:MotionPhotoPresentationTimestampUs 不是 且元数据轨道存在,则 元数据轨道必须为 -1。

容器元素

容器元素以编码方式编入主图片的 XMP 元数据, 定义了容器中媒体内容的目录。媒体项必须 位于容器文件内,且顺序与 目录,并且必须紧密封装。

  • 命名空间 URI 为 http://ns.google.com/photos/1.0/container/
  • 默认命名空间前缀为 Container

目录只能包含一个主图片内容,且该内容必须是第一项 目录。

元素名称

类型

说明

Directory

有序结构数组

Container:Item 结构的有序数组,用于定义布局和 容器的内容

商品元素

媒体内容元素说明应用应如何使用每项内容。

  • 命名空间 URI 为 http://ns.google.com/photos/1.0/container/item/
  • 默认命名空间前缀为 Item

第一项媒体内容必须是主图片。它必须包含 Mime。 属性,用于指定内容 MIME 类型中列出的某个图片 MIME 类型 值。主要商品的长度可通过解析主要商品 根据 MIME 类型从文件容器的开头开始。

第一项媒体内容可以包含 Padding 属性,用于指定额外的 已编码主图片结尾与 下一个媒体项。只有第一项媒体内容可以包含 Padding 属性。

每项媒体内容必须包含 Mime 属性。次要媒体内容必须 还包含长度属性。

连续媒体内容可在文件容器中共享资源数据。通过 第一个媒体内容可确定资源在文件容器中的位置, 且后续共享媒体项会将 Length 设为 0,前提是 资源数据本身就是一个容器。

媒体内容资源在容器中的位置由 上述次要项目资源的 Length 值设为 主要图片编码加上 Padding(如果指定)。

属性名称

类型

说明

Mime

String

必需。指示容器中媒体内容 MIME 类型的简单字符串。

Semantic

String

必需。用于指示媒体内容对于应用的特定含义的简单字符串。有关定义,请参阅“内容语义值”部分。

Length

Integer

次要媒体内容(包括视频容器)必须填写。内容的长度(以正整数显示,以字节为单位)。媒体内容应以原始形式显示,不会应用任何编码。长度值是文件中字节的实际长度。

次要媒体内容的长度为 0 表示与前一项媒体内容共享媒体内容资源。主媒体内容的长度应为 0。

Padding

Integer

[JPEG 格式的动态照片]

对于主媒体内容,可选。 包含额外(以字节为单位)长度的正整数的简单字符串 已编码主图片结尾与 下一个媒体项。

[基于 HEIC/AVIF 的动态照片]

主媒体项的必填项。值必须等于 8,即 动态照片的标题长度 视频数据(“mpvd”)框

Item:MIME 类型值

Item:Mime 属性定义每项媒体内容的 MIME 类型。

说明

image/jpeg

JPEG 图片

image/heic

HEIC 图片

image/avif

AVIF 映像

video/mp4

MP4 容器

video/quicktime

MOV 容器

Item:语义值

Item:Semantic 属性定义每个属性的应用特定含义 媒体文件目录。

Value

说明

Primary

表示媒体内容是容器中的主显示图片。动态照片必须包含(且只能有一个)具有此语义的内容。

MotionPhoto

表示媒体内容是视频容器。动态照片必须包含(且只能有一个)具有此语义的内容。此媒体项的位置必须位于文件末尾。此媒体项的字节终止后,不得放置其他字节。

使用 Ultra HDR 主图片的动态照片

根据本规范和 Ultra HDR 图片规范, 包含主 Ultra HDR 图片的动态照片还必须包含媒体内容 "GainMap" 的项语义。此外,对动态照片进行编码的作者必须将 增益图项元素放在视频项元素前面。

ISOBMFF 映像专用行为

动态照片 基于 ISOBMFF 图片(例如HEIC 和 AVIF 图片)的结构必须使图片符合 部分以顶级“动态照片视频数据”结尾方框 语法描述语言定义, ISO/IEC 14496-1:2010(E) 第 8 条:

// Box as defined in ISO/IEC 14496-12:2015: 4.2
aligned(8) class MotionPhotoVideoData extends Box('mpvd') {
  bit(8) data[];
}

其中“data”字段包含所有视频字节。特殊值“0” 不允许用于动态照片视频数据框的大小。(请参阅 ISO/IEC 14496-12:2015: 4.2 扩展 Box。)

ISOBMFF 图片的 XMP 还必须定义主媒体项的内边距 属性值等于动态照片视频的大小(以字节为单位) 数据框标题,即大小和名称标题。

请参考图 1,说明基于 HEIC 的运动示例的此框结构 照片:

展示 HEIC 动态文件中元素排列方式的折线图

图 1. 示例 HEIC 图片顶级框的图示 单个 HEIC 动态照片文件。请注意,这些框的顺序主要是 (请参阅有关如何构建 HEIF 或视频文件);不过,“mpvd”文本框必须在所有 HEIC 之后 图片文件的框。

视频容器内容

附加到主图片的视频容器文件必须包含 至少一个主视频轨道。此轨道必不可少,且包含经过编码的视频 采用 AVC 格式, HEVCAV1。通过 未定义主视频帧分辨率。视频色彩空间、传输 功能,位深可能会有所不同。例如,SDR 视频可能具有 8 位 深度、BT.709 色彩空间和 sRGB 转换函数。或者,HDR 视频 具有 10 位位深、BT.2100 色彩空间和 HLG 或 PQ 传输 函数以及 HDR 元数据和元数据轨道。

视频容器文件可能包含一个可选的分辨率更高的次要 视频轨道。读者应使用其内容来替代 以 JPEG 或 HEIC 图片编码的主要静态图片。此曲目可能包含 以 AVC、HEVC 或 AV1 编码的较低帧速率的视频。次要视频帧 分辨率。

预计次要视频轨道中的所有帧都具有 对应的帧。每一对对应的 主视频轨道和次要视频轨道中的帧呈现方式应该完全相同 时间戳。是否有次要轨道帧没有对应的主要轨道帧 曲目帧,观看者可以尝试选择与曲目最接近的主曲目帧 将展示时间戳匹配为该视频的代表性缩略图 次要视频轨道。

视频容器文件可能包含一个可选的 16 位单声道或立体声音频 采用 AAC 编码的 44kHz、48kHz 或 96kHz 音轨。读者应展示此内容 显示主视频轨道时显示的曲目。

次要视频轨道(如果存在)应始终位于主要视频轨道之后 视频轨道。其他轨道没有其他排序限制。通过 主视频轨道的轨道索引必须低于任何次要视频轨道的轨道索引 视频轨道。也就是说,如果主视频轨道的轨道编号为 2,那么任何轨道 次要视频轨道的轨道编号必须大于或等于 3。

具有机器智能评分功能的视频元数据跟踪

写入者可以选择向视频容器文件添加元数据轨道,并使用 输入“meta”。元数据轨道应该只有一个样本,其中包含 字节流,采用“语法”中所述的格式

如果存在元数据轨道,则系统将为 (即“mdia.minf.stbl.stsd”中的“stsd”框 “trak”)必须包含表示文本元数据样本的单个 Atom 条目 -(即“mett”框)。“mett”box 的 MIME 类型字符串必须等于 更改为“application/motionphoto-image-meta”。

语法

如果此元数据轨道已定义,其内容必须由字节流组成 符合此 MotionPhotoMetadataDescriptor 规范, 这里使用的是 ISO/IEC 14496-1:2010(E) 第 8 条。

// BaseDescriptor as defined in ISO/IEC 14496-1:2010(E): 7.2.2.2
abstract aligned(8) expandable((1<<28) - 1) class BaseDescriptor
    : bit(8) tag=0 {
  // Empty. To be filled by classes extending this class.
}

// Score data for a frame.
class MotionPhotoFrameScoreDescriptor extends BaseDescriptor
    : bit(8) tag=MotionPhotoFrameScoreDescrTag {
  // The frame's score in the range [0, 1].
  float(32) score;

  // The frame's presentation timestamp in microseconds.
  int(64) presentationTimestampUs;
}

// Score data for a track.
class MotionPhotoTrackScoreDescriptor extends BaseDescriptor
    : bit(8) tag=MotionPhotoTrackScoreDescrTag {
  // The number of scored frames in the track.
  unsigned int(32) numScoredFrames;

  // The track's frames' score data. They must be in ascending order with
  // respect to the presentation timestamp.
  MotionPhotoFrameScoreDescriptor trackFrameScoreDescr[numScoredHighResFrames];
}

// Score data for a motion photo.
class MotionPhotoScoreDescriptor extends BaseDescriptor
    : bit(8) tag=MotionPhotoScoreDescrTag {

  // Machine-intelligence model version used to calculate the scores. Writers
  // using a scoring model should set this field to 1 or greater. Writers not
  // using any scoring model should set this field to 0.
  unsigned int(32) modelVersion;

  // The primary image's frame score data.
  MotionPhotoFrameScoreDescriptor primaryImageFrameScoreDescr;

  // The high-resolution motion photo frames' score data.
  MotionPhotoTrackScoreDescriptor highResTrackScoreDescr;
}

// Flag data for a track.
class MotionPhotoTrackFlagsDescriptor extends BaseDescriptor
    : bit(8) tag=MotionPhotoTrackFlagDescrTag {
  // Set to true to indicate the video frames have been stabilized and don't
  // require readers of the track to apply any further stabilization.
  bit(1) isStabilized;
}

// Flags for a motion photo.
class MotionPhotoFlagsDescriptor extends BaseDescriptor
        : bit(8) tag=MotionPhotoFlagDescrTag {
  // The low-resolution motion photo track's flag data.
  MotionPhotoTrackFlagDescriptor lowResTrackFlagsDescr;

  // The high-resolution motion photo track's flag data.
  MotionPhotoTrackFlagDescriptor highResTrackFlagsDescr;
}

// Container for motion photo metadata, like stabilization indicators and
// quality scoring.
class MotionPhotoMetadataDescriptor extends BaseDescriptor
    : bit(8) tag=MotionPhotoMetadataDescrTag {
  // Scoring data for the still and high-res frames.
  MotionPhotoScoreDescriptor motionPhotoScoreDescr;

  // Flags for the low-res and high-res frames.
  MotionPhotoFlagDescriptor motionPhotoFlagDescr;
}

// Class tags for MotionPhotoData using the "User Private" tag space 0xC0-0xFE
// for descriptors defined in ISO/IEC 14496-1:2010(E): 7.2.2.1, Table 1.
// 0xC0 MotionPhotoMetadataDescrTag
// 0xC1 MotionPhotoScoreDescrTag
// 0xC2 MotionPhotoTrackScoreDescrTag
// 0xC3 MotionPhotoFrameScoreDescrTag
// 0xC4 MotionPhotoFlagsDescrTag
// 0xC5 MotionPhotoTrackFlagDescrTag