モーション フォトは静止画像と短い動画(音声録音を含む)を含む単一のファイルです。このタイプのメディアでは、ユーザーは高解像度の静止画像、動画や音声を表示して、画像が撮影された感情や雰囲気を捉えることができます。
依存関係
この仕様の規範的なリファレンスは次のとおりです。
- RFC で要件レベルを示すために使用するキーワード
- T.81 (09/92) Digitalcompress and coding of Continue-tone stuck images(JPEG)
- ISO/IEC 23008-12:2022 Highefficiency coding and media Delivery in the heterogeneous environments Part 12: Image File Format(HEIC)
- AV1 Image File Format(AVIF)(AVIF)
- ウルトラ HDR 画像形式 v1.0 | Android デベロッパー(ウルトラ HDR)
- ISO 16684-1:2011(E) XMP Specification Part 1(XMP の仕様パート 1)(XMP)
- Adobe XMP Specification Part 3 Storage in Files(Adobe XMP の仕様パート 3 のファイル ストレージ)(XMP)
- ISO/IEC 14496-10:2022 Coding of audio-visual objects Part 10: Advanced video coding(AVC)
- ISO/IEC 23008-2:2023 Highefficiency coding and media delivery in the heterogeneous environments パート 2: 高効率動画コーディング(HEVC)
- AV1 ビットストリームおよびデコード処理仕様(AV1)
- ISO/IEC 14496-1:2010 Coding Of Audio-Visual Objects - Systems
- ISO/IEC 14496-12:2015 ISO Box media file format(ISOBMFF)
- ISO/IEC 14496-14:2020 Coding of Audio-Visual Object Part 14: MP4 file format(MP4)
- Apple QuickTime ファイル形式(MOV)
はじめに
「しなければならない」、「してはならない」、「必要」、「必要」、「するべき」、「推奨」、「しても構わない」、「任意」の使用は、RFC2119 で定義されている IETF 標準に準拠しています。
モーション フォト形式
モーション フォト ファイルは、メインの静止画像ファイル(JPEG、HEIC、AVIF)と、それに付加されたセカンダリ動画ファイルで構成されます。プライマリ画像には、静止画像ファイルと動画ファイルのコンテンツの表示方法を記述するカメラの XMP メタデータと、動画ファイルのコンテンツの場所を記述するコンテナの XMP メタデータが含まれます。
ウルトラ HDR JPEG の場合と同様に、画像ファイルにゲインマップが含まれていることがあります。
ファイル名パターン
ライターは、次の正規表現に一致するファイル名を使用する必要があります。
^([^\\s\\/\\\\][^\\/\\\\]*MP)\\.(JPG|jpg|JPEG|jpeg|HEIC|heic|AVIF|avif)
このパターンに従わない場合、リーダーは XMP メタデータ、追加された動画ファイル、動画コンテンツを無視できます。
メディアデータのエンコード
プライマリ画像には、ファイル コンテナ内の後続のメディア ファイルの順序とプロパティを定義するコンテナ要素の XMP メタデータ ディレクトリが含まれます。コンテナ内の各ファイルでは、ディレクトリ内に対応するメディア アイテムが格納されます。メディア アイテムには、ファイル コンテナ内の場所と、連結された各ファイルの基本プロパティが記述されます。
XMP 属性
2 組の XMP メタデータを使用して、モーション フォト形式の追加のセマンティック情報を定義します。メタデータは順不同で表示されます。
カメラのメタデータ
カメラのメタデータは、モーション フォトのメイン画像と動画部分の表示方法に関する情報をエンコードします。
- 名前空間 URI は
http://ns.google.com/photos/1.0/camera/
です。 - デフォルトの名前空間の接頭辞は
Camera
です。
静止画像ファイルの XMP メタデータには次の属性が含まれます。
名前 |
種類 |
説明 |
|
これらのプロパティはマイクロ動画 V1 の仕様に含まれていました。この仕様では削除されており、存在する場合は無視する必要があります。 具体的には、 |
|
|
|
0: ファイルをモーション フォトとして扱わないことを示します。 1: ファイルをモーション フォトとして扱う必要があることを示します。 その他の値はすべて定義されず、0 と同様に扱われます。 値がゼロまたは負の場合、動画が実際にファイルに追加されていても、ファイルは常にモーション フォト以外のものとして扱われます。 一般的なエディタでは XMP が引き継がれるため、追加された動画が削除されている場合でも、静止画像ファイルのフィールド値が 1 のままになることがあります。したがって、このフィールドは絶対的なものではなく、読者は常に動画が存在することを確認する必要があります。 |
|
|
モーション フォトのファイル形式のバージョンを示します。この仕様ではバージョン「1」を定義します。 |
|
|
画像の静止画に対応する動画フレームの表示タイムスタンプ(マイクロ秒単位)を表す long 値。値を -1 にすることで、設定されていないか、指定されていないことを表します。 |
表示の動作
XMP パケットに Camera:MotionPhotoPresentationTimestampUs
が存在しない場合、リーダーは動画トラックの中央に最も近いタイムスタンプの直前の表示タイムスタンプ(動画トラックの時間を 2 で割った値)を使用する必要があります。
XMP パケットに Camera:MotionPhotoPresentationTimestampUs
が含まれ、動画に "application/motionphoto-image-meta"
が存在する場合は、そのトラックの primaryImageFrameScoreDescr
presentationTimestampUs
フィールドに同じ値を指定する必要があります。Camera:MotionPhotoPresentationTimestampUs
が XMP パケットに存在せず、メタデータ トラックが存在する場合、メタデータ トラックの値は -1 である必要があります。
コンテナ要素
コンテナ要素はプライマリ画像の XMP メタデータにエンコードされ、コンテナ内のメディア アイテムのディレクトリを定義します。メディア アイテムは、ディレクトリ内のメディア アイテム要素と同じ順序でコンテナ ファイル内に配置され、密にパッキングする必要があります。
- 名前空間 URI は
http://ns.google.com/photos/1.0/container/
です。 - デフォルトの名前空間の接頭辞は
Container
です。
ディレクトリに含めることができるメイン画像アイテムは 1 つだけです。これはディレクトリ内の最初のアイテムにする必要があります。
要素名 |
種類 |
説明 |
|
構造体の順序付き配列 |
コンテナのレイアウトとコンテンツを定義する |
アイテム要素
メディア アイテム要素では、アプリケーションでの各アイテムの使用方法を記述します。
- 名前空間 URI は
http://ns.google.com/photos/1.0/container/item/
です。 - デフォルトの名前空間の接頭辞は
Item
です。
最初のメディア アイテムはメイン画像である必要があります。アイテムの MIME タイプ値に記載されている画像 MIME タイプのいずれかを指定する Mime
属性を含める必要があります。メインアイテムの長さは、ファイル コンテナの先頭から始まる MIME タイプに基づいてメイン画像を解析することで決定できます。
最初のメディア アイテムには、エンコードされたメイン画像の末尾と次のメディア アイテムの先頭との間の追加のパディングを指定する Padding
属性を含めることができます。Padding
属性を指定できるのは最初のメディア アイテムのみです。
各メディア アイテムには Mime
属性を含める必要があります。セカンダリ メディア アイテムには Length 属性も含める必要があります。
シーケンシャル メディア アイテムは、ファイル コンテナ内でリソースデータを共有できます。最初のメディア アイテムによってファイル コンテナ内のリソースの場所が決まり、リソースデータ自体がコンテナの場合、後続の共有メディア アイテムでは Length
が 0 に設定されます。
コンテナ内のメディア アイテム リソースの場所は、直前の付随アイテム リソースの Length
値に、メイン画像のエンコード長に Padding
(指定されている場合)を加えた値で決まります。
属性名 |
種類 |
説明 |
|
|
必須。コンテナ内のメディア アイテムの MIME タイプを示すシンプルな文字列です。 |
|
|
必須。メディア アイテムのアプリ固有の意味を示すシンプルな文字列。定義については、「アイテムのセマンティック値」セクションをご覧ください。 |
|
|
動画コンテナなど、付随するメディア アイテムでは必須。正の整数の長さ(バイト単位)。メディア アイテムは、エンコードが適用されていない元の形式である必要があります。長さの値はファイルのバイトの実際の長さです。 付随メディア アイテムの長さ 0 は、メディア アイテムのリソースが前のメディア アイテムと共有されていることを示します。プライマリ メディア アイテムの長さは 0 である必要があります。 |
|
|
[JPEG ベースのモーション フォト] メイン メディア アイテムの場合は省略可能。 エンコードされたメイン画像の末尾から次のメディア アイテムの先頭までの追加パディングをバイト単位で正の整数で含むシンプルな文字列。 [HEIC/AVIF ベースのモーション フォト] メイン メディア アイテムでは必須。8 に等しい値、つまりモーション フォト動画データ(「mpvd」)ボックスのヘッダー長を指定する必要があります。 |
Item:MIME 型の値
Item:Mime
属性は、各メディア アイテムの MIME タイプを定義します。
値 |
説明 |
|
JPEG 画像 |
|
HEIC 画像 |
|
AVIF イメージ |
|
MP4 コンテナ |
|
MOV コンテナ |
アイテム:セマンティック値
Item:Semantic
属性は、コンテナ ディレクトリ内の各メディア アイテムのアプリケーション固有の意味を定義します。
|
説明 |
|
メディア アイテムがコンテナ内の表示可能なプライマリ画像であることを示します。モーション フォトには、このセマンティックを持つアイテムを 1 つだけ含める必要があります。 |
|
メディア アイテムが動画コンテナであることを示します。モーション フォトには、このセマンティックを持つアイテムを 1 つだけ含める必要があります。このメディア アイテムの場所は、ファイルの末尾にする必要があります。このメディア アイテムのバイトが終了したら、他のバイトを配置できません。 |
メインのウルトラ HDR 画像を使用したモーション フォト
この仕様とウルトラ HDR 画像の仕様で定義されているアイテム セマンティック値のルールに従い、プライマリ ウルトラ 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 では、メイン メディア アイテムのパディング属性値が、モーション フォト動画データ ボックス ヘッダーのサイズ(バイト単位)と同じになるように定義する必要があります。これはサイズと名前のヘッダーです。
HEIC ベースのモーション フォトのサンプルについて、このボックス構造を示した図 1 を参照してください。
図 1. 1 つの HEIC モーション フォト ファイル内のサンプル HEIC 画像を示すトップレベルのボックスのイラスト。ボックスの順序はほぼ説明のみを目的としています(HEIF または動画ファイルの作成方法については、関連する標準をご覧ください)。ただし、「mpvd」ボックスはすべての HEIC 画像ファイルのボックスの後に配置する必要があります。
動画コンテナのコンテンツ
メイン画像に追加される動画コンテナ ファイルには、メイン動画トラックが 1 つ以上含まれている必要があります。このトラックは必須で、AVC、HEVC、または AV1 でエンコードされた動画が含まれます。メイン動画のフレーム解像度は定義されていません。動画の色空間、伝達関数、ビット深度は異なる場合があります。たとえば、SDR 動画はビット深度が 8 ビット、BT.709 色空間、sRGB 伝達関数などがあります。また、HDR 動画には、HDR メタデータとメタデータ トラックとともに、10 ビットのビット深度、BT.2100 色空間、HLG または PQ の伝達関数があります。
動画コンテナ ファイルには、必要に応じて高解像度の付随動画トラックを 1 つ含めることができます。リーダーはそのコンテンツを使用して、JPEG または HEIC 画像でエンコードされたプライマリ静止画像の置換を表示する必要があります。このトラックには、AVC、HEVC、AV1 でエンコードされた低フレームレートの動画が含まれている場合があります。付随動画のフレーム解像度は定義されていません。
セカンダリ動画トラック内のすべてのフレームが、プライマリ動画トラックに対応するフレームを持つことが想定されます。メイン動画トラックと付随動画トラックの対応するフレームの各ペアには、同一のプレゼンテーション タイムスタンプを設定する必要があります。第 2 トラックのフレームに対応するメイン トラック フレームがない場合、視聴者は、表示タイムスタンプに最も近い表示タイムスタンプを持つメイン トラック フレームを、そのサブ動画トラックの代表サムネイルとして選択できます。
動画コンテナ ファイルには、AAC でエンコードされた 44 kHz、48 kHz、96 kHz の 16 ビットモノラルまたはステレオの音声トラックを 1 つ含めることができます(省略可)。読者は、メイン動画トラックが表示されるときに、この音声トラックを表示する必要があります。
付随動画のトラックが存在する場合は、必ずメイン動画トラックの後に配置します。他のトラックに関する順序の制約は他にありません。メイン動画トラックのトラック インデックスは、付随動画トラックのトラック インデックスよりも小さくする必要があります。つまり、メイン動画のトラックのトラック番号が 2 の場合、サブ動画のトラックには 3 以上のトラック番号が必要です。
マシン・インテリジェンス・スコアリングによる動画メタデータ・トラック
ライターは、必要に応じてタイプ「meta」のメタデータ トラックを動画コンテナ ファイルに追加できます。メタデータ トラックには、「構文」で説明されている形式のバイト ストリームを含むサンプルを 1 つだけ含める必要があります。
メタデータ トラックが存在する場合、トラックのサンプル説明テーブル エントリ(「trak」ボックスに対して「mdia.minf.stbl.stsd」にある「stsd」ボックス)には、テキスト メタデータのサンプル エントリを示す Atom(「mett」ボックス)を 1 つ含める必要があります。「mett」ボックスには、「application/motionphoto-image-meta」に等しい MIME タイプの文字列を指定する必要があります。
構文
このメタデータ トラックが定義されている場合、その内容は、この 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