使用 powershell 将视频转换为带有地理标记的图像

使用 powershell 将视频转换为带有地理标记的图像

我有一个来自 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/

相关内容