
Tengo un MP4 de una GoPro con gpstrack incluido. Ahora estoy intentando extraer una secuencia de imágenes geoetiquetadas de ese video. Para eso actualmente estoy usando FFmpeg y exiftool; Estoy abierto a mejores soluciones.
Nunca antes había usado FFmpeg ni exiftool y solo soy un principiante en el uso de powershell, así que este es el script que solicité desde 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"
Puedo crear con éxito las imágenes y el archivo GPX. Pero luego me quedo atascado en hacer coincidir los datos del GPS y las imágenes. Creo que el problema es que DateTimeOriginal
no se copia del archivo de vídeo original. Además, no estoy seguro de haber implementado la secuencia de archivos correctamente.
Este es mi mensaje de error que todavía recibo:
Advertencia: Fecha/hora no válida (use AAAA:mm:dd HH:MM:SS[.ss][+/-HH:MM|Z]) en Archivo:Geotime (ValueConvInv)
Respuesta1
No puedo responder completamente a tu pregunta, pero aquí están los problemas relacionados con exiftool.
RE: Salida UTF16. PowerShell está cambiando la salida de exiftool de UTF8 a UTF16 durante la redirección del shell al archivo. Esto suele ser un problema al redirigir/canalizar datos binarios, ya que corromperá completamente los datos, pero como puede ver, también puede ser un problema con los datos de texto. Mira estopublicación del foro exiftoolyesta publicación.
RE: DateTimeOriginal
El primer problema es que DateTimeOriginal
no existe en los archivos extraídos. Todos los archivos deben configurarse con un valor predeterminado antes del -DateTimeOriginal+=0:0:$filesequence
comando. Veresta pregunta de Photo.StackExchange.
Además, el comando incrementa la ubicación predeterminada para DateTimeOriginal
, que estará en el grupo EXIF, por ejemplo EXIF:DateTimeOriginal
. Pero el comando Geotag usa XMP:DateTimeOriginal
, que es una etiqueta similar, pero en el grupo XMP. Y por lo que estás haciendo, quieres escribir en el grupo XMP, no en el grupo EXIF. Esto requiere cambiar
exiftool -DateTimeOriginal+=0:0:${filesequence;$_*=$framesteps} $outputFolder
en
exiftool -XMP:DateTimeOriginal+=0:0:${filesequence;$_*=$framesteps} $outputFolder
La razón por la que necesita usarlo XMP:DateTimeOriginal
y no EXIF:DateTimeOriginal
es porque este último no incluye los subsegundos, que son necesarios para incrementar el tiempo de cada cuadro. Veresta respuesta de StackOverflow.
Pero antes de poder incrementar algo, debe haber una marca de tiempo base para incrementar. Esto puede resultar complicado, ya que la mayoría de las marcas de tiempo de vídeo deben estar en UTC, pero muchas cámaras no conocen la zona horaria local y escribirán la hora local.
Ejecute este comando para enumerar todas las etiquetas de fecha/hora en el archivo
exiftool -time:all -G1 -a -s file.mp4
Si hay una etiqueta que tiene la hora correcta en UTC, reemplace "TAG" en el siguiente comando con ese nombre de etiqueta. Tenga en cuenta que este comando es para Windows CMD y las reglas de comillas son diferentes para PowerShell, por lo que tendrá que encontrar las comillas correctas.
exiftool "-XMP:DateTimeOriginal<${TAG}+00:00" /path/to/files/
Si no hay una etiqueta con la hora UTC correcta, entonces tendrá que cambiar la zona horaria en ese comando a +00:00
la correcta. Por ejemplo, la costa este de EE. UU. sería
exiftool "-XMP:DateTimeOriginal<${TAG}-05:00" /path/to/files/