如何根据 Quicktime 视频文件的元数据自动设置其修改(或创建)时间?

如何根据 Quicktime 视频文件的元数据自动设置其修改(或创建)时间?

在 shell 中,如何使用单个命令(或单个命令行)根据文件中的元数据自动设置 Quicktime 视频文件的修改(或创建)日期和时间?对于 JPG 文件,我们有exiv2 -T,但是对于 .mov 文件有类似的命令吗?

举个例子,让我们从包含以下元数据的文件 video.mov 开始:

$ exiftool video.mov
ExifTool Version Number         : 12.57
File Name                       : video.mov
Directory                       : .
File Size                       : 64 MB
File Modification Date/Time     : 2023:07:04 02:53:05+02:00
File Access Date/Time           : 2023:07:01 11:42:46+02:00
File Inode Change Date/Time     : 2023:07:04 02:53:05+02:00
File Permissions                : -rw-r--r--
File Type                       : MOV
File Type Extension             : mov
MIME Type                       : video/quicktime
Major Brand                     : Apple QuickTime (.MOV/QT)
Minor Version                   : 0.0.0
Compatible Brands               : qt
Media Data Size                 : 64215615
Media Data Offset               : 36
Movie Header Version            : 0
Create Date                     : 2023:07:01 11:42:00
Modify Date                     : 2023:07:01 11:42:46
Time Scale                      : 600
Duration                        : 0:00:45
Preferred Rate                  : 1
Preferred Volume                : 100.00%
Preview Time                    : 0 s
Preview Duration                : 0 s
Poster Time                     : 0 s
Selection Time                  : 0 s
Selection Duration              : 0 s
Current Time                    : 0 s
Next Track ID                   : 6
Track Header Version            : 0
Track Create Date               : 2023:07:01 11:42:00
Track Modify Date               : 2023:07:01 11:42:46
Track ID                        : 1
Track Duration                  : 0:00:45
Track Layer                     : 0
Track Volume                    : 0.00%
Image Width                     : 1920
Image Height                    : 1080
Clean Aperture Dimensions       : 1920x1080
Production Aperture Dimensions  : 1920x1080
Encoded Pixels Dimensions       : 1920x1080
Graphics Mode                   : ditherCopy
Op Color                        : 32768 32768 32768
Compressor ID                   : hvc1
Source Image Width              : 1920
Source Image Height             : 1080
X Resolution                    : 72
Y Resolution                    : 72
Compressor Name                 : HEVC
Bit Depth                       : 24
Video Frame Rate                : 29.997
Balance                         : 0
Audio Format                    : mp4a
Audio Channels                  : 2
Audio Bits Per Sample           : 16
Audio Sample Rate               : 44100
Purchase File Format            : mp4a
Warning                         : [minor] The ExtractEmbedded option may find more tags in the media data
Matrix Structure                : 1 0 0 0 1 0 0 0 1
Content Describes               : Track 1
Media Header Version            : 0
Media Create Date               : 2023:07:01 11:42:00
Media Modify Date               : 2023:07:01 11:42:46
Media Time Scale                : 600
Media Duration                  : 0:00:45
Media Language Code             : und
Gen Media Version               : 0
Gen Flags                       : 0 0 0
Gen Graphics Mode               : ditherCopy
Gen Op Color                    : 32768 32768 32768
Gen Balance                     : 0
Handler Class                   : Data Handler
Handler Vendor ID               : Apple
Handler Description             : Core Media Data Handler
Meta Format                     : mebx
Handler Type                    : Metadata Tags
Make                            : Apple
Model                           : iPhone SE (2nd generation)
Software                        : 16.5.1
Creation Date                   : 2023:07:01 13:42:00+02:00
Image Size                      : 1920x1080
Megapixels                      : 2.1
Avg Bitrate                     : 11.3 Mbps
Rotation                        : 90

到目前为止,我自己能想到的最好的方法(设置修改日期)是阅读

$ exiftool video.mov | grep "Media Modify Date" | cut -f 19-20 -d ' '

,在我的例子中,

2023:07:01 11:42:46

(按照 UTC 或 GMT 标准化,这是正确的,因为在现实生活中,视频是在 13:42:… CEST 左右拍摄的),将:输出中的日期替换为-,最后发出

$ touch -d "2023-07-01 11:42:46 UTC" video.mov

(我的大胆猜测是,这句话UTC比上面说的更好GMT)。正如预期的那样,这会产生

$ ls --full-time video.mov | cut -d ' ' -f 6-8
2023-07-01 13:42:46.000000000 +0200

(机器位于 CEST 时区,因此+0200)。结果是我们想要的(因为视频本身拍摄的时区也是 CEST),但是到达那里的过程是手动的

如何处理第一个命令序列中的日期 ( exiftool … -d ' ')自动地,以便我们可以touch …在单个命令行或脚本中发出第一个命令和第二个命令 ( )?

或者,必须从视频文件中的元数据读取 .mov 视频文件的修改(或创建)时间,并以某种其他方式在操作系统级别进行设置。如何? (顺便说一句:因为某些文件的元数据字段Media Modify Date可能全为零,例如,由创建的文件ffmpeg,我们可能需要更多的编程逻辑,并尝试在这种情况下切换到其他一些字段的值,例如添加Date/Time OriginalMedia Duration是否正确填充。)

也许有人已经完成了这项任务,而我们只需要使用适当的参数运行一个已经可用的程序?

答案1

exiftool除了检索文件元数据之外,还可以设置大多数文件元数据,因此它应该只是以下问题:

TZ=UTC0 exiftool '-FileModifyDate<MediaModifyDate' ./*.mov

或者:

exiftool -api QuickTimeUTC '-FileModifyDate<MediaModifyDate' ./*.mov

或者递归地(也更新子目录中的文件):

exiftool -api QuickTimeUTC -r -ext mov '-FileModifyDate<MediaModifyDate' .

默认情况下,exiftool将 QuickTime MOV 文件中的媒体时间戳解释为本地时间,即使 QuickTime 规范规定它们应该采用 UTC(大多数相机都是这样做的)。使用TZ=UTC0,我们告诉它本地时间是 UTC(与 UTC 的偏移量为 0),使用-api QuickTimeUTC,我们告诉它这些时间应该被解释为 UTC,就像您的情况一样。两者应该达到相同的结果。

没有 的文件MediaModifyDate最终会带有1904-01-01 00:00:00 +0000时间戳(-2082844800 纪元时间),因为这是 QuickTime 时间戳的原始时间。

要跳过这些,您可以执行以下操作:

TZ=UTC0 exiftool -d %s -if '$MediaModifyDate != -2082844800' \
  -r -ext mov '-FileModifyDate<MediaModifyDate' .

(当与专门将时间格式化为Unix纪元时间时,使用TZ=UTC0代替-api QuickTimeUTC后者似乎不起作用-d %s,这看起来像一个错误。使用其他日期格式将取决于时区,因此我们无法与固定字符串进行比较像-2082844800)

如果你想用来touch设置 mtime,你可以这样做:

mtime=$(
  exiftool -api QuickTimeUTC -q -d %s -p '$MediaModifyDate' file.mov
) &&
  [ "$mtime" != '0000:00:00 00:00:00' ] &&
  touch -d "@$mtime" file.mov

(当只是在此处打印该数字时,使用-api QuickTimeUTC似乎确实可以正常工作-d %s。是的,当没有时,您确实得到了0000:00:00 00:00:00而不是。我想这将来可能会改变)。-2082844800MediaModifyDate

答案2

对于.mov当前文件夹中的所有文件:

#!/usr/bin/env bash
for file in *.mov;
do
    t=$(exiftool "$file" | grep "Media Modify Date" | cut -f 19-20 -d ' ')
    t="${t/:/-}"
    t="${t/:/-}"
    touch -d "$t UTC" "$file"
done

相关内容