Volendo creare uno script BASH che utilizza FFmpeg per convertire dei video contenuti in una apposita cartella ed elencati in apposito file di testo, ho scritto il codice
Codice: Seleziona tutto
#!/bin/bash
while read V1; do
V2="${V1%.*}"
E0="libx265"
C0='ffmpeg -i "'${V1}'" -c:a aac -c:v '${E0}' "'${V2}'_'${E0}'.mp4"'
echo $C0; eval $C0
done < lista.txt
exit 0 # Questo script funziona male.Allora ho messo a punto questa variante
Codice: Seleziona tutto
#!/bin/bash
echo '#!/bin/bash' > 000.txt
while read V1; do
V2="${V1%.*}"
E0="libx265"
C0='ffmpeg -i "'${V1}'" -c:a aac -c:v '${E0}' "'${V2}'_'${E0}'.mp4"'
echo $C0; echo $C0 >> 000.txt
done < lista.txt
chmod +x 000.txt
./000.txt
exit 0 # Questo script funziona perfettamente.Il problema è che, secondo me, il primo script doveva funzionare anche meglio, ma non è stato così.
Qualcuno è in grado di dirmi cos'ha che non va il primo script?
Ringrazio sin d'ora chi mi risponderà.
-*-*-
edit
ho provato anche lo script seguente:
Codice: Seleziona tutto
#!/bin/bash
while read V1; do
V2="${V1%.*}"
E0="libx265"
ffmpeg -i "${V1}" -c:a aac -c:v ${E0} "${V2}_${E0}.mp4"
done < lista.txt
exit 0 # Lo script termina qui.*-*-*
edit2: Risolto!
Il problema è che ffmpeg legge anche da stdin, il che interferisce col "while read". Per evitarlo, occorre chiudere lo stdin di ffmpeg, ad esempio con < /dev/null, oppure applicare un algoritmo che non contenga "while read".
Seguono alcuni esempi di script che funzionano:
Codice: Seleziona tutto
#!/bin/bash
convert_video() {
local input_file="$1"
local output_file="${input_file%.*}_libx265.mp4"
echo "Converting: $input_file -> $output_file"
ffmpeg -i "$input_file" -c:a aac -c:v libx265 "$output_file" < /dev/null
}
while IFS= read -r V1; do
[ -n "$V1" ] && convert_video "$V1"
done < lista.txtCodice: Seleziona tutto
#!/bin/bash
E0="libx265"
# Usa un ciclo for per leggere ogni riga
for V1 in $(cat lista.txt); do
V2="${V1%.*}"
echo "Converting $V1 to ${V2}_$E0.mp4"
ffmpeg -i "$V1" -c:a aac -c:v $E0 "${V2}_${E0}.mp4"
doneCodice: Seleziona tutto
#!/bin/bash
cat lista.txt | xargs -I {} bash -c 'input="$0"; output="${input%.*}_libx265.mp4"; echo "Converting: $input -> $output"; ffmpeg -i "$input" -c:a aac -c:v libx265 "$output"' {}