Come si fa a ruotare un'intera directory di video con ffmpeg?


3

Sono nuovo di FFmpeg e sto cercando di capirlo. Ho trovato questo per Elaborazione in lotti e questa risposta per rotazione del video ma ho bisogno di metterli insieme.

Qualcuno potrebbe spiegare come creare uno script per questa azione, su Windows?


4
Quale sistema operativo?
8bittree

Uso for comando con comando ffmpeg. Ma la sintassi di for il comando può variare in base al sistema operativo.
Biswapriyo

Ciao, grazie per le risposte. Per chiarire, sto cercando di farlo su Windows.
ThirteenthMonth

Risposte:


2

Fondamentalmente, hai solo bisogno di guardare i file, (memorizzarli in una variabile,) e poi dare da mangiare a quei file cercati in FFmpeg.

Ovviamente, Windows Batch-language sarebbe sufficiente per questo . Ma dal momento che ho zero competenze con questo, ecco uno script di 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))
}

Questo script eseguirà FFmpeg con il codice che hai fornito (Non l'ho verificato, ma è possibile sostituirlo facilmente in ogni caso) e salvare il file risultante nella stessa cartella con il suffisso "_ROTATE", quindi "MyMovie2017.mov" diventerà "MyMovie2017_ROTATE.mov". (Se vuoi renderli in una cartella completamente nuova, sostituisci $($FilesToRotate[$i].ParentPath) con il percorso che ti piace.)

Note: cose in parentesi doppie (( )) sono opzionali:

  • -Filter affronterà solo (uno) tipo specifico di file, ad es. * .mp4 troverà solo i file MP4. Se hai più di un tipo di file, ma molti file che non hai bisogno di convertire (come i file di testo), potresti farlo entrambi -Exclude tutti i formati che non vuoi convertire o -Include solo quelli che dovrebbero essere convertiti ( -Include è come -Filter - è più lento, ma può includere più di un formato.)
  • -Recurse esaminerà anche le sottocartelle. Puoi anche usare -Depth con PowerShell v 5+.
  • -Wait aprirà un'istanza ffmpeg alla volta - senza di essa, tutte le istanze verranno aperte parallelamente.
  • -NoNewWindow mostrerà l'output della tua istanza ffmpeg su PowerShell-Console, mentre senza di essa, ogni istanza di ffmpeg si aprirà in una nuova finestra della console. Ha senso solo con -Wait.

Dovrai eliminare tutte le parentesi doppie (e il loro contenuto se non lo vuoi) prima di iniziare lo script.

Inoltre, queste cose devono essere adattate:

  • C:\PATH_TO_FILES Percorso dei tuoi file, ovviamente.
  • C:\PATH_TO_FFMPEG\ffmpeg.exe Percorso del tuo ffmpeg.exe, ovviamente.
  • rotate=<x> - devi sostituire il <x> con entrambi 90, 180, o 270. (Come spiegato alla fonte del codice)

Se qualcosa ha bisogno di ulteriori spiegazioni, sono felice di aiutarti.


Grazie per l'aiuto! L'ho fatto funzionare dopo alcuni tentativi ed errori rimuovendo il testo "-File". Quindi sembrava questo ontop: [array] $ FilesToRotate = Get-ChildItem -Path "C: \ PATH_TO_FILES"
ThirteenthMonth

Potresti dirmi che cosa avrebbe dovuto fare il "-File"? L'ho appena cancellato dopo averlo disturbato e fatto funzionare.
ThirteenthMonth

-File impedirà Get-ChildItem dall'inserimento di cartelle nella variabile. Senza -File (E / o -Filter ), $FilesToRotate includerebbe anche sottocartelle, quindi PowerShell proverebbe a passare la sottocartella (o le sottocartelle) come file di input per FFmpeg. Si noti che stiamo parlando della cartella stessa; non stiamo parlando di ricerca ricorsiva qui. La documentazione di Get.-ChildItem può essere trovata qui.
flolilolilo

@ ThirteenthMonth potresti dirmi quale errore lancia? Quando ci provo con -File, funziona perfettamente. Inoltre, potresti dirmi la versione di PS che stai utilizzando? (Basta digitare $PSVersionTable nella console e premi invio - è il primo valore.) Grazie mille!
flolilolilo

1
Ah - in PowerShell & lt; versione 3, il -File -parametro non è stato incluso Se ti piacerebbe davvero usarlo, ti suggerirei di aggiornare l'installazione di PowerShell, anche se questo sarebbe un po 'eccessivo solo per convertire alcuni file. ;-) Ad ogni modo, ho aggiunto questa informazione alla sceneggiatura come commento.
flolilolilo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.