我有一个来自 GoPro 的 MP4,其中包含 gpstrack。现在我正尝试从该视频中提取带有地理标记的图像序列。为此,我目前使用 FFmpeg 和 exiftool;我愿意接受更好的解决方案。
我以前从未使用过 FFmpeg 或 exiftool,并且只是使用 powershell 的初学者,所以这是我从 GPT 提示自己的脚本:
$skriptFolder = Split-Path $MyInvocation.MyCommand.Path
$framerate = Read-Host "Enter framerate"
foreach ($video in (Get-ChildItem -Path $skriptFolder -Filter *.mp4)) {
$videoName = $video.BaseName
$outputFolder = Join-Path $skriptFolder $videoName
if (-not (Test-Path -Path $outputFolder)) {
New-Item -ItemType Directory -Path $outputFolder | Out-Null
}
ffmpeg -i $($video.FullName) -vf fps=$framerate $outputFolder\$videoName-%04d.png
exiftool -p C:\Windows\gpx.fmt -ee3 $video.FullName -w .gpx
exiftool -tagsfromfile $video.FullName -XMP:DateTimeOriginal<CreateDate $outputFolder
exiftool -geotag "$videoName.gpx" "-Geotime=XMP:DateTimeOriginal+=0:0:${filesequence;$_*=1/$framerate}" $outputFolder\*.png
}
Read-Host "Press enter to exit"
我可以成功创建图像和 GPX 文件。但随后我却无法匹配 GPS 数据和图像。我认为问题在于,它DateTimeOriginal
没有从原始视频文件中复制。此外,我不确定我是否正确实现了文件序列。
这是我仍然收到的错误消息:
警告:文件:Geotime(ValueConvInv)中的日期/时间无效(使用 YYYY:mm:dd HH:MM:SS[.ss][+/-HH:MM|Z])
答案1
我无法完全回答您的问题,但以下是与 exiftool 相关的问题。
RE:UTF16 输出。在 shell 重定向到文件期间,PowerShell 正在将 exiftool 的输出从 UTF8 更改为 UTF16。这通常是在重定向/管道二进制数据时出现的问题,因为它会完全损坏数据,但正如您所见,这也可能是文本数据的问题。请参阅此exiftool 论坛的帖子和这个帖子。
RE:DateTimeOriginal
第一个问题是DateTimeOriginal
提取的文件中不存在。所有文件都需要在命令前设置默认值-DateTimeOriginal+=0:0:$filesequence
。请参阅这个 Photo.StackExchange 问题。
此外,该命令正在增加 的默认位置DateTimeOriginal
,该位置将位于 EXIF 组中,例如EXIF:DateTimeOriginal
。但 Geotag 命令正在使用XMP:DateTimeOriginal
,这是一个类似的标签,但在 XMP 组中。对于您正在做的事情,您希望写入 XMP 组,而不是 EXIF 组。这需要更改
exiftool -DateTimeOriginal+=0:0:${filesequence;$_*=$framesteps} $outputFolder
进入
exiftool -XMP:DateTimeOriginal+=0:0:${filesequence;$_*=$framesteps} $outputFolder
之所以需要使用XMP:DateTimeOriginal
而不是,EXIF:DateTimeOriginal
是因为后者不包括亚秒,而亚秒是增加每帧时间所必需的。请参阅这个 StackOverflow 答案。
但在增加任何内容之前,必须有一个要增加的基本时间戳。这可能会很棘手,因为大多数视频时间戳都需要采用 UTC,但很多摄像机不知道当地时区,会写入当地时间。
运行此命令列出文件中的所有日期/时间标签
exiftool -time:all -G1 -a -s file.mp4
如果某个标签的 UTC 时间正确,则将以下命令中的“TAG”替换为该标签名称。请注意,此命令适用于 Windows CMD,而 PowerShell 的引号规则不同,因此您必须找出正确的引号
exiftool "-XMP:DateTimeOriginal<${TAG}+00:00" /path/to/files/
如果没有正确的 UTC 时间标签,则必须将该命令中的时区更改为+00:00
正确的时区。例如,美国东海岸将是
exiftool "-XMP:DateTimeOriginal<${TAG}-05:00" /path/to/files/