Format zdjęcia ruchomego 1.0

Zdjęcia ruchome to pojedyncze pliki zawierające nieruchomy obraz to krótki film, który obejmuje nagranie dźwiękowe. Tego typu media pozwala użytkownikom do oglądania zdjęć o wysokiej rozdzielczości, filmu i dźwięku w celu uchwycenia i atmosferę, w której wykonano zdjęcie.

Zależności

Oto odniesienia normatywne do tej specyfikacji:

Wprowadzenie

określenia „MUSI”, „NIE MOŻE”, „WYMAGANE”, „POWINNO”, „NIE POWINNO”, „ZALECANE”, „MOŻE” i „OPCJONALNE” jest zgodny ze standardem IETF zdefiniowane w dokumencie RFC2119.

Format zdjęcia ruchomego

Pliki ruchomych zdjęć składają się z głównego pliku obrazu, JPEG, HEIC lub AVIF z dodatkowy plik wideo. Główne zdjęcie zawiera XMP z aparatu metadane opisujące sposób wyświetlania nieruchomego obrazu i zawartości pliku wideo, i metadane XMP kontenera opisujące, jak znaleźć zawartość 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)

Czytelnicy mogą ignorować metadane XMP, dołączony plik wideo lub treści, jeśli nie jest zgodny z wzorcem.

Kodowanie danych multimedialnych

Obraz główny zawiera element kontenera XMP katalogu metadanych definiującego kolejność i właściwości kolejnych multimediów w kontenerze plików. Każdy plik w kontenerze ma przypisane nośniki elementu w katalogu. Element multimedialny opisuje lokalizację w pliku. kontenera i podstawowych właściwości każdego dołączonego pliku.

Atrybuty XMP

2 zestawy metadanych XMP służą do zdefiniowania dodatkowych informacji semantycznych dla w formacie zdjęć ruchomych. Metadane mogą być wyświetlane w dowolnej kolejności.

Metadane aparatu

Metadane aparatu kodują informacje o tym, jak prezentować zdjęcie główne fragmentów 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 zero lub jest ujemna, plik jest zawsze traktowany jako zdjęcia inne niż ruchome, nawet jeśli do pliku jest dołączony film.

Ponieważ XMP jest przenoszony przez najlepszych edytorów, pliki nieruchomych obrazów może 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 musi 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żywać sygnatury czasowej prezentacji tuż przed sygnaturą czasową najbliżej środka ścieżki wideo, tj.jej czasu trwania. podzielona przez 2.

Jeśli Camera:MotionPhotoPresentationTimestampUs znajduje się w pakiecie XMP i element "application/motionphoto-image-meta" występuje w filmie, ten sam wartość musi występować w primaryImageFrameScoreDescr presentationTimestampUs danego pola tej ścieżki. Jeśli Camera:MotionPhotoPresentationTimestampUs nie jest wartością w pakiecie XMP ze ścieżką metadanych, wartość w argumencie ścieżka metadanych musi mieć wartość -1.

Element kontenera

Element kontenera jest kodowany w metadanych XMP obrazu głównego i definiuje katalog elementów multimedialnych w kontenerze. Elementy multimedialne muszą być: znajdują się w pliku kontenera w tej samej kolejności co elementy elementu multimedialnego w 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ć pierwsze elementu w katalogu.

Nazwa elementu

Typ

Opis

Directory

Uporządkowana tablica struktur

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

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ć Mime atrybut określający jeden z typów MIME obrazów wymienionych w polu Typ MIME elementu Wartości. Długość głównego produktu można określić na podstawie analizy elementu podstawowego zgodnie z jej typem 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 obrazu następny element multimedialny. Tylko pierwszy element multimedialny może zawierać atrybut Padding.

Każdy element multimedialny musi zawierać atrybut Mime. Dodatkowe elementy multimedialne muszą zawierają również atrybuty Długość.

Sekwencyjne elementy multimedialne mogą udostępniać dane zasobów w kontenerze plików. pierwszy element multimedialny określa lokalizację zasobu w kontenerze pliku, i kolejne udostępnione elementy multimedialne mają parametr Length ustawiony na 0, w przypadku gdy dane zasobów same w sobie są kontenerem.

Lokalizacja zasobów elementu multimedialnego w kontenerze jest określana przez zsumowanie wartości Length poprzedzających dodatkowych zasobów produktu do długości kodowanie 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 tekstowy zawierający dodatnią liczbę całkowitą (w bajtach) dodatkowej dopełnienie między końcem zakodowanego obrazu głównego a początkiem obrazu następny element multimedialny.

[Zdjęcia ruchome oparte na HEIC/AVIF]

Wymagane w przypadku głównego elementu multimedialnego. Wartość musi wynosić 8, długość nagłówka zdjęcia ruchomego Dane wideo („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 znaczenie poszczególnych aplikacji element multimedialny 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 produktu zdefiniowanych w tej specyfikacji oraz specyfikacji obrazów ultra HDR, zdjęcia ruchome z głównym obrazem ultra HDR muszą też zawierać element multimedialny z semantyka elementu "GainMap". Twórcy kodujący zdjęcia ruchome muszą też umieścić w nadchodzącym elemencie wideo.

Zachowanie charakterystyczne dla obrazu ISOBMFF

Zdjęcia ruchome z Oparty na ISOBMFF obrazy (np. HEIC i AVIF) muszą mieć strukturę, która pozwala kończy się fragmentem pliku „Dane filmu ruchomego” najwyższego poziomu pudełko, jest opisana przy użyciu semantyki składniowej języka opisu zdefiniowanego w ISO/IEC 14496-1:2010(E), klauzula 8:

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

gdzie „dane” zawiera wszystkie bajty wideo. Wartość specjalna „0”. nie jest dozwolony w przypadku Pola danych wideo ze zdjęciami ruchomymi. (Zapoznaj się z ISO/IEC 14496-12:2015: 4.2 dla definicji rozmiaru klasy, która rozszerza możliwości usługi Box).

XMP obrazu ISOBMFF musi też określić dopełnienie podstawowego elementu multimedialnego wartość atrybutu jako równa rozmiarowi w bajtach filmu ze zdjęciem ruchomym Nagłówek pola danych zawierający nagłówki rozmiaru i nazwy.

Rysunek 1 ilustrujący tę strukturę ramową przedstawia przykładowy ruch oparty na HEIC zdjęcie:

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

Rysunek 1. Ilustracja pól najwyższego poziomu przykładowego obrazu HEIC w pojedynczy plik zdjęcia ruchomego HEIC. Pamiętaj, że kolejność pól dotyczy głównie jedynie ilustracja (zapoznaj się z odpowiednimi normami dotyczącymi tworzenia HEIF lub pliki wideo); mimo to plik „mpvd” pole musi znajdować się po wszystkich znakach HEIC obok plików graficznych.

Zawartość kontenera wideo

Plik kontenera wideo dołączany do obrazu głównego musi zawierać adres co najmniej jedną 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, przenoszenie i z głębią bitów. Na przykład filmy w formacie SDR mogą mieć 8-bitowy głębia, przestrzeń kolorów BT.709 i funkcja transferu sRGB. Natomiast filmy HDR mogą mają 10-bitową głębię kolorów, przestrzeń kolorów BT.2100 i transfer HLG lub PQ wraz z metadanymi HDR i ścieżkami metadanych.

Plik kontenera wideo może zawierać jeden opcjonalny dodatkowy plik dodatkowy o wyższej rozdzielczości ścieżki wideo. Czytelnicy powinni użyć jej zawartości, aby wyświetlić zamienniki główny nieruchomy obraz zakodowany w formacie JPEG lub HEIC. Ta ścieżka może zawierać wideo z niższą liczbą klatek zakodowane w formacie AVC, HEVC lub AV1. Dodatkowa klatka wideo rozdzielczość jest niezdefiniowana.

Wszystkie klatki na dodatkowej ścieżce wideo powinny mieć odpowiednich klatek na głównej ścieżce wideo. Każda para odpowiednich danych klatki w głównej i dodatkowej ścieżce wideo powinny mieć identyczną prezentację sygnatury czasowe. Gdy występuje ramka ścieżki dodatkowej, która nie ma odpowiadającej mu ramki głównej śledzenia ramki, widzowie mogą spróbować wybrać główną ramkę ścieżki o najbliższym pasującą sygnaturą czasową prezentacji jako reprezentatywną miniaturę dla tego filmu. drugorzędnej ścieżki wideo.

Plik kontenera wideo może zawierać jeden opcjonalny 16-bitowy dźwięk mono lub stereo. 44, 48 lub 96 kHz zakodowane w formacie AAC. Czytelnicy powinni przedstawić to gdy wyświetlana jest główna ścieżka wideo.

Dodatkowa ścieżka wideo (jeśli występuje) powinna zawsze pojawić się po głównej ścieżce. ścieżki 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 niż dowolna dodatkowa ścieżka wideo ścieżki wideo. Oznacza to, że jeśli główna ścieżka wideo ma numer 2, to dowolna dodatkowa ścieżka wideo musi mieć numer utworu większy lub równy 3.

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

Zapisujący mogą opcjonalnie dodać ścieżkę metadanych do pliku kontenera wideo ze tagiem wpisz „meta”. Ścieżka metadanych powinna zawierać dokładnie 1 próbkę zawierającą tag strumienia bajtów w formacie opisanym w sekcji „Składnia”.

Jeśli ścieżka metadanych jest dostępna, przykładowy wpis w tabeli opisu dla atrybutu track (np. pole „stsd” znajdujące się w lokalizacji „mdia.minf.stbl.stsd” względem parametru „trak” pola) musi zawierać pojedynczy atom, który wskazuje przykładowe metadane tekstowe entry - (np.pole „mett”). Parametr „mett” pole musi mieć ciąg typu MIME równy na „application/motionphoto-image-meta”.

Składnia

Jeśli ta ścieżka metadanych jest zdefiniowana, jej zawartość musi zawierać strumień bajtów zgodne z tą specyfikacją MotionPhotoMetadataDescriptor, opisane używając semantyki składniowej języka opisu zdefiniowanego w ISO/IEC 14496-1:2010(E) punkt 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