AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 989646
Accepted
JaSauders
JaSauders
Asked: 2017-12-27 08:40:44 +0800 CST2017-12-27 08:40:44 +0800 CST 2017-12-27 08:40:44 +0800 CST

使用 UTC 时间戳保存的 EXIF 工具和视频文件

  • 772

我很好奇是否有人可以就我当前遇到的问题给我一些见解。

在某些情况下,我和妻子有一部 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 小时,因为它们都在那个月的目录中。但是,我发现自己对此很感兴趣并想知道……为什么?

任何帮助或见解将不胜感激!

exif
  • 2 2 个回答
  • 4071 Views

2 个回答

  • Voted
  1. Best Answer
    StarGeek
    2017-12-27T09:08:52+08:002017-12-27T09:08:52+08:00

    根据 Phil Harvey(exiftool 的创建者)的说法,Quicktime 时间戳应该按照标准设置为 UTC 时间。但似乎很多相机不这样做,所以 exiftool 不假设时区并接受所写的时间。请参阅Quicktime 标签下的第四段

    Exiftool 包含一个选项来纠正这个问题。如果您正在运行 exiftool 9.40 版或更高版本,您可以添加-api QuickTimeUTC到命令中,它将假定时间戳正确写入为 UTC 并将它们转换为本地时间。

    • 3
  2. rosell-dk
    2021-08-28T00:15:12+08:002021-08-28T00:15:12+08:00

    我建议您创建一个新的“CreateDateLocal”标签,在其中将创建时间存储为本地时间。

    您可以通过 config.xml 执行此操作。在'Image::ExifTool::XMP::xmp'中,您添加:

    CreateDateLocal => { Groups => { 2 => 'Time' }, Shift => 'Time' },  # Stores the create date in local time (for videos)
    

    插入后它可能看起来像这样:

        # XMP tags may be added to existing namespaces:
        'Image::ExifTool::XMP::xmp' => {
            # Example 5.  XMP-xmp:NewXMPxmpTag
            NewXMPxmpTag => { Groups => { 2 => 'Author' } },
    
            # add more user-defined XMP-xmp tags here...
            CreateDateLocal => { Groups => { 2 => 'Time' } },  # Stores the create date in local time (for videos)
        },
    

    对于带有 UTC 的视频,运行以下命令:
    exiftool -r -ext mp4 -api QuickTimeUTC "-CreateDateLocal<CreateDate" .

    对于本地时间的视频,运行以下命令:
    exiftool -r -ext mp4 "-CreateDateLocal<CreateDate" .

    您也可以在图像上运行它,然后简单地使用“CreateDateLocal”而不是“CreateDate”进行组织。简单解决方案结束

    更高级的解决方案:

    当缺少 CreateDateLocal 时,您可以创建一个新的复合标记,该标记回退到 CreateDate。有了这个,您只需要使用 UTC 时间戳标记视频(即:它将使您免于标记所有图像,它还将使您免于标记具有本地时间戳的视频)。

    方法如下:

    "'Image::ExifTool::Composite'"在配置中搜索。在 {} 中,插入以下内容:

    # TheDateTaken is best attempt to get the date the photo was taken - preferrably in local time
    # First the custom tag "CreateDateLocal" is checked. This is expected to be set manually on all videos.
    # - For videos with UTC, run this: `exiftool -ext mp4 -api QuickTimeUTC "-CreateDateLocal<CreateDate" .`
    # - For videos in local time, run this: `exiftool -ext mp4 "-CreateDateLocal<CreateDate" .`
    # If CreateDateLocal isn't set, we asume it is an image. Images are always set in local time.
    # There are multiple tags used for storing creation time. We check them all (listed in Desire)
    
    CreateDateLocalWithFallback => {
        Desire => {
            0 => 'CreateDateLocal',
            1 => 'DateTimeOriginal',
            2 => 'CreationDate',
            3 => 'CreateDate',
        },
    
        Groups => { 2 => 'Time' },
        ValueConv => sub {
            $val = shift;
            # Loop through dates
            foreach $date (@$val) {
                next if not defined $date;
                return $date if ($date =~ /^[12]\d\d\d/);    # if it doesn't start with four digits, skip, as it is not a valid date            
            }               
            return undef;               
        },            
        Shift => 'Time',
        Validate => 'ValidateExifDate($val)',
        PrintConv => '$self->ConvertDateTime($val)',
    },
    

    通过从文件名中解析日期来扩展解决方案

    三星将创建日期存储在文件名中。它可以用作后备。这个复合标签可以提取日期(要在 CreateDateLocalWithFallback 中使用它,只需将“DateFromFilename”添加到“Desire”数组中)

    DateFromFilename => {
        Desire => {
            0 => 'OriginalFileName',
            1 => 'FileName',
        },
    
        Groups => { 2 => 'Time' },
        ValueConv => sub {
            $val = shift;
    
            foreach $filename (@$val) {
                # See if filename resembles date (it does on Samsung)
                # Samsung naming: "20150827_165859.jpg"
                if ($filename =~ /^\d{8}_\d{6}/) {
                    $year = substr($filename, 0, 4);
                    $month = substr($filename, 4, 2);
                    $day = substr($filename, 6, 2);
                    $hour = substr($filename, 9, 2);
                    $minute = substr($filename, 11, 2);
                    $second = substr($filename, 13, 2);
                    $y = int($year);
                    $mo = int($month);
                    $d = int($day);
                    $h = int($hour);
                    $mi = int($minute);
                    $s = int($second);
                
                    #return '2015:08:27 16:58:59';
                    #return @$val[0];
                    if (
                        (($y > 1900) && ($y < 2400)) &&
                        (($mo >= 1) && ($mo <= 12)) &&
                        (($d >= 1) && ($d <= 31)) &&
                        (($h >= 0) && ($h <= 24)) &&
                        (($mi >= 0) && ($mi <= 60)) &&
                        (($s >= 0) && ($s <= 60))
                    ) {
                        # '2015:08:27 16:58:59';
                        return $year . ':' . $month . ':' . $day . ' ' . $hour . ':' . $minute . ':' . $second; 
                    }
                }               
            }
            return undef;               
        },            
        Shift => 'Time',
        Validate => 'ValidateExifDate($val)',
        PrintConv => '$self->ConvertDateTime($val)',
        #PrintConvInv => '$self->InverseDateTime($val,0)',
    },
    
    • 0

相关问题

  • 如何将显示音频和照片 (EXIF) 元数据信息的列添加到 Nautilus 列表视图中

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve