Il modo migliore per ruotare in batch oltre 3000 video h.264?


8

Ho circa 3000 brevi video clip, ciascuno della durata di circa 3 secondi. Devo ruotare ciascuno di 90 gradi. Qual è il modo migliore per farlo? Ho un abbonamento Adobe Creative Cloud, oltre all'accesso a macchine Windows e Mac. Alla ricerca della soluzione più semplice per automatizzare / elaborare in batch la rotazione di così tanti video.

Se te lo stavi chiedendo, i video fanno parte di un corso di e-learning sul legname. Lo studente visualizza ogni video selezionato casualmente, che è solo una breve clip di un pezzo di legname che ruota. I video sono stati girati in modo che il legname (2x4s, ecc.) Fosse orizzontale. Ma ora il cliente vuole che il legname sia verticale nelle clip.


Solo rotazione? Ad esempio da 1280x720 a 720x1280 giusto?
p2o

Solo rotazione di 90 gradi in senso orario (o contatore cw - non importa per questo progetto).
user172586

Il contenitore dei file video include metadati di "orientamento"?
audionuma,

Risposte:


9

Usa ffmpege il filtro "trasponi" come suggerito "scarso" . Ad esempio, se i tuoi file sono mp4 e si trovano nella directory corrente:

mkdir -p rotated
for f in *.mp4; do ffmpeg -i "$f" -vf transpose=2 -c:a copy -metadata:s:v rotate="" rotated/"$f"; done
  • Il valore di trasposizione può essere "1" o "clock" per la rotazione in senso orario, "2" o "cclock" per la rotazione in senso antiorario. Ci sono altri valori che applicheranno anche un capovolgimento.

  • L'audio verrà copiato in streaming per evitare la ricodifica non necessaria.

  • I metadati di rotazione del flusso video vengono cancellati in questo esempio. Altrimenti ffmpeglo copierà dall'input all'output risultando in una rotazione errata per i giocatori che prestano attenzione a questi metadati (alcuni lo fanno e altri no).

Un altro esempio, più dettagliato e flessibile, e che mantiene il file ruotato nella stessa directory con un nuovo nome:

ext=mp4
for f in /some/dir/*.$ext; do
    new=${f/%.$ext/-rotated.$ext};
    ffmpeg -i "$f" -vf transpose=2 -c:a copy -metadata:s:v rotate="" "$new"
done

Sì! Dovrei saperne di più sugli script di bash :)
p2o

1

Hai specificato che sei interessato a lavorare su un numero enorme di video, se hai una macchina multicore e utilizzerai un normale forciclo fornito dalla tua shell, avrai uno dei tuoi core che si surriscalda, mentre altri non fanno assolutamente nulla . Questo non è l' ideale.

Quello che dovresti fare per un simile lavoro sta usando parallel, uno strumento che ti consente di iniziare diversi lavori contemporaneamente e può fare tutto ciò che un for-loop può fare, ma meglio.

Non scriverò su tutte le funzionalità di questo strumento, ma mi concentrerò sul tuo compito specifico.

Un modo per iniziare tutti questi lavori sarebbe:

parallel avconv -i "{}" -vf transpose=2 "{.}[rotated].mp4" ::: *.mp4

In qui {}sostituisce ogni nome file e {.}sostituisce nome file senza estensione.

Suggerirò che inizierai tutti i lavori quanti ne hai i core, portane via uno. Il motivo è che il tuo sistema operativo rimarrà comunque utilizzabile, e anche questo ti salverà nel caso in cui stai usando la crittografia del disco rigido (che utilizzerà la potenza di elaborazione per leggere / scrivere i dati). Per fare ciò, aggiungi semplicemente --jobs -1alla tua riga di comando e limiterai il numero di lavori.

parallel --jobs -1 avconv -i "{}" -vf transpose=2 "{.}[rotated].mp4" ::: *.mp4

Tieni presente che non verrà fornito alcun output fino al completamento di ogni codifica. Quindi non vedrai solo la quantità di ognuno dei tuoi video.


1

Sulla base di questa risposta puoi usare ffmpeg con i seguenti comandi per ruotare un video:

ffmpeg -i input -vf transpose=2 output

Per elaborare in batch una cartella di film, è possibile utilizzare un linguaggio di programmazione a scelta e scorrere i file. Ho usato Linux con Python 2.7+ qui. Devi solo modificare il folder_moviespercorso path_to_ffmpege impostare il filmato extension:

import os # import os module
import subprocess # import subprocess module

# set the path to your video folder
folder_movies = '/home/user/Desktop/test/'

# set ffmpeg path
path_to_ffmpeg = "/opt/ffmpeg/ffmpeg"

# set file extension
ext = ".mp4"

# collect all videos in folder_movies
movie_files = [f for f in os.listdir(folder_movies) if f.endswith(ext)] 

# iterate through the files
for i in movie_files:

    # setup correct filepath for mov's
    file_path = os.path.join(folder_movies,i)

    # generate new file path
    new_path = os.path.splitext(file_path)[0] + '_rotated_90' + ext

    # call ffmpeg with the correct arguments
    # command: ffmpeg -i input -vf transpose=2 output
    subprocess.call([path_to_ffmpeg, "-i",  file_path, "-vf", "transpose=2", "-c:a", "copy", new_path])

Successivamente la cartella del film dovrebbe essere simile a:

inserisci qui la descrizione dell'immagine

Il vantaggio dell'utilizzo di python è che il codice viene eseguito su più piattaforme . L'unica cosa che devi considerare sono i percorsi della directory e l'eseguibile ffmpeg. Per eseguirlo su un computer Windows devi solo sostituire i percorsi con qualcosa del tipo:

# folder_movies = '/home/user/Desktop/test/' # linux or osx
folder_movies = r'c:\some\directory\test'    # windows, the r is important
folder_movies = 'c:/some/directory\test'     # windows (alternative)

# path_to_ffmpeg = '/opt/ffmpeg/ffmpeg'            # linux or osx
path_to_ffmpeg = r'c:\Program Files\ffmpeg\ffmpeg' # windows, the r is important
path_to_ffmpeg = 'c:/Program Files/ffmpeg\ffmpeg'  # windows (alternative)

Nota: non sono un esperto di ffmpeg, forse c'è un modo per elaborare in batch direttamente con esso.


1
Non hai davvero bisogno di un'intera sceneggiatura per questo. Può essere fatto direttamente sulla riga di comando di Mac o Linux con qualcosa del tipo: mkdir -p rotated; for f in *.mp4; do ffmpeg -i "$f" -vf transpose=2 rotated/"$f"; done(supponendo che i tuoi file video siano .mp4 in questo esempio).
marzo

@mivk bello, perché non convertire questo in una risposta?
p2o

@mivk Dato che stai usando un ciclo for è quasi lo stesso. Per coloro che non usano Linux o OSX, ha senso usare Python o un altro linguaggio di scripting.
p2o

@poor: beh, per quegli utenti che non sono né su Linux né su Mac, la traduzione in PowerShell è "lasciata come esercizio per il lettore" ... :-)
mivk

@mivk hehe, sì, ma nessuno vuole usarlo;)
p2o
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.