
У меня есть MP4 с GoPro с включенным 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
не копируется из исходного видеофайла. Также я не уверен, правильно ли я реализовал последовательность файлов.
Вот сообщение об ошибке, которое я все еще получаю:
Предупреждение: Неверная дата/время (используйте ГГГГ:мм:дд ЧЧ:ММ:СС[.сс][+/-ЧЧ:ММ|Z]) в Файл:Geotime (ValueConvInv)
решение1
Я не могу полностью ответить на ваш вопрос, но вот проблемы, связанные с exiftool.
RE: UTF16 output. 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
и not, 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/