Что скрывается при определении разрешения видеофайлов (например, файлов .mts или .mp4)? - PullRequest
0 голосов
/ 12 ноября 2018

Я хотел бы знать, как определяется разрешение файла фильма на самом низком уровне. Принимая во внимание такой файл как ввод, как инструменты командной строки lime mediainfo, ffprobe и т. Д. Определяют его разрешение? Он рассчитывается на лету или уже записан в метаданных самого файла фильма? Если последнее и метаданные не существуют, возможно ли рассчитать разрешение по самому файлу?

Мы можем сосредоточиться на файлах .mts и .mp4 в ответе.

1 Ответ

0 голосов
/ 13 ноября 2018

Хорошим источником информации для этого типа информации является спецификация формата QuickTime, поскольку MP4 в основном такой же, как и этот, и документ QuickTime хорошо составлен.

Вы можете видеть, что ширина и высота в пикселях дорожки включены в заголовок 'atom' в начале каждой дорожки:

enter image description here

Смотрите здесь для получения дополнительной информации: https://developer.apple.com/library/archive/documentation/QuickTime/QTFF/QTFFChap2/qtff2.html#//apple_ref/doc/uid/TP40000939-CH204-32963

Та же информация доступна, хотя и без тех же диаграмм, в спецификации ISO 14496-1 Media Format, которая является стандартизированной версией и основой mp4:

aligned(8) class TrackHeaderBox
   extends FullBox(‘tkhd’, version, flags){
   if (version==1) {
      unsigned int(64)  creation_time;
      unsigned int(64)  modification_time;
      unsigned int(32)  track_ID;
      const unsigned int(32)  reserved = 0;
      unsigned int(64)  duration;
   } else { // version==0
      unsigned int(32)  creation_time;
      unsigned int(32)  modification_time;
      unsigned int(32)  track_ID;
      const unsigned int(32)  reserved = 0;
      unsigned int(32)  duration;
   }
   const unsigned int(32)[2]  reserved = 0;
   template int(16) layer = 0;
   template int(16) alternate_group = 0;
   template int(16)  volume = {if track_is_audio 0x0100 else 0};
   const unsigned int(16)  reserved = 0;
   template int(32)[9]  matrix=
      { 0x00010000,0,0,0,0x00010000,0,0,0,0x40000000 };
      // unity matrix
   unsigned int(32) width;
   unsigned int(32) height;

Вы можете получить доступ к этой спецификации здесь (требуется щелчок для подтверждения лицензии): https://standards.iso.org/ittf/PubliclyAvailableStandards/c068960_ISO_IEC_14496-12_2015.zip

...