从AVI文件中的哪个位置可以提取录制日期?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从AVI文件中的哪个位置可以提取录制日期?相关的知识,希望对你有一定的参考价值。

The problem explained

我试图从一些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/

我知道记录的日期在某处的文件元数据中,因为索尼的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>

Heuristic approach?

我一直在想,既然我知道我正在测试的文件的日期,那么也许我可以在二进制文件中搜索它以找到那样的字节位置。但是,我首先需要知道(或猜测)存储日期的二进制格式。对于我正在测试的文件,日期报告为“2007-08-12 12:30:27.000”in MediaInfo(如在PlayMemories中)。关于如何在二进制文件中搜索日期的任何建议也将不胜感激。

Additional information / test results

我通过检查发现日期没有存储在JUNK块中,因为它完全是空白的(全为零)。

我还试图以各种方式在二进制文件中搜索日期(使用HxD十六进制编辑器),但没有运气:

  • 搜索“2007”作为整数 - 在电影块中只出现一次 - 不应该是它(修改后没有效果)
  • 搜索“2007”作为浮点 - 没有出现
  • 搜索“2007”作为ascii字符串 - 没有出现
  • 搜索“2007”作为十六进制字符串 - 在电影块中只出现一次 - 不应该是它(修改后没有效果)
  • 搜索日期(“2007-08-12 12:30:27.000”)作为整数和浮动的unix时间戳(“1186921827”) - 没有出现

Gut feeling

我知道它不在这个块中:JUNK

我不认为它是这些块中的任何一个:hdrl,avih,strl,strh,strf

如果是这样,那么它应该是以下之一:indx,odml,dmlh,(movi,idx1)

Current status

我基本上无法找出日期的存储方式和位置,所以我的问题仍未解决......

我的二元搜索没有给出任何结果的事实让我有点困惑......

任何帮助将受到高度赞赏。 :)

答案

在Linux下你可以尝试avprobe,它是libavhttps://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

以上是关于从AVI文件中的哪个位置可以提取录制日期?的主要内容,如果未能解决你的问题,请参考以下文章

屏幕录像专家“打开AVI文件失败”是啥原因???

从多个文件中随机提取视频帧

从正在写入的视频 .avi 文件中读取

以编程方式将 AVI 文件头添加到视频流

从应用程序录制的视频在 PHAsset 中的创建日期不正确

常用python日期日志获取内容循环的代码片段