在 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 Original
和Media 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
而不是。我想这将来可能会改变)。-2082844800
MediaModifyDate
答案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