Định dạng Ảnh chuyển động 1.0

Ảnh chuyển động là các tệp đơn lẻ chứa ảnh chụp tĩnh và một video ngắn, trong đó có bản ghi âm. Loại nội dung nghe nhìn này cho phép người dùng xem hình ảnh tĩnh có độ phân giải cao, cũng như video và âm thanh để nắm bắt tâm trạng và bầu không khí nơi ảnh được chụp.

Phần phụ thuộc

Sau đây là các tài liệu tham khảo quy chuẩn cho thông số kỹ thuật này:

Giới thiệu

Việc sử dụng "PHẢI", "KHÔNG ĐƯỢC", "BẮT BUỘC", "NÊN", "KHÔNG NÊN", "NÊN DÙNG", "CÓ THỂ" và "KHÔNG BẮT BUỘC" là theo tiêu chuẩn IETF được xác định trong RFC2119.

Định dạng ảnh chuyển động

Tệp Ảnh chuyển động bao gồm một tệp hình ảnh tĩnh chính, JPEG, HEIC hoặc AVIF, với một tệp video phụ được thêm vào. Hình ảnh chính chứa siêu dữ liệu Camera XMP mô tả cách hiện tệp hình ảnh tĩnh và nội dung tệp video, cũng như siêu dữ liệu của Vùng chứa XMP mô tả cách xác định nội dung tệp video.

Tệp hình ảnh có thể có bản đồ khuếch đại, như trường hợp với JPEG JPEG siêu phân giải.

Mẫu tên tệp

Người viết nên sử dụng tên tệp khớp với biểu thức chính quy sau:

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

Người đọc có thể bỏ qua siêu dữ liệu XMP, tệp video được thêm vào hoặc nội dung video nếu không tuân theo mẫu.

Mã hoá dữ liệu nội dung đa phương tiện

Hình ảnh chính chứa thư mục siêu dữ liệu Phần tử vùng chứa XMP xác định thứ tự và thuộc tính của tệp nội dung nghe nhìn tiếp theo trong vùng chứa tệp. Mỗi tệp trong vùng chứa có một mục nội dung nghe nhìn tương ứng trong thư mục. Mục nội dung đa phương tiện mô tả vị trí trong vùng chứa tệp và các thuộc tính cơ bản của từng tệp đã nối.

Thuộc tính XMP

Hai bộ siêu dữ liệu XMP được dùng để xác định thông tin ngữ nghĩa bổ sung cho định dạng Ảnh chuyển động. Siêu dữ liệu có thể xuất hiện theo thứ tự bất kỳ.

Siêu dữ liệu của camera

Siêu dữ liệu của Máy ảnh mã hoá thông tin về cách hiển thị các phần hình ảnh chính và video của Ảnh chuyển động.

  • URI không gian tên là http://ns.google.com/photos/1.0/camera/
  • Tiền tố không gian tên mặc định là Camera

Các thuộc tính sau có thể xuất hiện trong siêu dữ liệu XMP của tệp hình ảnh tĩnh:

Tên

Loại

Nội dung mô tả

Camera:MicroVideo

Camera:MicroVideoVersion

Camera:MicroVideoOffset

Camera:MicroVideoPresentation
TimestampUs

Các thuộc tính này là một phần của thông số kỹ thuật Microvideo V1. Các tham số này sẽ bị xoá trong thông số kỹ thuật này và phải được bỏ qua nếu có.

Cụ thể, thuộc tính MicroVideoOffset được thay thế bằng giá trị GContainer:ItemLength để xác định vị trí của dữ liệu video trong tệp.

Camera:MotionPhoto

Integer

0: Cho biết rằng không nên coi tệp là Ảnh chuyển động.

1: Cho biết tệp sẽ được coi là Ảnh chuyển động.

Tất cả các giá trị khác đều không xác định và được xử lý tương đương với 0.

Nếu giá trị bằng 0 hoặc âm, thì tệp đó luôn được coi là Ảnh không chuyển động, ngay cả khi video thực sự được thêm vào tệp.

Vì XMP được hầu hết các trình chỉnh sửa hoạt động tốt chuyển sang, nên các tệp hình ảnh tĩnh có thể vẫn có giá trị còn lại là 1 cho trường này mặc dù video được thêm vào đã bị loại bỏ. Do đó, trường này không phải là trường chính thức và người đọc phải luôn xác nhận rằng có video hay không.

Camera:MotionPhotoVersion

Integer

Cho biết phiên bản định dạng tệp của Ảnh chuyển động. Thông số kỹ thuật này xác định phiên bản "1".

Camera:MotionPhotoPresentationTimestampUs

Long

Giá trị dài biểu thị dấu thời gian trình chiếu (tính bằng micrô giây) của khung hình video tương ứng với hình ảnh tĩnh. Giá trị có thể là -1 để biểu thị rằng chưa đặt/không được chỉ định.

Hành vi trình bày

Nếu Camera:MotionPhotoPresentationTimestampUs không có trong gói XMP, thì trình đọc nên sử dụng dấu thời gian trình bày ngay trước dấu thời gian gần nhất giữa bản video, tức là thời lượng của bản nhạc chia cho 2.

Nếu Camera:MotionPhotoPresentationTimestampUs có trong gói XMP và "application/motionphoto-image-meta" có trong video, thì cùng một giá trị phải xuất hiện trong trường primaryImageFrameScoreDescr presentationTimestampUs của kênh đó. Nếu Camera:MotionPhotoPresentationTimestampUs không có trong gói XMP và kênh siêu dữ liệu có mặt, thì giá trị trong kênh siêu dữ liệu phải là -1.

Phần tử vùng chứa

Phần tử vùng chứa được mã hoá thành siêu dữ liệu XMP của hình ảnh chính và xác định thư mục của các mục nội dung đa phương tiện trong vùng chứa. Các mục nội dung đa phương tiện phải được đặt trong tệp vùng chứa theo cùng thứ tự với các phần tử mục nội dung đa phương tiện trong thư mục này và phải được đóng gói chặt chẽ.

  • URI không gian tên là http://ns.google.com/photos/1.0/container/
  • Tiền tố không gian tên mặc định là Container

Thư mục này chỉ có thể chứa một mục hình ảnh chính và phải là mục đầu tiên trong thư mục.

Tên phần tử

Loại

Nội dung mô tả

Directory

Mảng cấu trúc theo thứ tự

Mảng cấu trúc Container:Item theo thứ tự xác định bố cục và nội dung của vùng chứa.

Phần tử mục

Phần tử mục nội dung đa phương tiện mô tả cách ứng dụng sử dụng từng mục.

  • URI không gian tên là http://ns.google.com/photos/1.0/container/item/
  • Tiền tố không gian tên mặc định là Item

Mục nội dung đa phương tiện đầu tiên phải là hình ảnh chính. Thuộc tính này phải chứa thuộc tính Mime chỉ định một trong các loại MIME hình ảnh được liệt kê trong phần Giá trị loại MIME của mặt hàng. Độ dài của mục chính có thể được xác định bằng cách phân tích cú pháp hình ảnh chính dựa trên loại MIME của hình ảnh đó bắt đầu từ đầu vùng chứa tệp.

Mục nội dung đa phương tiện đầu tiên có thể chứa thuộc tính Padding chỉ định khoảng đệm bổ sung giữa điểm cuối của hình ảnh chính được mã hoá và đầu mục nội dung đa phương tiện tiếp theo. Chỉ mục nội dung nghe nhìn đầu tiên mới có thể chứa thuộc tính Padding.

Mỗi mục nội dung đa phương tiện phải chứa thuộc tính Mime. Các mục nội dung nghe nhìn phụ cũng phải chứa thuộc tính Độ dài.

Các mục nội dung nghe nhìn tuần tự có thể chia sẻ dữ liệu tài nguyên trong vùng chứa tệp. Mục nội dung đa phương tiện đầu tiên xác định vị trí của tài nguyên trong vùng chứa tệp và các mục nội dung đa phương tiện chia sẻ tiếp theo phải đặt Length thành 0 trong trường hợp dữ liệu tài nguyên chính là vùng chứa.

Vị trí của tài nguyên mục nội dung đa phương tiện trong vùng chứa được xác định bằng cách cộng giá trị Length của các tài nguyên mục phụ trước đó với độ dài của bộ mã hoá hình ảnh chính cộng với Padding (nếu được chỉ định).

Tên thuộc tính

Loại

Nội dung mô tả

Mime

String

Bắt buộc. Chuỗi đơn giản cho biết loại MIME của mục nội dung đa phương tiện trong vùng chứa.

Semantic

String

Bắt buộc. Chuỗi đơn giản cho biết ý nghĩa cụ thể của mục nội dung đa phương tiện đối với ứng dụng. Hãy xem phần Giá trị ngữ nghĩa của mục để biết định nghĩa.

Length

Integer

Bắt buộc đối với các mục nội dung nghe nhìn phụ, bao gồm cả vùng chứa video. Độ dài số nguyên dương tính bằng byte của mặt hàng. Các mục nội dung đa phương tiện phải ở dạng ban đầu, không áp dụng phương thức mã hoá. Giá trị độ dài là độ dài thực tế của các byte trong tệp.

Độ dài 0 trong các mục nội dung đa phương tiện phụ cho biết tài nguyên mục nội dung đa phương tiện được chia sẻ với mục nội dung đa phương tiện trước. Mục nội dung đa phương tiện chính phải có độ dài là 0.

Padding

Integer

[Ảnh chuyển động dựa trên định dạng JPEG]

Không bắt buộc đối với mục nội dung nghe nhìn chính. Một chuỗi đơn giản chứa độ dài số nguyên dương tính bằng byte cho khoảng đệm bổ sung giữa điểm kết thúc của hình ảnh chính được mã hoá và điểm bắt đầu của mục nội dung đa phương tiện tiếp theo.

[Ảnh chuyển động dựa trên HEIC/AVIF]

Bắt buộc đối với mục nội dung nghe nhìn chính. Phải có giá trị bằng 8, độ dài tiêu đề của hộp Dữ liệu video ảnh chuyển động ("mpvd").

Item:Giá trị loại Mime

Thuộc tính Item:Mime xác định loại MIME của từng mục nội dung đa phương tiện.

Giá trị

Nội dung mô tả

image/jpeg

Hình ảnh JPEG

image/heic

Hình ảnh HEIC

image/avif

Hình ảnh AVIF

video/mp4

Vùng chứa MP4

video/quicktime

Vùng chứa MOV

Mục:Giá trị ngữ nghĩa

Thuộc tính Item:Semantic xác định ý nghĩa cụ thể về ứng dụng của từng mục nội dung đa phương tiện trong thư mục vùng chứa.

Value

Nội dung mô tả

Primary

Cho biết mục nội dung đa phương tiện là hình ảnh chính sẵn sàng để hiển thị trong vùng chứa. Ảnh chuyển động phải bao gồm một và chỉ một mục có ngữ nghĩa này.

MotionPhoto

Cho biết mục nội dung đa phương tiện là vùng chứa video. Ảnh chuyển động phải bao gồm một và chỉ một mục có ngữ nghĩa này. Vị trí của mục nội dung nghe nhìn này phải ở cuối tệp. Bạn không thể đặt byte khác sau khi các byte của mục nội dung đa phương tiện này đã kết thúc.

Ảnh chuyển động với hình ảnh Ultra HDR chính

Theo các quy tắc về giá trị ngữ nghĩa của mục được xác định trong thông số kỹ thuật này và trong thông số kỹ thuật hình ảnh Ultra HDR, ảnh động có hình ảnh Ultra HDR chính cũng phải bao gồm một mục nội dung đa phương tiện có ngữ nghĩa của mục là "GainMap". Ngoài ra, người ghi mã hoá ảnh chuyển động phải đặt phần tử mục bản đồ khu vực trước phần tử mục video.

Hành vi cụ thể của hình ảnh ISOBMFF

Ảnh chuyển động với hình ảnh dựa trên ISOBMFF (ví dụ: Hình ảnh HEIC và AVIF) phải có cấu trúc sao cho phần hình ảnh của tệp kết thúc bằng hộp "Dữ liệu video chuyển động" cấp cao nhất, được mô tả bằng ngữ nghĩa của Ngôn ngữ mô tả cú pháp được xác định trong điều 8 của 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[];
}

trong đó trường "data" chứa tất cả các byte video. Không được phép sử dụng giá trị đặc biệt "0" đối với kích thước Hộp dữ liệu video ảnh chuyển động. (Hãy tham khảo ISO/IEC 14496-12:2015: 4.2 để biết định nghĩa về kích thước của lớp mở rộng Box.)

XMP của hình ảnh ISOBMFF cũng phải xác định giá trị thuộc tính khoảng đệm của mục nội dung đa phương tiện chính là bằng với kích thước tính bằng byte của tiêu đề Hộp dữ liệu video ảnh chuyển động, tức là tiêu đề kích thước và tên.

Tham khảo Hình 1 minh hoạ cấu trúc hộp này để xem ảnh chụp mẫu chuyển động dựa trên HEIC:

Sơ đồ dạng đường minh hoạ cách sắp xếp các phần tử trong tệp chuyển động HEIC

Hình 1. Hình minh hoạ các hộp cấp cao nhất của hình ảnh HEIC mẫu trong một tệp ảnh chuyển động HEIC. Xin lưu ý rằng thứ tự của các hộp chủ yếu chỉ dùng để minh hoạ (vui lòng tham khảo các tiêu chuẩn liên quan về cách tạo HeIF hoặc tệp video); tuy nhiên, hộp "mpvd" phải đứng sau tất cả các ô của tệp hình ảnh HEIC.

Nội dung vùng chứa video

Tệp vùng chứa video được thêm vào hình ảnh chính phải bao gồm ít nhất một bản video chính. Bản nhạc này là bắt buộc và chứa video được mã hoá theo định dạng AVC, HEVC hoặc AV1. Độ phân giải của khung hình video chính chưa được xác định. Hệ màu của video, hàm truyền và độ sâu bit có thể thay đổi. Ví dụ: video SDR có thể có độ sâu 8 bit, hệ màu BT.709, với chức năng chuyển sRGB. Hoặc video HDR có thể có độ sâu bit 10 bit, hệ màu BT.2100, chức năng chuyển HLG hoặc PQ, cùng với siêu dữ liệu HDR và các bản nhạc siêu dữ liệu.

Tệp vùng chứa video có thể chứa một bản video phụ (không bắt buộc) có độ phân giải cao hơn. Độc giả nên sử dụng nội dung của thẻ để hiển thị hình ảnh thay thế cho hình ảnh tĩnh chính được mã hoá trong hình ảnh JPEG hoặc HEIC. Bản nhạc này có thể chứa video có tốc độ khung hình thấp hơn được mã hoá theo định dạng AVC, HEVC hoặc AV1. Độ phân giải khung hình video phụ không xác định.

Theo dự kiến, tất cả các khung hình trong bản video phụ đều có các khung hình tương ứng trong bản video chính. Mỗi cặp khung hình tương ứng trong kênh video chính và phụ phải có dấu thời gian trình bày giống nhau. Nếu có một khung hình phụ của kênh phụ mà không có khung bản nhạc chính tương ứng, thì người xem có thể thử chọn một khung kênh chính có dấu thời gian trình bày phù hợp nhất để làm hình thu nhỏ đại diện cho bản video phụ đó.

Tệp vùng chứa video có thể chứa một bản âm thanh nổi hoặc đơn âm 16 bit (không bắt buộc) ở tần số 44 kHz, 48 kHz hoặc 96 kHz được mã hoá theo AAC. Độc giả nên trình bày bản âm thanh này khi bản âm thanh chính hiển thị.

Bản video phụ (nếu có) phải luôn đứng sau bản video chính. Các kênh khác không có hạn chế nào khác về thứ tự. Bản video chính phải có chỉ mục của bản nhạc thấp hơn chỉ mục của bản video phụ bất kỳ. Tức là nếu bản video chính có số bản nhạc 2, thì mọi bản video phụ cũng phải có số bản nhạc lớn hơn hoặc bằng 3.

Theo dõi siêu dữ liệu video bằng tính năng chấm điểm bằng công nghệ trí tuệ nhân tạo

Người viết có thể tuỳ ý thêm một bản nhạc siêu dữ liệu vào tệp vùng chứa video thuộc loại "meta". Kênh siêu dữ liệu phải có đúng một mẫu chứa luồng byte ở định dạng được mô tả trong phần "Cú pháp".

Nếu có bản nhạc siêu dữ liệu, mục nhập bảng mô tả mẫu cho bản nhạc (tức là ô "stsd" tại "mdia.minf.stbl.stsd" so với hộp "trak") phải chứa một nguyên tử duy nhất cho biết mục nhập mẫu siêu dữ liệu văn bản - (tức là hộp "mett"). Hộp "mett" phải có chuỗi loại MIME bằng với "application/motionphoto-image-meta".

Cú pháp

Nếu kênh siêu dữ liệu này được xác định, thì nội dung của kênh phải bao gồm một luồng byte phù hợp với thông số kỹ thuật MotionPhotoMetadataDescriptor này, được mô tả ở đây bằng ngữ nghĩa của Ngôn ngữ mô tả cú pháp được xác định trong điều khoản 8 của 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