Exiftool修改MP4 CreateDate后无法在文件资源管理器显示的问题
问题描述
我用Python调用Exiftool修改MP4元数据的CreateDate,核心代码如下:
cmd = [exiftool_path, "-overwrite_original","-CreateDate={}".format(new_date), directory_file_name]
修改后,通过Exiftool可验证CreateDate已成功修改,上传至亚马逊Photos也能识别该修改后的日期,但有时在Windows文件管理器的属性>详细信息标签页中无法看到更新后的日期。
请问为何会出现这种情况?如何让该日期在文件管理器中显示,或是否有其他可写入的标签能实现同步显示?
附相关代码
MP4日期修改函数
def modify_mp4_date(formatted_date_input,file_list_number): directory_file_name = file_directory + "/" + file_list[file_list_number] print("directory_file_name") print(directory_file_name) print("this is pic number") print(file_list_number+1) # 指定exiftool可执行文件路径 exiftool_path = r"C:\Windows\exiftool.exe" # 设置时间为05:00:00(对应原12am时区转换后) time = "05:00:00" new_date = formatted_date_input + " " + time print("MP4 Date") print(new_date) # 构造修改日期的命令 cmd = [exiftool_path, "-overwrite_original","-CreateDate={}".format(new_date), directory_file_name] # cmd = [exiftool_path, "-overwrite_original","-Quicktime:CreateDate={}".format(new_date), directory_file_name] # 调用exiftool执行修改 subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) print("Modified mp4 media create date YEEHAW!") # 验证修改结果 output = subprocess.check_output([exiftool_path, "-CreateDate", "-b", directory_file_name]) creation_date = output.decode().strip() print("Creation date from file") print(creation_date) # 检查修改是否成功 if new_date == creation_date: print("Successful Write") # 修改完成后可移动文件到其他文件夹 # shutil.move(src, dst) else: print("Write Failed") sys.exit("MP4 write failed")
用户输入处理函数
def take_user_input(): user_input = input("Enter Date Taken: ") input_string = str(user_input) print(input_string) # 用户输入格式:MM DD YYYY,转换为YYYY:MM:DD formatted_date = input_string[4:8] + ":" + input_string[:2] + ":" + input_string[2:4] # 如果用户输入格式为YYYY MM DD,启用下面的代码 # formatted_date = input_string[:4] + ":" + input_string[4:6] + ":" + input_string[6:8] print(formatted_date) return formatted_date
修改前后状态
- 修改前:文件管理器详细信息中的创建日期为原始未修改值
- 修改后:文件管理器详细信息中的创建日期未更新,仍显示旧值(但Exiftool和亚马逊Photos已识别新日期)
问题分析与解决办法
原因
- Windows文件管理器的字段映射逻辑:Windows读取MP4文件的日期时,并非直接读取Exiftool默认修改的
CreateDate,而是优先读取QuickTime/MP4格式规范中的MediaCreateDate、TrackCreateDate等字段,这些字段和CreateDate在元数据结构中属于不同的标签,仅修改CreateDate无法覆盖Windows读取的字段。 - Windows Shell缓存:即使修改了正确的字段,Windows资源管理器可能会缓存旧的元数据,导致显示未更新。
解决办法
1. 同时修改多个关联日期标签
修改Exiftool命令,同时写入多个Windows会读取的日期字段,确保覆盖所有可能的读取路径:
cmd = [ exiftool_path, "-overwrite_original", f"-CreateDate={new_date}", f"-MediaCreateDate={new_date}", f"-TrackCreateDate={new_date}", f"-DateTimeOriginal={new_date}", # 明确指定QuickTime命名空间的标签,避免歧义 f"-QuickTime:CreateDate={new_date}", f"-QuickTime:MediaCreateDate={new_date}", directory_file_name ]
2. 刷新Windows Shell缓存
修改完成后,可通过以下方式刷新资源管理器缓存:
- 重启Windows资源管理器:任务管理器中找到「Windows资源管理器」,右键选择「重新启动」
- 执行命令行:打开命令提示符,运行
ie4uinit.exe -show
3. 验证修改结果
修改后除了用Exiftool验证,还可以直接查看文件管理器的详细信息,或者用以下Exiftool命令查看所有日期相关字段,确认是否都已更新:
exiftool -time:all -s [你的MP4文件路径]
内容的提问来源于stack exchange,提问作者Eric Velez
相关产品推荐
相关产品推荐

