Come utilizzare lo script Bash per trovare i file .mov in modo ricorsivo e convertirli in .mp4 utilizzando ffmpeg


2

Sto lavorando su un sistema Mac in una società di video in cui devo ripulire un sacco di cartelle e sottocartelle contenenti file video intermedi di grandi dimensioni.

Quindi stavo cercando un modo per convertire in batch molti file .mov in file h.264 .mp4 usando ffmpeg. Ho trovato diversi codici per convertire un batch utilizzando uno script simile a

for f in '*.mov';
   do ffmpeg -i $f -c:v libx264 -f mp4 "${%f.mov}.mp4" ; 
done

Tuttavia questo funziona solo sulla cartella corrente in cui viene eseguito lo script, mentre sto cercando un modo per trovare i file .mov ricorsivamente e batch li converte tutti.

Al momento, la soluzione che funziona per me sente una piccola forza bruta; Sto solo usando find ed esegui ffmpeg;

 find . -name '*.mov' -type f -exec ffmpeg -i {} -c:v libx264 -f mp4 {}.mp4 

Tuttavia, uno dei problemi che sto avendo è che non riesco a sostituire il .mov per .mp4 in questa formattazione, quindi l'output aggiungerà .mp4 al file {}, con file che finiscono come * .mov .mp4

Oltre a questo, immagino che questo non sia il modo più sicuro o il modo migliore per rendere un batch.

Mi chiedevo se esiste un modo più sicuro o meno intenso di creare un batch per ffmpeg, che potrebbe anche risolvere il mio problema di denominazione, o un modo per fare in modo che il comando 'for f in * mov' trovi i video ricorsivamente fino a 5 + cartelle in profondità.

Qualsiasi aiuto sarebbe molto apprezzato.


Il tuo titolo è mal formulato. Questa non è una conversione ricorsiva. Vuoi una ricerca ricorsiva / trovare per aiutare con uno script di conversione batch.
jiggunjer

Puoi modificare liberamente i tuoi messaggi ma per la tua protezione, questo deve essere fatto con l'account utente originale. Sembra che tu abbia creato un secondo account, che interferirà anche con la tua capacità di commentare all'interno del thread e di accettare una risposta. Vedere Unisci i miei account per unire i tuoi account, che risolverà il problema.
fixer1234

Grazie per l'aiuto e la modifica aggiunta sul titolo. Stranamente, i due account sono stati entrambi creati con lo stesso indirizzo email, il che ha reso piuttosto confuso il motivo per cui erano separati, in primo luogo;)
JasonD

Risposte:


2

Ecco un semplice script di bash che farà ciò che vuoi (penso): 1) trova ricorsivamente tutti i file MOV e li converti, 2) sostituisce correttamente l'estensione del file .mov con un'estensione di file .mp4.

#!/bin/bash
while read mov; do
  mp4=$(echo "$mov"|sed -e 's|\.mov$|.mp4|i')
  if [ "$mov" == "$mp4" ]; then
    echo "Failed to generate unique MP4 filename for file $mov"
    exit 1
  fi
  echo ffmpeg -i "$mov" -c:v libx264 -f mp4 "$mp4"
done < <(find . -type f -iname '*.mov')

Come scritto, questo in realtà non farà la conversione, si limita a echeggiare il comando ffmpeg che verrà eseguito. Una volta che sei sicuro che farà ciò che vuoi, rimuovi semplicemente "echo" di fronte al comando ffmpeg.


Nota che su OS X devi sostituire il binario sed per farlo funzionare con il seguente comando: brew install gnu-sed --with-default-names
Josep Alsina

0

questo aiuta?

for i in `find . -name "*.mov" -print0| xargs -0`; do echo ffmpeg -i $i -c:v libx264 -f mp4 ${i%.mov}.mp4; done

rimuovere l'eco se si è soddisfatti del comando ffmpeg che viene generato.

questo tiene conto dei nomi di file contenenti uno o più spazi (tramite -print0 e xargs -0)


1
"questo aiuta?" Stai postando una risposta che non hai testato?
DavidPostill

in effetti, il commento è stato postato dopo aver testato "file find" e "replace mov con mp4", ma non ero sicuro della sintassi ffmpeg perché non usavo ffmpeg. inoltre, l'OP aveva un comando di ricerca migliore (usando -type f e -iname che ho omesso).
nagu
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.