تنسيق الصورة الحيّة 1.0

إنّ الصور الحيّة عبارة عن ملفات فردية تحتوي على صورة ثابتة وفيديو قصير يتضمّن التسجيل الصوتي. ويتيح هذا النوع من الوسائط للمستخدم مشاهدة صورة ثابتة عالية الدقة بالإضافة إلى الفيديو والصوت لالتقاط المشاعر والأجواء التي تم التقاط الصورة بها.

التبعيات

في ما يلي مراجع معيارية لهذه المواصفات:

المقدّمة

ينطبق استخدام "يجب" و"يجب ألا" و"مطلوب" و"يجب" و"يجب ألا" و"يُنصَح به" و"قد" و "اختياري" هو معيار IETF المحدَّد في RFC2119.

تنسيق الصور الحيّة

تتألف ملفات "الصور الحيّة" من ملف صور ثابتة أساسي، أو JPEG، أو HEIC، أو AVIF، مع إلحاق ملف فيديو ثانوي به. تحتوي الصورة الأساسية على بيانات وصفية للكاميرا XMP تصف كيفية عرض ملف الصورة الثابتة ومحتويات ملف الفيديو، والبيانات الوصفية لحاوية XMP التي تصف كيفية تحديد مكان محتوى ملف الفيديو.

قد يحتوي ملف الصورة على خريطة معزّزة، كما هو الحال مع صور 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 الوصفية الخاصة بملف الصور الثابتة:

الاسم

Type

الوصف

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 للإشارة إلى أنّه غير محدّد أو غير محدّد.

سلوك العرض التقديمي

في حال عدم توفّر Camera:MotionPhotoPresentationTimestampUs في حزمة XMP، يجب أن يستخدم القرّاء طابعًا زمنيًا للعرض التقديمي يسبق الطابع الزمني الأقرب إلى منتصف مسار الفيديو مباشرةً، أي مقسّمة على 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

قد يحتوي الدليل على عنصر صورة أساسي واحد فقط ويجب أن يكون العنصر الأول في الدليل.

اسم العنصر

Type

الوصف

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 في حال تحديدها.

اسم السمة

Type

الوصف

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

يشير إلى أنّ عنصر الوسائط هو حاوية الفيديو. يجب أن تتضمّن الصورة الحيّة عنصرًا واحدًا فقط يحمل هذه الدلالة. يجب أن يكون موقع عنصر الوسائط هذا في نهاية الملف. لا يمكن وضع أي وحدات بايت أخرى بعد إنهاء وحدات البايت الخاصة بهذا العنصر.

الصور الحيّة التي تحتوي على صورة أساسية بدقة HDR فائقة

وفقًا لقواعد القيمة الدلالية الخاصة بالعنصر والمحدّدة في هذه المواصفات وفي مواصفات صورة "دقة HDR فائقة"، يجب أن تتضمّن الصور الحيّة التي تحتوي على صورة أساسية بتقنية Ultra HDR أيضًا الوسائط التي تحتوي على دلالات "GainMap". كما يجب أن يضع كاتبو الصور المتحركة على كتّاب ترميز الصور المتحركة عنصر عنصر الالتقاط قبل عنصر الفيديو.

السلوك الخاص بالصورة وفقًا لمعيار ISOBMFF

صور حيّة تشتمل على صور مستندة إلى ISOBMFF (مثل يجب أن يكون لصور HEIC وAVIF بنية بحيث ينتهي جزء الصورة من الملف بصندوق "بيانات فيديو صور متحركة" ذات المستوى الأعلى، الموضحة باستخدام دلالات لغة الوصف النحوي المحددة في الفقرة 8 من معيار ISO/IEC 14496-1:2010(E):

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

حيث يحتوي حقل "البيانات" على جميع وحدات بايت الفيديو. ولا يُسمح باستخدام القيمة الخاصة "0" لحجم صندوق بيانات الصور الحيّة. (يُرجى الرجوع إلى ISO/IEC 14496-12:2015: 4.2 للاطّلاع على تعريف حجم الفئة التي تعمل على تمديد Box).

كما يجب أن يحدد عنصر XMP الخاص بصورة ISOBMFF قيمة سمة الحشو الأساسية لعنصر الوسائط الأساسي كقيمة مساوية لحجم عنوان صندوق بيانات فيديو الصور الحيّة بالبايت، أي الحجم ورؤوس الاسم.

راجع الشكل 1 الذي يوضح بنية المربع هذا للحصول على نموذج صورة حركة مستندة إلى HEIC:

رسم تخطيطي خطي يوضّح ترتيب العناصر في ملف حركة HEIC

الشكل 1. رسم توضيحي لمربعات المستوى الأعلى لنموذج صورة HEIC داخل ملف صورة متحركة HEIC واحد. يُرجى العلم أنّ ترتيب المربعات هو للتوضيح فقط (يُرجى الرجوع إلى المعايير ذات الصلة حول كيفية إنشاء ملفات HEIF أو ملفات الفيديو)؛ ومع ذلك، يجب أن يأتي مربّع "mpvd" بعد جميع مربّعات ملفات صور HEIC.

محتوى حاوية الفيديو

يجب أن يتضمن ملف حاوية الفيديو الذي يتم إلحاقه بالصورة الأساسية مقطعًا صوتيًا أساسيًا واحدًا على الأقل. هذا المقطع الصوتي مطلوب ويحتوي على فيديو بترميز AVC أو HEVC أو AV1. درجة الدقة الأساسية لإطار الفيديو غير محددة. قد تختلف مساحة لون الفيديو ووظيفة النقل وعمق البت. على سبيل المثال، قد تكون الفيديوهات ذات التنسيق SDR بعمق 8 بت ومساحة ألوان BT.709 بعمق 8 بت، مع وظيفة نقل sRGB. أو قد تحتوي فيديوهات HDR على عمق 10 بت ومساحة ألوان BT.2100 ووظيفة نقل HLG أو PQ، بالإضافة إلى بيانات وصفية بتنسيق HDR ومسارات بيانات وصفية.

قد يحتوي ملف حاوية الفيديو على مسار فيديو ثانوي اختياري واحد عالي الدقة. على القرّاء استخدام المحتوى لعرض بدائل الصورة الثابتة الأساسية المُرمّزة في صورة JPEG أو HEIC. قد يتضمّن هذا المقطع فيديو بعدد منخفض للقطات في الثانية تم ترميزه بتنسيق AVC أو HEVC أو AV1. درجة دقة إطار الفيديو الثانوي غير محددة.

من المتوقع أن تشتمل كل الإطارات في مسار الفيديو الثانوي على إطارات مقابلة في مسار الفيديو الأساسي. يجب أن يكون لكل زوج من الإطارات المقابلة في مقاطع الفيديو الأساسية والثانوية طوابع زمنية متطابقة للعرض التقديمي. إذا توفّرت إطار مسار ثانوي بدون إطار مناسب للمقطع الصوتي الأساسي، يمكن للمشاهدين اختيار إطار مقطع صوتي أساسي مرتبط بالطابع الزمني لعرض تقديمي مطابِق بصورة مصغّرة لتمثيل المقطع الصوتي الثانوي.

يمكن أن يحتوي ملف حاوية الفيديو على مسار صوتي اختياري أحادي أو استيريو واحد 16 بت أو 44 كيلوهرتز أو 48 كيلوهرتز أو 96 كيلوهرتز وبترميز AAC. ويجب أن يقدم القراء هذا المسار الصوتي عند عرض مسار الفيديو الأساسي.

يجب أن يأتي المقطع الصوتي الثانوي للفيديو دائمًا بعد مسار الفيديو الأساسي. لا توجد قيود ترتيب أخرى فيما يتعلق بالمسارات الأخرى. يجب أن يحتوي مقطع الفيديو الأساسي على فهرس مقاطع أقل من فهرس أي مقطع فيديو ثانوي. أي إذا كان المقطع الصوتي الأساسي للفيديو رقم 2، يجب أن يكون لأي مقطع فيديو ثانوي رقم مسار أكبر من أو يساوي 3.

تتبع البيانات الوصفية للفيديو مع نتائج ذكاء الآلة

يمكن للمؤلفين إضافة مسار بيانات وصفية إلى ملف حاوية الفيديو بشكل اختياري من نوع "meta". يجب أن يتضمن مسار البيانات الوصفية نموذجًا واحدًا فقط يتضمن بث بايت بالتنسيق الموضّح في "البنية".

في حال توفّر مسار البيانات الوصفية، يجب أن يحتوي إدخال جدول وصف النموذج الخاص بالمقطع الصوتي (أي المربّع "stsd" في "mdia.minf.stbl.stsd" بالنسبة إلى المربّع "trak") على حزمة واحدة تشير إلى إدخال نموذج بيانات وصفية نصية، (أي مربّع "ميت"). يجب أن يحتوي مربّع "ميت" على سلسلة من نوع MIME تساوي "application/motionphoto-image-meta".

بناء الجملة

إذا تم تحديد مسار البيانات الوصفية هذا، يجب أن يتألف محتواه من بث بايت يتوافق مع مواصفات MotionPhotoMetadataDescriptor هذه، كما هو موضّح هنا باستخدام دلالات لغة الوصف النحوي المحدَّدة في الفقرة 8 من قانون ISO/IEC 14496-1:2010(E).

// 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