Solución de una línea

Solución de una línea

Soy nuevo en FFmpeg y estoy tratando de resolver esto. encontré esto paraProcesamiento por lotesy esta respuesta pararotación de vídeopero necesito juntarlos.

¿Alguien podría explicar cómo crear un script para esta acción en Windows?

Respuesta1

Básicamente, solo necesita buscar los archivos (almacenarlos en una variable) y luego introducir esos archivos buscados en FFmpeg.

Por supuesto,El lenguaje Batch de Windows sería suficiente para eso.. Pero como no tengo ningún conocimiento sobre eso, aquí hay un script de PowerShell:

# Searching for files with the Get-ChildItem cmdlet and saving their relevant properties in an array:
# NOTE: -File will only work with PowerShell-versions >= 3.
[array]$FilesToRotate = Get-ChildItem -Path "C:\PATH_TO_FILES" ((-Filter *.mp4)) ((-Recurse)) -File | ForEach-Object {
    # NOTE: This part is a bit tricky - I just added it so I'm able to save the parent-path of each file in an object.
    # NOTE: One could also omit the whole ForEach-Object and use the Split-Path cmdlet inside the output-file's specification in FFmpeg's code.
    [PSCustomObject]@{
        InFullName = $_.FullName
        # Will put the output-file in the same folder as the input-file and add "_ROTATION" as suffix in its name.
        OutFullName = "$(Split-Path -Parent -Path $($_.FullName))\$($_.BaseName)_ROTATE$($_.Extension)"
    }
}

# Processing the files with FFmpeg using PowerShell's Start-Process cmdlet:
for($i=0; $i -lt $FilesToRotate.Length; $i++){
    Start-Process -FilePath "C:\PATH_TO_FFMPEG\ffmpeg.exe" -Argumentlist " -i `"$($FilesToRotate[$i].InFullName)`" -c copy -metadata:s:v:0 rotate=<x> `"$($FilesToRotate[$i].OutFullName )`" " ((-Wait)) ((-NoNewWindow))
}

Este script ejecutará FFmpeg con elcódigo que proporcionaste(No lo verifiqué, pero puedes reemplazarlo fácilmente de todos modos) y guarda el archivo resultante en la misma carpeta con el sufijo de nombre "_ROTATE", de modo que "MyMovie2017.mov" se convertirá en "MyMovie2017_ROTATE.mov". (Si desea renderizarlos en una carpeta completamente nueva, reemplácela $($FilesToRotate[$i].ParentPath)con la ruta que desee).

Notas: las cosas entre paréntesis dobles (( ))son opcionales:

  • -Filtersólo abordará (un) tipo específico de archivos, por ejemplo, *.mp4 sólo encontrará archivos MP4. Si tiene más de un tipo de archivo, pero muchos archivos no necesita convertir (como archivos de texto), puede convertir -Excludetodos los formatos que no desea convertir o -Includesolo aquellos que deben convertirse ( -Includees como -Filter: es más lento, pero puede incluir más de un formato).
  • -RecurseTambién buscará en las subcarpetas. También puedes usarlo -Depthcon PowerShell v 5+.
  • -Waitabrirá una instancia de ffmpeg a la vez; sin ella, todas las instancias se abrirán en paralelo.
  • -NoNewWindowmostrará el resultado de su instancia de ffmpeg en la consola PowerShell, mientras que sin ella, cada instancia de ffmpeg se abrirá en una nueva ventana de la consola. Tiene sentido sólo con -Wait.

Tendrás que eliminar todos los paréntesis duplicados (y su contenido si no lo deseas) antes de iniciar el script.

Además, es necesario adaptar estas cosas:

  • C:\PATH_TO_FILESRuta a tus archivos, obviamente.
  • C:\PATH_TO_FFMPEG\ffmpeg.exeRuta a su ffmpeg.exe, obviamente.
  • rotate=<x>- necesitas reemplazar el <x>con 90, 180o 270. (Como se explica en la fuente del código)

Si algo necesita más explicación, estaré encantado de poder ayudar.

Respuesta2

Solución de una línea

npx rotate-video --source=source_path --destination=destination_path --extension=MP4 --angel=270

Nota:FFMPEGPrimero necesitas instalar CLIinstalar

información relacionada