[Risolto] Script BASH con FFmpeg non funziona come dovrebbe.

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
Avatar utente
Sargonsei
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2659
Iscrizione: domenica 17 febbraio 2008, 13:56

[Risolto] Script BASH con FFmpeg non funziona come dovrebbe.

Messaggio da Sargonsei »

Salve a tutti.
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.
che, secondo me, doveva andare bene, ma agisce esclusivamente sul primo file multimediale della lista.

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.
che 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.
che, come il primo script, agisce esclusivamente sul primo file multimediale della lista. :muro:

*-*-*
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.txt
oppure

Codice: 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"
done
o anche

Codice: 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"' {}
Postare l'output di un comando significa inserire nel post: la riga in cui si digita il comando, tutto l'output, e la riga in cui il prompt ricompare.
Hardware e Sistema Operativo di Sargonsei: http://sargonsei.altervista.org/hardwar ... r-fisso-2/
Comandi da tenere a portata di mano: https://sargonsei.altervista.org/bash-03/
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 2 ospiti