Le foto in movimento sono singoli file che contengono un'immagine fotografica statica e un breve video che include la registrazione audio. Questo tipo di contenuti multimediali consente a un utente di visualizzare un fermo immagine ad alta risoluzione, nonché il video e l'audio per catturare l'atmosfera e l'atmosfera in cui è stata scattata l'immagine.
Dipendenze
Di seguito sono riportati i riferimenti normativi per questa specifica:
- Parole chiave da utilizzare nelle RFC per indicare i livelli dei requisiti
- T.81 (09/92) Compressione digitale e codifica di immagini fisse a tono continuo (JPEG)
- ISO/IEC 23008-12:2022 Codifica ad alta efficienza e distribuzione di contenuti multimediali in ambienti eterogenei Parte 12: Image File Format (HEIC)
- AV1 Image File Format (AVIF) (AVIF)
- Formato immagine Ultra HDR v1.0 | Sviluppatori Android (Ultra HDR)
- Specifiche XMP ISO 16684-1:2011(E) Parte 1 (XMP)
- Specifiche Adobe XMP - Parte 3 - Spazio di archiviazione nei file (XMP)
- Codifica di oggetti audiovisivi (ISO/IEC 14496-10:2022) Parte 10: codifica video avanzata (AVC)
- ISO/IEC 23008-2:2023 Codifica ad alta efficienza e distribuzione di contenuti multimediali in ambienti eterogenei Parte 2: Codifica video ad alta efficienza (HEVC)
- Specifiche AV1 Bitstream & Decoding Process (AV1)
- Codifica ISO/IEC 14496-1:2010 di oggetti audiovisivi - Sistemi
- Formato file multimediale ISO/IEC 14496-12:2015 ISO/IEC 14496-12:2015 (ISOBMFF)
- Codifica di oggetti audiovisivi ISO/IEC 14496-14:2020 Parte 14: formato file MP4 (MP4)
- Apple QuickTime File Format (MOV)
Introduzione
L'utilizzo degli attributi "MUST", "MUST NOT", "REQUIRED", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY" e "OPTIONAL" è conforme allo standard IETF definito in RFC2119.
Formato foto in movimento
I file di foto in movimento sono costituiti da un file immagine principale, JPEG, HEIC o AVIF, a cui è aggiunto un file video secondario. L'immagine principale contiene i metadati XMP della fotocamera che descrivono come visualizzare il file dell'immagine statica e i contenuti del file video, mentre i metadati del container XMP che descrivono come individuare i contenuti del file video.
Il file immagine potrebbe avere una mappa di guadagno, come nel caso dei file JPEG Ultra HDR.
Pattern nome file
Gli autori devono utilizzare un nome file corrispondente alla seguente espressione regolare:
^([^\\s\\/\\\\][^\\/\\\\]*MP)\\.(JPG|jpg|JPEG|jpeg|HEIC|heic|AVIF|avif)
I lettori possono ignorare i metadati XMP, il file video aggiunto o i contenuti del video se lo schema non viene seguito.
codifica dei dati multimediali
L'immagine principale contiene una directory di metadati XMP di elemento container che definisce l'ordine e le proprietà del file multimediale successivo nel contenitore di file. A ogni file del container corrisponde un elemento multimediale corrispondente nella directory. L'elemento multimediale descrive la posizione nel contenitore di file e le proprietà di base di ogni file concatenato.
Attributi XMP
Per definire le informazioni semantiche aggiuntive per il formato foto in movimento vengono utilizzate due serie di metadati XMP. I metadati possono essere visualizzati in qualsiasi ordine.
Metadati della videocamera
I metadati della fotocamera codificano le informazioni su come presentare l'immagine principale e le parti video della foto in movimento.
- L'URI dello spazio dei nomi è
http://ns.google.com/photos/1.0/camera/
- Il prefisso dello spazio dei nomi predefinito è
Camera
Nei metadati XMP del file immagine possono essere presenti i seguenti attributi:
Nome |
Tipo |
Descrizione |
|
Queste proprietà facevano parte della specifica Microvideo V1. Vengono eliminati in questa specifica e devono essere ignorati, se presenti. In particolare, l'attributo |
|
|
|
0: indica che il file non deve essere considerato come foto in movimento. 1: indica che il file deve essere trattato come una foto in movimento. Tutti gli altri valori non sono definiti e vengono trattati in modo equivalente a 0. Se il valore è zero o negativo, il file viene sempre considerato come una foto non in movimento, anche se in realtà viene aggiunto un video. Poiché l'XMP viene trasferito dalla maggior parte degli editor che si sono comportati bene, i file immagine statici potrebbero avere ancora un valore residuo pari a 1 per questo campo anche se il video aggiunto è stato rimosso. Questo campo, pertanto, non è definitivo e i lettori devono sempre confermare la presenza di un video. |
|
|
Indica la versione del formato file della foto in movimento. Questa specifica definisce la versione "1". |
|
|
Valore lungo che rappresenta il timestamp della presentazione (in microsecondi) del frame video corrispondente al fermo dell'immagine. Il valore può essere -1 per indicare un valore non impostato/non specificato. |
Comportamento della presentazione
Se Camera:MotionPhotoPresentationTimestampUs
non è presente nel pacchetto XMP,
i lettori devono utilizzare un timestamp di presentazione immediatamente precedente il timestamp
più vicino alla metà della traccia video, ovvero la durata della traccia video
divisa per 2.
Se Camera:MotionPhotoPresentationTimestampUs
è presente nel pacchetto XMP e
"application/motionphoto-image-meta"
è presente nel video, lo stesso
valore deve apparire nel campo presentationTimestampUs
primaryImageFrameScoreDescr
della traccia. Se Camera:MotionPhotoPresentationTimestampUs
non è presente nel pacchetto XMP ed è presente la traccia di metadati, il valore nella traccia di metadati deve essere -1.
Elemento contenitore
L'elemento container è codificato nei metadati XMP dell'immagine principale e definisce la directory degli elementi multimediali nel container. Gli elementi multimediali devono trovarsi nel file del contenitore nello stesso ordine degli elementi multimediali nella directory e devono essere compressi.
- L'URI dello spazio dei nomi è
http://ns.google.com/photos/1.0/container/
- Il prefisso dello spazio dei nomi predefinito è
Container
La directory può contenere un solo elemento dell'immagine principale e deve essere il primo elemento della directory.
Nome elemento |
Tipo |
Descrizione |
|
Array ordinato di strutture |
Array ordinato di strutture |
Elemento elemento
Gli elementi degli elementi multimediali descrivono come ogni elemento dovrebbe essere utilizzato dall'applicazione.
- L'URI dello spazio dei nomi è
http://ns.google.com/photos/1.0/container/item/
- Il prefisso dello spazio dei nomi predefinito è
Item
Il primo elemento multimediale deve essere l'immagine principale. Deve contenere un attributo Mime
che specifichi uno dei tipi MIME immagine elencati in Valori tipo MIME elemento. La lunghezza dell'elemento principale può essere determinata analizzando l'immagine principale in base al suo tipo MIME a partire dall'inizio del contenitore di file.
Il primo elemento multimediale può contenere un attributo Padding
che specifica una spaziatura interna aggiuntiva tra la fine dell'immagine principale codificata e l'inizio dell'elemento multimediale successivo. Solo il primo elemento multimediale può contenere un attributo Padding
.
Ogni elemento multimediale deve contenere un attributo Mime
. Anche gli elementi multimediali secondari
devono contenere attributi Length.
Gli elementi multimediali sequenziali possono condividere dati delle risorse all'interno del contenitore dei file. Il primo elemento multimediale determina la posizione della risorsa nel contenitore dei file, mentre gli elementi multimediali condivisi successivi hanno il valore Length
impostato su 0 nel caso in cui i dati della risorsa siano essi stessi un contenitore.
La posizione delle risorse dell'elemento multimediale nel container viene determinata sommando i valori Length
delle risorse dell'elemento secondario precedenti con la lunghezza della codifica dell'immagine principale più Padding
, se specificato.
Nome attributo |
Tipo |
Descrizione |
|
|
Obbligatorio. Stringa semplice che indica il tipo MIME dell'elemento multimediale nel contenitore. |
|
|
Obbligatorio. Stringa semplice che indica il significato specifico dell'applicazione dell'elemento multimediale. Consulta la sezione Valori semantici degli elementi per la definizione. |
|
|
Obbligatorio per gli elementi multimediali secondari, incluso il contenitore video. Il numero intero positivo in byte dell'articolo. Gli elementi multimediali devono essere nella loro forma originale, senza codifica. Il valore della lunghezza corrisponde alla lunghezza effettiva dei byte nel file. La lunghezza pari a 0 negli elementi multimediali secondari indica che la risorsa dell'elemento multimediale è condivisa con l'elemento multimediale precedente. La lunghezza dovrebbe essere pari a 0 in un elemento multimediale principale. |
|
|
[Foto in movimento basate su JPEG] Facoltativo per l'elemento multimediale principale. Stringa semplice contenente un numero intero positivo in byte di spaziatura interna aggiuntiva tra la fine dell'immagine principale codificata e l'inizio dell'elemento multimediale successivo. [Foto in movimento basate su HEIC/AVIF] Obbligatorio per l'elemento multimediale principale. Deve avere un valore uguale a 8, la lunghezza dell'intestazione della casella dei dati video delle foto in movimento ("mpvd"). |
Elemento:valori tipo MIME
L'attributo Item:Mime
definisce il tipo MIME di ogni elemento multimediale.
Valore |
Descrizione |
|
Immagine JPEG |
|
Immagine HEIC |
|
Immagine AVIF |
|
Contenitore MP4 |
|
Contenitore MOV |
Elemento:valori semantici
L'attributo Item:Semantic
definisce il significato specifico dell'applicazione di ogni
elemento multimediale nella directory del container.
|
Descrizione |
|
Indica che l'elemento multimediale è l'immagine display principale pronta nel contenitore. Una foto in movimento deve includere un solo elemento con questa semantica. |
|
Indica che l'elemento multimediale è il contenitore video. Una foto in movimento deve includere un solo elemento con questa semantica. Il percorso di questo elemento multimediale deve trovarsi alla fine del file. Non è possibile inserire altri byte dopo la terminazione dei byte di questo elemento multimediale. |
Foto in movimento con un'immagine Ultra HDR principale
In base alle regole per i valori semantici degli elementi definite in questa specifica e nella specifica delle immagini Ultra HDR, le foto in movimento con un'immagine Ultra HDR principale devono includere anche un elemento multimediale con la semantica dell'elemento "GainMap"
. Inoltre, gli scrittori che codificano le foto in movimento devono
posizionare l'elemento elemento guadagnomap prima dell'elemento video.
Comportamento specifico per immagine ISOBMFF
Foto in movimento con immagini basate su ISOBMFF (ad es. le immagini HEIC e AVIF) devono avere una struttura in modo che la porzione dell'immagine del file termini con una casella di primo livello "Dati video foto in movimento", descritta utilizzando la semantica del Syntactic Description Language definito nella clausola ISO/IEC 14496-1:2010(E) 8:
// Box as defined in ISO/IEC 14496-12:2015: 4.2
aligned(8) class MotionPhotoVideoData extends Box('mpvd') {
bit(8) data[];
}
in cui il campo "data" contiene tutti i byte video. Il valore speciale "0" non è consentito per le dimensioni della casella dati video foto in movimento. (Consulta ISO/IEC 14496-12:2015: 4.2 per la definizione di una dimensione di classe che estende Box.)
L'XMP dell'immagine ISOBMFF deve inoltre definire il valore dell'attributo Spaziatura interna dell'elemento multimediale principale in modo che corrisponda alle dimensioni in byte dell'intestazione della casella dati video foto in movimento, ovvero le intestazioni dimensioni e nome.
Fai riferimento alla Figura 1 che illustra la struttura di questa scatola per una foto di movimento basata su HEIC di esempio:
Figura 1. Illustrazione delle caselle di primo livello di un'immagine HEIC di esempio all'interno di un singolo file di foto in movimento HEIC. Tieni presente che l'ordine delle caselle è solo a scopo illustrativo (fai riferimento agli standard pertinenti per la creazione di file HEIF o video); tuttavia, la casella"mpvd" deve essere inserita dopo tutte le caselle del file immagine HEIC.
Contenuti del contenitore video
Il file del contenitore video aggiunto all'immagine principale deve includere almeno una traccia video principale. Questa traccia è obbligatoria e contiene video codificato in AVC, HEVC o AV1. La risoluzione del frame video principale non è definita. Lo spazio colore del video, la funzione di trasferimento e la profondità in bit possono variare. Ad esempio, i video SDR possono avere una profondità di 8 bit, spazio colore BT.709 e una funzione di trasferimento sRGB. In alternativa, i video HDR possono avere una profondità di 10 bit, uno spazio colore BT.2100 e una funzione di trasferimento HLG o PQ, oltre a metadati e tracce di metadati HDR.
Il file del contenitore video può contenere una traccia video secondaria con risoluzione più alta facoltativa. I lettori devono utilizzare i suoi contenuti per visualizzare le sostituzioni dell'immagine statica principale codificata nell'immagine JPEG o HEIC. Questa traccia può contenere video con frequenza fotogrammi inferiore codificati in AVC, HEVC o AV1. La risoluzione del fotogramma secondario non è definita.
È normale che tutti i fotogrammi nella traccia video secondaria abbiano fotogrammi corrispondenti nella traccia video principale. Ogni coppia di frame corrispondenti nelle tracce video principali e secondarie dovrebbe avere timestamp di presentazione identici. Se è presente un frame della traccia secondario senza un frame della traccia principale corrispondente, gli spettatori possono provare a selezionare un frame della traccia principale con il timestamp di presentazione più simile come miniatura rappresentativa della traccia video secondaria.
Il file del contenitore video può contenere una traccia audio facoltativa in formato mono o stereo a 16 bit a 44 kHz, 48 kHz o 96 kHz codificata in AAC. I lettori devono presentare questa traccia audio quando viene visualizzata la traccia video principale.
La traccia video secondaria, se presente, deve sempre essere dopo la traccia video principale. Non ci sono altri vincoli di ordinamento relativi ad altre tracce. La traccia video principale deve avere un indice delle tracce inferiore a quello di qualsiasi traccia video secondaria. In altre parole, se la traccia video principale ha una traccia numero 2, ogni traccia video secondaria dovrà avere un numero di traccia maggiore o uguale a 3.
Traccia dei metadati video con punteggio di Machine Intelligence
Gli autori possono aggiungere facoltativamente una traccia di metadati al file del contenitore video con un tipo "meta". La traccia di metadati deve avere esattamente un campione contenente uno stream di byte nel formato descritto in "Sintassi".
Se è presente la traccia di metadati, la voce della tabella di descrizione dell'esempio relativa alla traccia (ovvero la casella "stsd" situata in "mdia.minf.stbl.stsd" relativa alla casella "trak") deve contenere un singolo atomo che indica una voce di esempio di metadati di testo, ovvero una casella "mett". La casella "mett" deve avere una stringa di tipo MIME uguale a "application/motionphoto-image-meta".
Sintassi
Se viene definita questa traccia di metadati, i relativi contenuti devono essere costituiti da uno stream di byte conforme alla presente specifica MotionPhotoMetadataDescriptor
, descritta qui utilizzando la semantica del Syntactic Description Language definita nella clausola ISO/IEC 14496-1:2010(E) 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