Откуда в файле AVI я могу извлечь записанную дату?

Проблема объяснила

Я пытаюсь извлечь записанную дату из некоторых файлов AVI (в данном конкретном случае, созданных с помощью видеокамеры Sony DV).

Начав без знания формата, я смог разобраться в метаданных в основных фрагментах файла, используя следующую ссылку: https://msdn.microsoft.com/en-us/library/windows/desktop/dd318189(v=vs.85).aspx

Я много искал, чтобы узнать, где хранится дата, но безуспешно. Самым близким, что я получил, был следующий ответ с форума MediaInfo, но мне не удалось найти в нем достаточного смысла для решения проблемы: https://sourceforge.net/p/mediainfo/discussion/297610/thread/8bb6e526/

Я знаю, что записанная дата находится где-то в метаданных файла, потому что Sony PlayMemories может отображать ее, как и MediaInfo.

Что мне нужно выяснить, так это детали того, как записанная дата хранится в файле:

  1. в каком куске
  2. по какому смещению
  3. в каком формате

Любая помощь по этому вопросу будет принята с благодарностью.:)

Я извлек список фрагментов в файле, который я тестирую (см. Листинг ниже), но я не уверен, в каком блоке хранится дата.

<RIFF - AVI  - size="11969600" offset="0">
  <LIST - hdrl - size="33330" offset="12">
    <avih size="56" offset="24"></avih>
    <LIST - strl - size="16500" offset="88">
      <strh size="56" offset="100"></strh>
      <strf size="40" offset="164"></strf>
      <indx size="16376" offset="212"></indx>
    </LIST>
    <LIST - strl - size="16478" offset="16596">
      <strh size="56" offset="16608"></strh>
      <strf size="18" offset="16672"></strf>
      <indx size="16376" offset="16698"></indx>
    </LIST>
    <LIST - odml - size="260" offset="33082">
      <dmlh size="248" offset="33094"></dmlh>
    </LIST>
  </LIST>
  <JUNK size="1446" offset="33350"></JUNK>
  <LIST - movi - size="11932228" offset="34804">
    <00db size="144000" offset="34816"></00db>
    <01wb size="5120" offset="178824"></01wb>
    ...            
    <00db size="144000" offset="11816560"></00db>
    <01wb size="5120" offset="11960568"></01wb>
    <ix00 size="664" offset="11965696"></ix00>
    <ix01 size="664" offset="11966368"></ix01>
  </LIST>
  <idx1 size="2560" offset="11967040"></idx1>
</RIFF>

Эвристический подход?

Я также думал, что, поскольку я знаю дату файла, на котором я тестирую, возможно, я каким-то образом смогу найти его в двоичном файле, чтобы определить местоположение байтов таким образом. Однако тогда мне сначала нужно было бы узнать (или предположить), в каком двоичном формате хранится дата. Для файла, на котором я тестирую, дата указывается как "2007-08-12 12:30:27.000" в MediaInfo (как в PlayMemories). Любые предложения о том, как искать дату в двоичном файле также будут оценены.

Дополнительная информация / результаты испытаний

Я обнаружил путем проверки, что дата не сохраняется в блоке JUNK, так как она полностью пуста (все нули).

Я также пытался искать дату в двоичном файле различными способами (используя шестнадцатеричный редактор HxD), но безуспешно:

  • Искал "2007" как целое число - только один случай в блоке movi - не должно быть (не изменилось)
  • Искал "2007" как число с плавающей точкой - никаких случаев
  • Искал "2007" как строку ascii - нет случаев
  • Поиск "2007" как шестнадцатеричной строки - только один случай в фрагменте movi - не должен быть этим (не имел никакого эффекта при изменении)
  • Поиск даты ("2007-08-12 12:30:27.000") в виде метки времени Unix ("1186921827") в виде целого числа и числа с плавающей запятой - не встречается

Чувство кишки

Я знаю, что это не в этом куске: JUNK

Я не ожидаю, что это будет в любом из этих кусков: hdrl, avih, strl, strh, strf

Если так, то это должно быть в одном из них: indx, odml, dmlh, (movi, idx1)

Текущее состояние

Я в основном не смог выяснить, как и где хранится дата, поэтому моя проблема остается нерешенной...

Тот факт, что мой бинарный поиск не дал результатов, немного озадачил меня...

Любая помощь будет высоко оценен.:)

2 ответа

Несколько лет спустя, но ... Привет,DVdate позволяет пакетно переименовывать файлы AVI с кодом даты и временным кодом.
https://paulglagla.com/en/dvdate-2/ Может быть, вам удастся получить от него помощь.

Под Linux вы можете попробовать avprobe которая является частью libav ( https://libav.org/download/). Посмотри на creation_time:

avprobe capture.mp4
avprobe version 9.18-6:9.18-0ubuntu0.14.04.1+fdkaac, Copyright (c) 2007-2014 the Libav developers
  built on Apr 10 2015 23:22:24 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'capture.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isom
    creation_time   : 2016-03-24 12:31:18
  Duration: 01:22:33.57, start: 0.000000, bitrate: 1957 kb/s
    Stream #0.0(eng): Video: h264 (Main), yuv420p, 960x540 [PAR 1:1 DAR 16:9], 1764 kb/s, 25 fps, 25 tbr, 25k tbn, 50 tbc
    Metadata:
      creation_time   : 2016-03-24 12:31:18
    Stream #0.1(deu): Audio: aac, 48000 Hz, stereo, fltp, 189 kb/s
    Metadata:
      creation_time   : 2016-03-24 12:31:18
# avprobe output
Другие вопросы по тегам