
我有一個來自 GoPro 的 MP4,其中包含 GPS 軌跡。現在我試圖從該影片中提取地理標記的圖像序列。為此,我目前正在使用 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/