我很好奇是否有人可以就我当前遇到的问题给我一些见解。
在某些情况下,我和妻子有一部 Android 手机(Moto G5 Plus)。手机通过 SFTP 将 DCIM 文件夹中的所有项目同步到我的 Ubuntu 服务器。这些项目存储在“unsorted_pictures”目录中。每晚一次,一个 cron 作业运行,执行一个脚本,该脚本自动将 unsorted_pictures 中的内容复制到图片/年/月。稍后(在手机空间最大之后)我将清除 unsorted_pictures 目录作为维护步骤。
不管它值多少钱,该脚本如下:
#!/bin/bash
exiftool -overwrite_original_in_place -P -if 'not $CreateDate' '-CreateDate<FileModifyDate' -r /mnt/vault/unsorted_pictures/staging
exiftool -o . '-Directory<CreateDate' -d /mnt/vault/pictures/%Y/%m -r /mnt/vault/unsorted_pictures/staging
exit
所以基本上,第一行 exiftool 检查 CreateDate 是否存在。如果不是,它使用 FileModifyDate 创建 CreateDate 参数。这实际上只对通过环聊对话保存的图片有用,因为谷歌似乎删除了 exif 数据。(?!)之后,第二个 exiftool 行进行复制+排序。
这个过程有点令人惊奇,我对此感到非常满意。但是有一个问题-视频文件似乎是在UTC时间录制的,而图片似乎是在当地时间录制的。下面是一个拍摄的视频文件,立即传输到我的服务器,然后运行 exiftool 以检查所有时间戳。
administrator@vault:/mnt/vault/unsorted_pictures$ exiftool -time:all -s VID_20171225_214456599.mp4
FileModifyDate : 2017:12:25 21:47:02-05:00
FileAccessDate : 2017:12:25 21:47:00-05:00
FileInodeChangeDate : 2017:12:25 21:47:02-05:00
CreateDate : 2017:12:26 02:45:00
ModifyDate : 2017:12:26 02:45:00
TrackCreateDate : 2017:12:26 02:45:00
TrackModifyDate : 2017:12:26 02:45:00
MediaCreateDate : 2017:12:26 02:45:00
MediaModifyDate : 2017:12:26 02:45:00
administrator@vault:/mnt/vault/unsorted_pictures$ date
Mon Dec 25 21:47:23 EST 2017
如您所见,CreateDate 似乎设置为未来时间。在下面我运行了“日期”命令,这样你就可以看到发生这种情况的当前当地时间。在上面的行中,您可以看到以 05:00 结尾的时间戳,据我了解,这是与 UTC 的时差。
关于我的实际问题:
1) 我在摩托罗拉上尝试了多个相机应用程序,但它们都产生了完全相同的行为。这表明它不是特定于应用程序的设置。有没有办法防止我的视频以 UTC 格式录制?图片很好,就是视频。我觉得这有点奇怪,但在线搜索表明这很常见,但我还没有听到并理解为什么。
2) 我确信我可以在我的脚本中添加一些逻辑来简单地通过 CreateDate 对图片进行排序,并通过 FileModifyDate 对视频文件类型进行排序,或者甚至添加一些额外的参数来系统地将所有视频重新更新 5 小时。但我想知道,有没有办法让 exiftool 查看 mp4 文件并确认 UTC 时间差异?我知道视频文件是另一种野兽,exiftool 主要专注于图片,但即便如此,鉴于 exiftool 在承认这些视频的元数据方面做得如此出色,我认为可能有一种方法可以调整它以查看非UTC时间。或者,如果手机以 UTC 时间录制,则可能没有希望。/耸耸肩
也许这更有理由按年/月而不是年/月/日排序,因为我什至不会说视频被移动了 5 小时,因为它们都在那个月的目录中。但是,我发现自己对此很感兴趣并想知道……为什么?
任何帮助或见解将不胜感激!
根据 Phil Harvey(exiftool 的创建者)的说法,Quicktime 时间戳应该按照标准设置为 UTC 时间。但似乎很多相机不这样做,所以 exiftool 不假设时区并接受所写的时间。请参阅Quicktime 标签下的第四段
Exiftool 包含一个选项来纠正这个问题。如果您正在运行 exiftool 9.40 版或更高版本,您可以添加
-api QuickTimeUTC
到命令中,它将假定时间戳正确写入为 UTC 并将它们转换为本地时间。我建议您创建一个新的“CreateDateLocal”标签,在其中将创建时间存储为本地时间。
您可以通过 config.xml 执行此操作。在
'Image::ExifTool::XMP::xmp'
中,您添加:插入后它可能看起来像这样:
对于带有 UTC 的视频,运行以下命令:
exiftool -r -ext mp4 -api QuickTimeUTC "-CreateDateLocal<CreateDate" .
对于本地时间的视频,运行以下命令:
exiftool -r -ext mp4 "-CreateDateLocal<CreateDate" .
您也可以在图像上运行它,然后简单地使用“CreateDateLocal”而不是“CreateDate”进行组织。简单解决方案结束
更高级的解决方案:
当缺少 CreateDateLocal 时,您可以创建一个新的复合标记,该标记回退到 CreateDate。有了这个,您只需要使用 UTC 时间戳标记视频(即:它将使您免于标记所有图像,它还将使您免于标记具有本地时间戳的视频)。
方法如下:
"'Image::ExifTool::Composite'"
在配置中搜索。在 {} 中,插入以下内容:通过从文件名中解析日期来扩展解决方案
三星将创建日期存储在文件名中。它可以用作后备。这个复合标签可以提取日期(要在 CreateDateLocalWithFallback 中使用它,只需将“DateFromFilename”添加到“Desire”数组中)