我无法找到使用Python从视频文件中获取Exif属性"DateEncoded“的方法。
我尝试过几个exif工具,但这个特定的mp4文件 (使用安卓应用程序FilmicPro录制)似乎是一个特例。
Windows在"Create“属性(参见图像)下显示正确的日期,该属性实际上是QuickTime exif键"Media_DateEncoded”。
AdobeMediaEn编码器似乎还检索了正确的日期:
但是,我尝试过的五种方法都无法以编程方式检索正确的日期:2019年1月6日。它总是在一月七号回来!
有谁能解释原因吗?
以下是代码:
import os
import re
import struct
import subprocess as sub
from datetime import datetime
from hachoir.parser import createParser
from hachoir.metadata import extractMetadata
from win32com.propsys import propsys, pscon
# Download ExifTool from https://exiftool.org/
EXIF_TOOL = "exiftool.exe"
def method_1(fpath):
# On Windows ctime means "Creation time", on Linux "Changed time"
ctime = os.path.getctime(fpath)
dtime = datetime.fromtimestamp(ctime)
return dtime.strftime("%Y:%m:%d %H:%M:%S")
def method_2(fpath):
'''
This requires Hachoir installed. For Python3 run:
>> pip3 install hachoir==3.1.1
>> pip3 install hachoir-parser
The property key 'Creation date' is a filesystem metadata, but
it was the only one returned by Hachoir. What I really need is
the Quicktime key 'Media_DateEncoded', which Windows Explorer
calls "Media Created"
'''
parser = createParser(fpath)
with parser:
metadata = extractMetadata(parser)
exif_dict = metadata.exportDictionary()['Metadata']
return exif_dict['Creation date']
def method_3(fpath):
'''
This executes this shell comand:
>> exiftool.exe -h VID_20190106_162804.mp4
...which returns an HTML like string from stdout.
So using regular expression, we look for this section:
"Media Create Date</td><td>2019:01:07 00:28:08</td></tr>"
'''
p = sub.Popen(
[EXIF_TOOL, '-h',fpath],
stdout=sub.PIPE,
encoding='utf8')
res, err = p.communicate()
pattern = re.compile(
r'Media Create Date\</td\>\<td\>(\d{4}:\d{2}:\d{2}\s\d{2}:\d{2}:\d{2})'
)
match = re.findall(pattern, res)
if match:
return match[0]
def method_4(fpath):
'''
Here we look for the Quicktime property key: Media_DateEncoded, which
Windows Explorer calls "Media Created"
'''
fpath = fpath.replace('/', '\\') # Windows api does not work with posix paths
properties = propsys.SHGetPropertyStoreFromParsingName(fpath)
dtime = properties.GetValue(pscon.PKEY_Media_DateEncoded).GetValue()
return dtime.strftime("%Y:%m:%d %H:%M:%S")
def method_5(fpath):
ATOM_HEADER_SIZE = 8
# Difference between Unix epoch and QuickTime epoch, in seconds
EPOCH_ADJUSTER = 2082844800
# open file and search for moov item
f = open(fpath, "rb")
while 1:
atom_header = f.read(ATOM_HEADER_SIZE)
if atom_header[4:8] == b'moov':
break
atom_size = struct.unpack(">I", atom_header[0:4])[0]
f.seek(atom_size - 8, 1)
# found 'moov', look for 'mvhd' and timestamps
atom_header = f.read(ATOM_HEADER_SIZE)
if atom_header[4:8] == b'cmov':
raise Exception("moov atom is compressed")
elif atom_header[4:8] != b'mvhd':
raise Exception("expected to find 'mvhd' header")
else:
f.seek(4, 1)
creation_date = struct.unpack(">I", f.read(4))[0]
dtime = datetime.utcfromtimestamp(creation_date - EPOCH_ADJUSTER)
return dtime.strftime("%Y:%m:%d %H:%M:%S")Python3.7.3 (v3.7.3:ef4ec6ed12) MSC v.1916 64位(AMD64) on win32
操作系统: Windows 10版本10.0.18362构建18362
发布于 2020-01-12 16:20:47
您没有考虑的是,Quicktime元数据时间戳被保存为UTC,而不是本地时间。您需要根据时区调整存储时间。Windows理解这一点,并相应地显示校正时间,尽管并非所有程序都这样做。
使用exiftool提取时间戳时,可以添加选项,exiftool将自动调整计算机当前的时区。
https://stackoverflow.com/questions/59701813
复制相似问题