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

Ảnh chuyển động là các tệp đơn lẻ chứa một ảnh tĩnh và video ngắn, bao gồm cả bản ghi âm. Loại nội dung nghe nhìn này cho phép người dùng bạn có thể xem ảnh tĩnh có độ phân giải cao cũng như video và âm thanh để chụp lại tình cảm và bầu không khí nơi hình ả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" theo tiêu chuẩn IETF 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 tệp video phụ được thêm vào. Hình ảnh chính có Camera XMP siêu dữ liệu mô tả cách hiển thị tệp hình ảnh tĩnh và nội dung tệp video, và siêu dữ liệu Container 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 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 Phần tử vùng chứa XMP thư mục siêu dữ liệu xác định thứ tự và thuộc tính của phương tiện tiếp theo trong vùng chứa tệp. Mỗi tệp trong vùng chứa có một nội dung nghe nhìn tương ứng mục trong thư mục. Mục nội dung nghe nhìn mô tả vị trí trong tệp vùng chứa 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 camera mã hoá thông tin về cách hiển thị hình ảnh chính và các phần 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

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 xem 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 vẫn có thể có giá trị còn lại là 1 cho trường này mặc dù các giá trị đã bị gỡ bỏ. Do đó, đâ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.

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, độc giả nên sử dụng một dấu thời gian trình bày ngay trước dấu thời gian đó gần với phần giữa của bản nhạc video nhất, 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" xuất hiện trong video, giống như phải xuất hiện trong primaryImageFrameScoreDescr presentationTimestampUs của bản nhạc đó. Nếu Camera:MotionPhotoPresentationTimestampUs không phải là có trong gói XMP và kênh siêu dữ liệu có mặt, thì giá trị trong bản theo dõi 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. Mục nội dung đa phương tiện phải nằm 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 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 mục trong thư mục.

Tên phần tử

Loại

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. Tệp này phải chứa Mime chỉ định một trong các loại MIME hình ảnh được liệt kê trong Loại MIME của mặt hàng Giá trị. Độ 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 mục chính hình ảnh dựa trên loại MIME 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 giữa phần cuối của hình ảnh chính được mã hoá và phần đầu của hình ảnh chính mục nội dung nghe nhì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ụ phải cũng 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. Chiến lược phát hành đĩa đơn 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 được chia sẻ tiếp theo có Length được đặt thành 0 trong trường hợp dữ liệu tài nguyên chính là một 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 tính tổng các giá trị Length của các tài nguyên mục phụ phía trên đến độ dài của 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

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. Chuỗi đơn giản chứa độ dài số nguyên dương tính bằng byte khoảng đệm giữa phần cuối của hình ảnh chính được mã hoá và phần đầu của mục nội dung nghe nhì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, giá trị độ dài tiêu đề của Ảnh chuyển động Hộp Dữ liệu video ("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ị

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ể của từng ứng dụng mục nội dung đa phương tiện trong thư mục vùng chứa.

Value

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 quy tắc về giá trị ngữ nghĩa mặt hàng được xác định trong quy cách này và trong thông số kỹ thuật hình ảnh Ultra HDR, ảnh chuyển độ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 mục của "GainMap". Ngoài ra, người viết mã hoá ảnh chuyển động phải đặt phần tử mục bản đồ khuếch đại trước phần tử mục video.

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

Ảnh chuyển động đi kèm Dựa trên ISOBMFF hình ảnh (ví dụ: hình ảnh HEIC và AVIF) phải có cấu trúc sao cho hình ảnh phần tệp kết thúc bằng "Dữ liệu video chuyển động" ở cấp cao nhất hộp đượ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 khoản 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 đó "dữ liệu" chứa tất cả các byte video. Giá trị đặc biệt của "0" không được phép đối với kích thước của Hộp dữ liệu video ảnh chuyển động. (Tham khảo ISO/IEC 14496-12:2015: 4.2 về định nghĩa 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 Khoảng đệm của mục nội dung đa phương tiện chính bằng với kích thước tính bằng byte của Video ảnh chuyển động Tiêu đề Hộp dữ liệu, đó 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 đối với chuyển động dựa trên HEIC mẫu ảnh:

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. Lưu ý rằng thứ tự các hộp chủ yếu dành cho chỉ minh hoạ (vui lòng tham khảo các tiêu chuẩn có liên quan về cách xây dựng tệp HEIF hoặc video); Tuy nhiên, "mpvd" hộp phải đứng sau tất cả các thẻ HEIC hộp của tệp hình ảnh.

Nội dung vùng chứa video

Tệp vùng chứa video được nối vào hình ảnh chính phải bao gồm tại ít nhất một bản nhạc video chính. Bản nhạc này là bắt buộc và chứa video được mã hoá trong AVC, HEVC hoặc AV1. Chiến lược phát hành đĩa đơn độ phân giải khung hình video chính chưa xác định. Hệ màu của video, chuyển và độ sâu bit có thể thay đổi. Ví dụ: video SDR có thể có 8 bit chiều sâu, hệ màu BT.709, với chức năng truyền sRGB. Hoặc video HDR cũng có thể có độ sâu 10 bit, không gian màu BT.2100 và 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 tệp phụ (không bắt buộc) có độ phân giải cao hơn bản nhạc. Độc giả nên sử dụng nội dung của tài liệu để hiển thị các thay thế cho thuộc tính hình ảnh tĩnh chính được mã hoá theo 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. Khung video phụ độ phân giải không xác định.

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

Tệp vùng chứa video có thể chứa một âm thanh nổi hoặc đơn âm 16 bit tuỳ chọn theo dõi ở 44kHz, 48 kHz hoặc 96 kHz được mã hoá theo AAC. Độc giả phải trình bày nội dung này khi bản âm thanh chính được hiển thị.

Bản video phụ (nếu có) phải luôn sau bản nhạc chính bản nhạc. Các kênh khác không có hạn chế nào khác về thứ tự. Chiến lược phát hành đĩa đơn bản video chính phải có chỉ mục bản nhạc thấp hơn chỉ mục của bất kỳ bản nhạc phụ nào bản nhạc. Tức là, nếu bản video chính có số bản nhạc 2, thì bất kỳ bản video phụ 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 siêu dữ liệu vào tệp vùng chứa video bằng nhập "meta". Bản theo dõi siêu dữ liệu phải có chính xác một mẫu chứa luồng byte ở định dạng được mô tả trong "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 track (ví dụ: ô "stsd" tại "mdia.minf.stbl.stsd" so với "trak" hộp) phải chứa một nguyên tử duy nhất cho biết mẫu siêu dữ liệu văn bản mục nhập - (nghĩa là hộp "đã đo"). Lượt chuyển đổi hộp phải có chuỗi loại MIME bằng thành "application/motionphoto-image-meta".

Cú pháp

Nếu theo dõi siêu dữ liệu này được xác định, nội dung của nó phải bao gồm một luồng byte tuân theo thông số kỹ thuật MotionPhotoMetadataDescriptor này, được mô tả ở đây sử dụ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).

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