Python - 如何阅读Windows“Media Created”日期(不是文件创建日期)

时间:2015-07-19 23:31:48

标签: python windows media

我有几个旧的视频文件,我正在转换以节省空间。由于这些文件是个人视频,我希望新文件具有旧文件的创建时间。

Windows有一个名为“Media created”的属性,它具有摄像机记​​录的实际时间。文件的修改时间通常不正确,因此有数百个文件无法正常工作。

如何在Python中访问此“媒体创建”日期?我一直在谷歌搜索疯狂,无法找到它。以下是创建日期和修改日期匹配时的代码示例:

files = []
for file in glob.glob("*.AVI"):
   files.append(file)

for orig in files:
    origmtime = os.path.getmtime(orig)
    origatime = os.path.getatime(orig)
    mark = (origatime, origmtime)
    for target in glob.glob("*.mp4"):
       firstroot = target.split(".mp4")[0]
       if firstroot in orig:
          os.utime(target, mark)

2 个答案:

答案 0 :(得分:1)

如果您正在谈论的属性来自相机,那么它不是文件系统权限:它是视频内部的元数据,Windows正在读取并呈现给您。

此类元数据的一个示例是JPEG图像的EXIF数据:拍摄照片的相机类型,使用的设置等等。

您需要打开.mp4文件并解析元数据,最好使用一些现有的库来执行此操作。您将无法从文件系统获取信息,因为它不在那里。

另一方面,如果你想要的只是文件创建日期(实际上并不是来自相机,而是在文件首次放到当前计算机时设置的,并且可能已初始化为以前在相机上的一些价值)......可以通过os.path.getctime(orig)得到。

答案 1 :(得分:1)

正如Borealid所说,“媒体创建”值不是文件系统元数据。 Windows shell从文件本身获取此值作为元数据。它可以在API中作为Windows Property访问。如果您使用的是Windows Vista或更高版本并且安装了Python extensions for Windows,则可以轻松访问Windows shell属性。只需致电SHGetPropertyStoreFromParsingName,您就可以在propsys模块中找到它。它返回PyIPropertyStore个实例。标记为“媒体创建”的属性为System.Media.DateEncoded。您可以使用您在PKEY_Media_DateEncoded中找到的属性键propsys.pscon来访问此媒体资源。在Python 3中,返回的值是datetime.datetime子类,其时间以UTC为单位。在Python 2中,值是一个自定义时间类型,具有Format方法,提供strftime样式格式。如果您需要将值转换为本地时间,则pytz模块具有IANA时区数据库。

例如:

import pytz
import datetime
from win32com.propsys import propsys, pscon

properties = propsys.SHGetPropertyStoreFromParsingName(filepath)
dt = properties.GetValue(pscon.PKEY_Media_DateEncoded).GetValue()

if not isinstance(dt, datetime.datetime):
    # In Python 2, PyWin32 returns a custom time type instead of
    # using a datetime subclass. It has a Format method for strftime
    # style formatting, but let's just convert it to datetime:
    dt = datetime.datetime.fromtimestamp(int(dt))
    dt = dt.replace(tzinfo=pytz.timezone('UTC'))

dt_tokyo = dt.astimezone(pytz.timezone('Asia/Tokyo'))