動態相片格式 1.0

「動態相片」是包含靜態相片和短片 (包括音訊錄音) 的單一檔案。這類媒體可讓使用者查看高解析度的靜態圖片以及影片和音效,藉此捕捉圖片拍攝的情緒和氛圍。

依附元件

以下為這個規格的常態參照:

介紹功能

根據 RFC2119 中定義的 IETF 標準,「必須」、「不得」、「必要」、「應」、「不應」、「建議」、「可能」和「選用」使用。

動態相片格式

動態相片檔案包含主要靜態圖片檔 JPEGHEICAVIF,附加次要影片檔案。主要映像檔包含相機 XMP 中繼資料,說明如何顯示靜態圖片檔和影片檔案內容,以及描述如何找到影片檔案內容的 Container XMP 中繼資料。

圖片檔可能有增益貼圖,和使用 Ultra HDR JPEG 的情況一樣。

檔案名稱模式

撰寫者使用的檔案名稱應與下列規則運算式相符:

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

如未設定模式,讀取器可能會忽略 XMP 中繼資料、附加的影片檔案或影片內容。

媒體資料編碼

主要映像檔包含容器元素 XMP 中繼資料目錄,定義檔案容器中後續媒體檔案的順序和屬性。容器中的每個檔案在目錄中都有對應的媒體項目。媒體項目說明檔案容器中的位置,以及每個串連檔案的基本屬性。

XMP 屬性

兩組 XMP 中繼資料可用來定義 Motion Photo 格式的額外語意資訊。中繼資料會以任何順序顯示。

相機中繼資料

相機中繼資料會將資訊編碼,說明如何呈現動態相片的主要圖片和影片部分。

  • 命名空間 URI 為 http://ns.google.com/photos/1.0/camera/
  • 預設命名空間前置字串為 Camera

下列屬性可能會顯示在靜態圖片檔 XMP 中繼資料中:

姓名

類型

說明

Camera:MicroVideo

Camera:MicroVideoVersion

Camera:MicroVideoOffset

Camera:MicroVideoPresentation
TimestampUs

這些屬性為 Microvideo V1 規格的一部分。這些都是從這個規格中刪除的,如有的話,請予以忽略。

特別是,MicroVideoOffset 屬性會取代為在檔案中找出影片資料的 GContainer:ItemLength 值。

Camera:MotionPhoto

Integer

0:表示檔案不應視為動態相片。

1:表示檔案應視為「動態相片」。

所有其他值都未定義,同樣會視為 0。

如果值為零或負數,即使檔案實際上附加了影片,系統仍會將其視為非動態相片。

由於成效最高的編輯器會轉移 XMP,因此即使附加的影片已移除,這個欄位的剩餘圖片檔仍可能會有 1 的剩餘值。因此,這個欄位無法確定,且讀者必須確認影片確實存在。

Camera:MotionPhotoVersion

Integer

指出動態相片的檔案格式。此規格定義了「1」版本。

Camera:MotionPhotoPresentationTimestampUs

Long

代表與圖片靜止畫面的影片影格顯示時間戳記 (以微秒為單位) 的長值。這個值可以是 -1,表示未設定/未指定。

呈現方式

如果 XMP 封包中沒有 Camera:MotionPhotoPresentationTimestampUs,讀取器應使用緊鄰視訊軌中間時間戳記的顯示時間戳記,例如視訊軌時間長度除以 2。

如果 Camera:MotionPhotoPresentationTimestampUs 出現在 XMP 封包中,且影片中有 "application/motionphoto-image-meta",則該音軌的 primaryImageFrameScoreDescr presentationTimestampUs 欄位也必須顯示相同的值。如果 Camera:MotionPhotoPresentationTimestampUs 未出現在 XMP 封包中,且有中繼資料軌,則中繼資料軌跡中的值必須為 -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 屬性。

依序媒體項目可能會在檔案容器內共用資源資料。第一個媒體項目會決定檔案容器中的資源位置,而後續共用媒體項目會將 Length 設為 0,如果資源資料本身是容器,就會設為 0。

容器中的媒體項目資源位置,是將上述次要項目資源的 Length 值加總,以及主要圖片編碼加上 Padding (如有指定) 的長度。

屬性名稱

類型

說明

Mime

String

此為必要項目。這個簡易字串指出容器中媒體項目的 MIME 類型。

Semantic

String

此為必要項目。簡易字串,指出媒體項目的應用程式特定意義。請參閱「商品語意值」一節的定義。

Length

Integer

次要媒體項目 (包括影片容器) 的必要項目,項目的正整數長度 (以位元組為單位)。媒體項目應採用原始格式,且未套用任何編碼。長度值是檔案中位元組的實際長度。

次要媒體項目的長度為 0,表示與上一個媒體項目共用媒體項目資源。主要媒體項目的長度應為 0。

Padding

Integer

[JPEG 模式動態相片]

主要媒體項目的選用項目。 包含正整數長度的簡易字串,在已編碼的主要圖片結尾與下一個媒體項目開頭之間加上額外的間距 (以位元組為單位)。

[HEIC/AVIF 動態相片]

主要媒體項目的必要欄位。值必須等於 8,動態相片影片資料 (「mpvd」) 方塊的標頭長度。

項目:MIME 類型值

Item:Mime 屬性定義了每個媒體項目的 MIME 類型。

說明

image/jpeg

JPEG 圖片

image/heic

HEIC 圖片

image/avif

AVIF 圖片

video/mp4

MP4 容器

video/quicktime

MOV 容器

項目:語意值

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」。(如要瞭解擴充 Box 的類別大小,請參閱 ISO/IEC 14496-12:2015: 4.2)。

此外,ISOBMFF 圖片的 XMP 也必須定義主要媒體項目的邊框間距屬性值,等於動態相片影片資料方塊標頭的大小和名稱 (以位元組為單位)。

請參考圖 1 說明 HEIC 式動作相片的此方塊結構範例:

這張折線圖展示 HEIC 動態檔案中的元素排列方式

圖 1 插圖:單一 HEIC 動態相片檔案中範例 HEIC 圖片的頂層方塊。請注意,方塊順序主要僅供說明使用 (請參考有關建構 HEIF 或影片檔案的相關標準);儘管如此,「mpvd」方塊都必須位於所有 HEIC 圖片檔的方塊後方。

影片容器內容

附加至主要映像檔的影片容器檔案必須至少包含一個主要視訊軌。這個音軌是必要項目,其中包含以 AVCHEVCAV1 編碼的影片。主要影片影格解析度未定義。影片色域、傳輸函數和位元深度可能有所差異。例如,SDR 影片可能有 8 位元深度的 BT.709 色彩空間,並具有 sRGB 傳遞函數。或者,HDR 影片可能包含 10 位元深度、BT.2100 色域、HLG 或 PQ 傳遞函式,以及 HDR 中繼資料和中繼資料軌。

影片容器檔案可包含一個選用的高解析度次要視訊軌。對於以 JPEG 或 HEIC 編碼的主要靜態圖片,讀取器應使用其內容來顯示替換圖片。這個音軌可能包含以 AVC、HEVC 或 AV1 編碼的影格速率影片。未定義次要影片影格解析度。

次要視訊軌中的所有影格應該都具有對應的影格。主要和次要視訊軌中每組對應的影格都應有相同的顯示時間戳記。如果次要音軌影格沒有對應主要軌跡影格,檢視者可以嘗試選取具有最接近的相符顯示時間戳記的主要音軌影格,做為次要視訊音軌的代表縮圖。

影片容器檔案可能包含一個選用的 16 位元單聲道或立體聲音軌 (44kHz、48 kHz 或 96 kHz,在 AAC 中編碼)。主要視訊軌顯示時,讀者應播放這個音軌。

次要視訊軌 (如有) 應一律放在主要視訊軌「之後」。其他測試群組沒有其他排序限制。主要影片音軌的音軌索引必須低於任何次要影片音軌。也就是說,如果主要影片音軌的音軌數為 2,則所有次要影片音軌的音軌數都必須大於或等於 3。

使用機器智慧評分功能的影片中繼資料追蹤

寫入者可以選擇在影片容器檔案中加入類型為「meta」的中繼資料音軌。中繼資料軌只能有一個包含位元組串流的樣本 (採用「語法」中所述的格式)。

如果有中繼資料音軌,歷程的說明資料表項目範例 (即「mdia.minf.stbl.stsd」位於「mdia.minf.stbl.stsd」的「stsd」方塊位於「trak」方塊內) 中,必須包含一個 Atom,用來表示文字中繼資料樣本項目 (即「mett」方塊)。「mett」方塊的 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