PowerShell を使用してビデオをジオタグ付き画像に変換する

PowerShell を使用してビデオをジオタグ付き画像に変換する

私は、GPS トラックが組み込まれた GoPro の MP4 を持っています。現在、そのビデオからジオタグ付きの画像シーケンスを抽出しようとしています。そのために、現在 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 に関連する問題は次のとおりです。

UTF16 出力について。PowerShell は、ファイルへのシェル リダイレクト中に exiftool の出力を UTF8 から UTF16 に変更しています。これは通常、バイナリ データをリダイレクト/パイプするときに問題になります。データが完全に破損するためです。ただし、ご覧のとおり、テキスト データでも問題になることがあります。こちらを参照してください。exiftool フォーラムの投稿そしてこの郵便受け

RE:DateTimeOriginal最初の問題は、DateTimeOriginal抽出されたファイルに存在しないことです。-DateTimeOriginal+=0:0:$filesequenceコマンドの前にすべてのファイルにデフォルト値を設定する必要があります。このPhoto.StackExchangeの質問

さらに、コマンドは のデフォルトの場所を増分しますDateTimeOriginal。これは、EXIF グループ (例 ) 内にありますEXIF:DateTimeOriginal。しかし、Geotag コマンドは を使用しますXMP:DateTimeOriginal。これは同様のタグですが、XMP グループ内にあります。そして、あなたが行っていることのために、EXIF グループではなく、XMP グループに書き込みたいのです。これには変更が必要です。

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/

関連情報