Format zdjęcia ruchomego 1.0

Zdjęcia ruchome to pojedyncze pliki zawierające nieruchomy obraz i krótki film z nagraniem dźwiękowym. Ten rodzaj multimediów pozwala użytkownikowi zobaczyć nieruchomy obraz w wysokiej rozdzielczości, a także film i dźwięk, aby uchwycić nastrój i atmosferę, w której zrobiono zdjęcie.

Zależności

Oto odniesienia normatywne do tej specyfikacji:

Wprowadzenie

Atrybuty „MUST”, „MAST NOT”, „REQUIRED”, „SHOULD”, „NIE POWINNY”, „ZALECANE”, „MOŻE” i „OPCJONALNE” są zgodne ze standardem IETF zdefiniowanym w RFC2119.

Format zdjęcia ruchomego

Pliki ruchomych zdjęć składają się z głównego pliku obrazu, JPEG, HEIC lub AVIF, do którego dołączony jest dodatkowy plik wideo. Obraz główny zawiera metadane XMP kamery opisujące sposób wyświetlania pliku obrazu i zawartości pliku wideo oraz metadane kontenera XMP opisujące sposób zlokalizowania zawartości pliku wideo.

Plik obrazu może zawierać plik Gainmap, tak jak w przypadku plików JPEG Ultra HDR.

Wzorzec nazwy pliku

Zapisujący powinni używać nazwy pliku pasującej do następującego wyrażenia regularnego:

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

Jeśli nie będzie przestrzegać wzorca, czytelnicy mogą ignorować metadane XMP, dołączony plik wideo lub treść filmu.

Kodowanie danych multimedialnych

Obraz główny zawiera katalog metadanych Container Element XMP, który określa kolejność i właściwości kolejnego pliku multimedialnego w kontenerze pliku. Każdy plik w kontenerze ma w katalogu odpowiadający mu element multimedialny. Element multimedialny opisuje lokalizację w kontenerze plików i podstawowe właściwości każdego dołączonego pliku.

Atrybuty XMP

Do określenia dodatkowych informacji semantycznych dla formatu zdjęć ruchomych używane są 2 zestawy metadanych XMP. Metadane mogą być wyświetlane w dowolnej kolejności.

Metadane aparatu

Metadane aparatu kodują informacje o tym, jak prezentować główny obraz i fragmenty wideo ze zdjęcia ruchomego.

  • Identyfikator URI przestrzeni nazw to http://ns.google.com/photos/1.0/camera/
  • Domyślny prefiks przestrzeni nazw to Camera

Metadane XMP pliku nieruchomego mogą zawierać te atrybuty:

Nazwa

Typ

Opis

Camera:MicroVideo

Camera:MicroVideoVersion

Camera:MicroVideoOffset

Camera:MicroVideoPresentation
TimestampUs

Właściwości te były częścią specyfikacji Microvideo V1. Są one usuwane z tej specyfikacji i trzeba je zignorować.

W szczególności atrybut MicroVideoOffset jest zastępowany wartością GContainer:ItemLength, która pozwala znaleźć dane wideo w pliku.

Camera:MotionPhoto

Integer

0: wskazuje, że plik nie powinien być traktowany jako zdjęcie ruchome.

1: wskazuje, że plik powinien być traktowany jako zdjęcie ruchome.

Wszystkie inne wartości są nieokreślone i traktowane jako równoważne z 0.

Jeśli wartość wynosi 0 lub wartość ujemną, plik jest zawsze traktowany jako zdjęcie inne niż ruchome, nawet jeśli w rzeczywistości jest do niego dołączony film.

Ponieważ XMP jest przenoszony przez najlepszych edytorów, pliki nieruchomych obrazów mogą mieć w tym polu wartość rezydualną równą 1, mimo że dołączony film został usunięty. To pole nie jest więc ostateczne, a czytelnicy muszą zawsze potwierdzać obecność filmu.

Camera:MotionPhotoVersion

Integer

Wskazuje wersję formatu pliku zdjęcia ruchomego. Ta specyfikacja definiuje wersję „1”.

Camera:MotionPhotoPresentationTimestampUs

Long

Długa wartość reprezentująca sygnaturę czasową prezentacji (w mikrosekundach) klatki wideo odpowiadającej kadrowi z obrazu. Wartość może przyjmować wartość -1, co oznacza, że jest ona nieokreślona lub nieokreślona.

Sposób prezentacji

Jeśli w pakiecie XMP nie ma Camera:MotionPhotoPresentationTimestampUs, czytelnicy powinni użyć sygnatury czasowej prezentacji tuż przed sygnaturą czasową najbliżej środka ścieżki wideo, czyli czasu trwania ścieżki wideo podzielonej przez 2.

Jeśli tag Camera:MotionPhotoPresentationTimestampUs znajduje się w pakiecie XMP, a w filmie znajduje się tag "application/motionphoto-image-meta", ta sama wartość musi pojawić się w polu primaryImageFrameScoreDescr presentationTimestampUs tej ścieżki. Jeśli w pakiecie XMP nie ma Camera:MotionPhotoPresentationTimestampUs, a ścieżka metadanych jest dostępna, wartość w ścieżce metadanych musi wynosić -1.

Element kontenera

Element kontenera jest kodowany w metadanych XMP obrazu głównego i definiuje katalog elementów multimedialnych w kontenerze. Elementy multimedialne muszą znajdować się w pliku kontenera w tej samej kolejności co elementy multimedialne w katalogu i muszą być ciasno zapakowane.

  • Identyfikator URI przestrzeni nazw to http://ns.google.com/photos/1.0/container/
  • Domyślny prefiks przestrzeni nazw to Container

Katalog może zawierać tylko 1 główny element ze zdjęciem i musi to być pierwszy element w katalogu.

Nazwa elementu

Typ

Opis

Directory

Uporządkowana tablica struktur

Uporządkowana tablica struktur Container:Item definiujących układ i zawartość kontenera.

Element elementu

Elementy multimedialne opisują sposób korzystania z każdego elementu przez aplikację.

  • Identyfikator URI przestrzeni nazw to http://ns.google.com/photos/1.0/container/item/
  • Domyślny prefiks przestrzeni nazw to Item

Pierwszy element multimedialny musi być obrazem głównym. Musi zawierać atrybut Mime określający jeden z typów MIME obrazów wymienionych w sekcji Wartości typu MIME elementu. Długość głównego elementu można określić, analizując obraz główny na podstawie jego typu MIME, zaczynając od początku kontenera pliku.

Pierwszy element multimedialny może zawierać atrybut Padding określający dodatkowe dopełnienie między końcem zakodowanego obrazu głównego a początkiem następnego elementu multimedialnego. Tylko pierwszy element multimedialny może zawierać atrybut Padding.

Każdy element multimedialny musi zawierać atrybut Mime. Dodatkowe elementy multimedialne muszą też zawierać atrybuty długości.

Sekwencyjne elementy multimedialne mogą udostępniać dane zasobów w kontenerze plików. Pierwszy element multimedialny określa lokalizację zasobu w kontenerze pliku, a kolejne udostępniane elementy multimedialne mają wartość Length na 0 w przypadku, gdy dane zasobu są samym kontenerem.

Lokalizacja zasobów elementu multimedialnego w kontenerze jest określana przez zsumowanie wartości Length poprzednich zasobów elementu dodatkowego do długości kodowania obrazu głównego plus Padding, jeśli został określony.

Nazwa atrybutu

Typ

Opis

Mime

String

Wymagany. Prosty ciąg znaków wskazujący typ MIME elementu multimedialnego w kontenerze.

Semantic

String

Wymagany. Prosty ciąg znaków wskazujący znaczenie elementu multimedialnego specyficzne dla aplikacji. Definicję znajdziesz w sekcji Wartości semantyczne elementu.

Length

Integer

Wymagane w przypadku dodatkowych elementów multimedialnych, w tym kontenera wideo. Dodatnia liczba całkowita długości produktu w bajtach. Elementy multimedialne powinny być w pierwotnej postaci, bez kodowania. Wartość określająca długość to rzeczywista długość bajtów w pliku.

Długość 0 w dodatkowych elementach multimedialnych oznacza, że zasób elementu multimedialnego jest współużytkowany z poprzednim elementem multimedialnym. Długość głównego elementu multimedialnego powinna wynosić 0.

Padding

Integer

[Zdjęcia ruchome w formacie JPEG]

Opcjonalne w przypadku głównego elementu multimedialnego. Prosty ciąg znaków zawierający dodatnią liczbę całkowitą w bajtach i dodatkowe dopełnienie między końcem zakodowanego obrazu podstawowego a początkiem następnego elementu multimedialnego.

[Zdjęcia ruchome oparte na HEIC/AVIF]

Wymagane w przypadku głównego elementu multimedialnego. Musi mieć wartość równą 8 i długość nagłówka pola Dane filmu ze zdjęć ruchomych („mpvd”).

Element:Wartości typu MIME

Atrybut Item:Mime określa typ MIME każdego elementu multimedialnego.

Wartość

Opis

image/jpeg

Obraz JPEG

image/heic

Obraz HEIC

image/avif

Obraz AVIF

video/mp4

kontener MP4,

video/quicktime

kontener MOV

Element:wartości semantyczne

Atrybut Item:Semantic określa specyficzne dla aplikacji znaczenie każdego elementu multimedialnego w katalogu kontenera.

Value

Opis

Primary

Wskazuje, że element multimedialny jest głównym obrazem gotowym do wyświetlania w kontenerze. Zdjęcie ruchome może zawierać tylko 1 element z taką semantyką.

MotionPhoto

Wskazuje, że element multimedialny jest kontenerem wideo. Zdjęcie ruchome może zawierać tylko 1 element z taką semantyką. Lokalizacja tego elementu multimedialnego musi być na końcu pliku. Po zakończeniu bajtów tego elementu multimedialnego nie można umieścić żadnych innych bajtów.

zdjęcia ruchome z głównym obrazem ultra HDR

Zgodnie z regułami wartości semantycznych określonych w tej specyfikacji oraz w specyfikacji obrazów ultra HDR, zdjęcia ruchome z głównym obrazem ultra HDR muszą też zawierać element multimedialny o semantyce "GainMap". Twórcy kodujący zdjęcia ruchome muszą też umieścić element Gainmap przed elementem wideo.

Zachowanie charakterystyczne dla obrazu ISOBMFF

zdjęcia ruchome z obrazami opartymi na ISOBMFF (np. obrazy HEIC i AVIF) muszą mieć strukturę tak, aby część obrazu w pliku kończyła się polem „Dane filmu ruchomego” najwyższego poziomu, zgodnie z semantyką języka opisowego ujętego w normie ISO/IEC 14496-1:2010(E) klauzuli 8:

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

gdzie pole „data” zawiera wszystkie bajty wideo. Wartość specjalna „0” jest niedozwolona w przypadku pola danych filmu ze zdjęć ruchomych. Definicję rozmiaru klasy, która rozszerza pola Box, można znaleźć w artykule ISO/IEC 14496-12:2015: 4.2.

Wartość XMP obrazu ISOBMFF musi też zdefiniować wartość atrybutu dopełnienie głównego elementu multimedialnego jako rozmiar w bajtach nagłówka pola danych do pola danych ruchomych zdjęć, tj. rozmiar i nagłówki nazw.

Przykładowe zdjęcie ruchome oparte na HEIC znajdziesz na Rysunku 1, który przedstawia tę strukturę prostopadłościenną:

Schemat liniowy przedstawiający rozmieszczenie elementów w pliku ruchu HEIC

Rysunek 1. Ilustracja pól najwyższego poziomu przykładowego obrazu HEIC w pojedynczym pliku zdjęcia ruchomego HEIC. Pamiętaj, że kolejność pól służy głównie tylko do celów ilustracyjnych (zapoznaj się z odpowiednimi standardami tworzenia plików HEIF lub wideo). Pole „mpvd” musi jednak znajdować się po wszystkich polach w plikach graficznych HEIC.

Zawartość kontenera wideo

Kontener wideo dołączany do obrazu głównego musi zawierać co najmniej 1 główną ścieżkę wideo. Ta ścieżka jest wymagana i zawiera film zakodowany w AVC, HEVC lub AV1. Rozdzielczość głównej klatki wideo jest niezdefiniowana. Przestrzeń kolorów filmu, funkcja transferu i głębia bitowa mogą się różnić. Na przykład filmy SDR mogą mieć 8-bitową głębię kolorów, przestrzeń kolorów BT.709 i funkcję przesyłania sRGB. Filmy HDR mogą też mieć 10-bitową głębię, przestrzeń kolorów BT.2100, funkcję transferu HLG lub PQ, a także metadane HDR i ścieżki metadanych.

Plik kontenera wideo może zawierać jedną opcjonalną dodatkową ścieżkę wideo o wyższej rozdzielczości. Czytelnicy powinni używać zawartości pliku do wyświetlania zamienników obrazu głównego zakodowanego w formacie JPEG lub HEIC. Może ona zawierać film z niższą liczbą klatek zakodowany w formacie AVC, HEVC lub AV1. Rozdzielczość dodatkowej klatki filmu jest niezdefiniowana.

Można oczekiwać, że wszystkie klatki na dodatkowej ścieżce wideo mają odpowiadające im klatki na głównej ścieżce wideo. Każda para odpowiadających jej klatek na głównej i dodatkowej ścieżce wideo powinna mieć identyczne sygnatury czasowe prezentacji. Jeżeli pojawia się klatka ścieżki dodatkowej bez odpowiedniej głównej klatki ścieżki, jako reprezentatywną miniaturę dla dodatkowej ścieżki wideo widzowie mogą spróbować wybrać główną klatkę o ścieżce o najbardziej pasującej sygnaturze czasowej prezentacji.

Plik kontenera wideo może zawierać jedną opcjonalną 16-bitową ścieżkę dźwiękową mono lub stereo o częstotliwości 44, 48 lub 96 kHz zakodowaną w formacie AAC. Czytelnicy powinni prezentować tę ścieżkę audio podczas wyświetlania głównej ścieżki wideo.

Dodatkowa ścieżka wideo (jeśli występuje) powinna zawsze znajdować się po głównej ścieżce wideo. Nie ma żadnych innych ograniczeń dotyczących kolejności dotyczących innych ścieżek. Główna ścieżka wideo musi mieć niższy indeks ścieżki od jakiejkolwiek dodatkowej ścieżki wideo. Oznacza to, że jeśli główna ścieżka wideo ma numer 2, każda dodatkowa ścieżka wideo musi mieć numer 3 lub większy.

Ścieżka metadanych filmu za pomocą oceny przez Machine Intelligence

Zapisujący mogą opcjonalnie dodać do pliku kontenera wideo ścieżkę metadanych z typem „meta”. Ścieżka metadanych powinna mieć dokładnie 1 przykład zawierający strumień bajtów w formacie opisanym w sekcji „Składnia”.

Jeśli ścieżka metadanych jest obecna, przykładowy wpis w tabeli z opisem utworu (tzn. pole „stsd” znajdujące się w pozycji „mdia.minf.stbl.stsd” w odniesieniu do pola „trak”) musi zawierać pojedynczy atom wskazujący wprowadzenie próbki metadanych tekstowych (np. pole „mett”). Pole „mett” musi zawierać ciąg typu MIME równy „application/motionphoto-image-meta”.

Składnia

Jeśli ta ścieżka metadanych jest zdefiniowana, jej zawartość musi zawierać strumień bajtów zgodny z tą specyfikacją MotionPhotoMetadataDescriptor, opisaną tutaj z użyciem semantyki składniowego języka opisu zdefiniowanego w klauzuli 8 normy 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