[Risolto] conversione MP3 da terminale: lame

Installazione, configurazione e utilizzo di applicativi multimediali, masterizzazione, acquisizione e codec audio/video, streaming e altro.
Avatar utente
daemon_nio
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1012
Iscrizione: lunedì 15 gennaio 2007, 14:18
Sesso: Maschile
Località: London
Contatti:

[Risolto] conversione MP3 da terminale: lame

Messaggio da daemon_nio »

Buonasera a tutti,

avrei bisogno di un vostro aiutino.
Sto scrivendo uno script bash che recupera tutti i miei file .mp3 "grandi" e ne modifichi il bitrate. Ora però mi manca il cuore: come convertire il file tramite terminale?

Ho visto questo codice:

Codice: Seleziona tutto

lame -b 128 canzone.MP3 canzone.new.MP3
Il codice funziona ma ha un problemuccio:

I tag del file MP3 non vengono ricopiati sul nuovo file. Ho provato l'opzione --add-id3v2
ma non cambia nulla. Invece con le opzioni -tt, -ta e -tl (che aggiungono un titolo e un album) funziona, ma non va bene... infatti dovrei prima leggere i tag dal primo file e poi inserirli nel secondo complicando un comando che secondo me dovrebbe essere banale).

Come posso risolvere? conoscete qualche altro programma che converte simile a lame?
Ultima modifica di daemon_nio il sabato 17 maggio 2008, 11:50, modificato 1 volta in totale.
Sempre costruendo qualcosa di nuovo: Matag: The Game
creative

Re: conversione MP3 da terminale: lame

Messaggio da creative »

prova con ffmpeg

ffmpeg -i INPUT -ab 192k  -y  OUTPUT
non ho testato se vengono o meno mantenuti i tag
Avatar utente
daemon_nio
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1012
Iscrizione: lunedì 15 gennaio 2007, 14:18
Sesso: Maschile
Località: London
Contatti:

Re: conversione MP3 da terminale: lame

Messaggio da daemon_nio »

creative ha scritto: prova con ffmpeg

ffmpeg -i INPUT -ab 192k  -y  OUTPUT
non ho testato se vengono o meno mantenuti i tag
nada, anche ffmpeg cancella i tag mp3.
Ci ho rinunciato a fare cose semplici e sono arrivato ad una soluzione (quella detta su di leggere i tag e poi di riscriverli nel file  ::) )
Mi aspettavo fosse più difficile invece me la sono cavato con poco:

Codice: Seleziona tutto

#!/bin/bash

# questo script prende tutti i file .mp3 che si trovano nelle cartelle e
# li comprime.

echo -e "\nInizio dello script: valore 6500Kbyte"

# cerco tutti i file e li stampo sul file tmp con antecedente la dimensione in Kb
find . -type f -exec du {} \; > ~/tmp

# cancello tutte le righe la cui dimensione è minore di 6500, divido i campi con il carattere \t
# attenzione, per indicare \n ho indicato lo \ con il codice ascii \134
echo -e `awk -v FS="\t" '{if (int($1)>6500) printf "%s\134n",$2}' ~/tmp` > ~/tmp

echo "Elenco recuperato correttamente nel file '~/tmp'!"
numfile=`cat ~/tmp | wc -l`
let numfile--
echo "Ci sono $numfile files da comprimere."

i=0

# leggo tutti i file uno per uno (riga per riga)
# attenzione alle virgolette, se non ci sono ogni spazio significa un nuovo argomento.

cat ~/tmp | while read file;
  do
    # attenzione alle virgolette nella variabile $file
    if [ "-n" "$file" ]
    then
      let i++

      # leggo il bitrate del file e ne faccio un controllo, se non è maggiore di 128 è inutile ricodificarlo
      bitrate=`id3info "$file" | grep Bitrate | awk '{sub("KBps","",$2); print $2}'`
      #echo $bitrate
      if [ $bitrate -gt 128 ]
      then
        # recupero i tag del file .mp3 grazie allo script id3info e il bitrate
        title=`id3info "$file" | grep TIT2 | awk -F: '{sub(/[[:space:]]*/,"",$2); print $2}'`
        artist=`id3info "$file" | grep TPE1 | awk -F: '{sub(/[[:space:]]*/,"",$2); print $2}'`
        album=`id3info "$file" | grep TALB | awk -F: '{sub(/[[:space:]]*/,"",$2); print $2}'`
        year=`id3info "$file" | grep TYER | awk -F: '{sub(/[[:space:]]*/,"",$2); print $2}'`
        echo -e "\n File $i/$numfile"
        #echo "$file: $artist - $title : $album - $year ~${file#.}"

        # attenzione: devo creare il secondo file in una cartella temporanea (~/ va benissimo) e poi cancellarlo, amarok poi potrebbe fare una scansione della collezione durante l'encoding e quindi leggere meta' informazioni. (durata 1.41 etc...)
        # codice per comprimere il file mp3
        lame -b 128 --tt "$title" --ta "$artist" --tl "$album" --ty "$year" "$file" ~/tmp.MP3

        # sposto il file ~/tmp.MP3 e sovrascrivo il file vecchio
        mv ~/tmp.MP3 "$file"
        echo -e "\n File $file modificato correttamente\n"
      else
        echo -e "\n Il bitrate del file $file è già minore di $bitrate KBps.\n"
      fi
    fi
  done

rm ~/tmp
Se a qualcuno può servire questo codice va messo nella cartella "Musica" o comunque quella in cui sono presenti tutti i vostri file mp3 (funziona anche se i file si trovano all'interno di altre sottocartelle, per esempio NomeCantante/NomeAlbum). Vengono cercati tutti i file "grandi" (quindi si consiglia vivamente di non far girare lo script se ci sono altri file oltre a quelli mp3 se questi file superano i 6Mb di grandezza). Quindi si selezionano tutti i file mp3 che sono maggiori di 6.5Mb (numero scelto così ma si può pensare di generalizzare lo script) e si controlla il bitrate. Se il bitrate è maggiore di 128KBps si ricodifica il file con lame (senza perdere i vecchi tag o almeno i tag titolo, artista, album, e anno; gli altri andranno persi), e il nuovo file a 128KBps (più piccolo del vecchio, anche questo valore potrebbe essere parametrizzato) andrà a sovrascrivere il file esistente.

Che ne pensate dello script? Secondo voi può essere migliorato e di aiuto a qualcun altro o solo io sento l'esigenza di ridurre i file "grandi" mp3 in maniera semplice e pulita?
Ultima modifica di daemon_nio il martedì 6 maggio 2008, 23:12, modificato 1 volta in totale.
Sempre costruendo qualcosa di nuovo: Matag: The Game
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: conversione MP3 da terminale: lame

Messaggio da crap0101 »

bè, bravo!
stavo pensando, se unire al lavoro che fa già, quello di convertire i file in altro formato (oppure al contrario, magari ha più senso, tipo: ti rippi un cd e poi riduci la dimensione di quei file troppo grandi)
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Avatar utente
daemon_nio
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1012
Iscrizione: lunedì 15 gennaio 2007, 14:18
Sesso: Maschile
Località: London
Contatti:

Re: conversione MP3 da terminale: lame

Messaggio da daemon_nio »

crap0101 ha scritto: ti rippi un cd e poi...
Non saprei, in fondo io non rippo cd da un paio di anni (giusto da quando ho internet :o), e credo che non sono l'unico.

Non la vedo come una "forte esigenza", comunque io sono disponibile (a tempo perso) a scrivere qualche riga in più per migliorare se può essere di aiuto a qualcuno ;)
Ultima modifica di daemon_nio il mercoledì 7 maggio 2008, 23:08, modificato 1 volta in totale.
Sempre costruendo qualcosa di nuovo: Matag: The Game
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: conversione MP3 da terminale: lame

Messaggio da crap0101 »

no, infatti, non era una necessità  ;D , ma mi era venuta in mente
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Avatar utente
daemon_nio
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1012
Iscrizione: lunedì 15 gennaio 2007, 14:18
Sesso: Maschile
Località: London
Contatti:

Re: conversione MP3 da terminale: lame

Messaggio da daemon_nio »

Se a qualcuno interessa ho aggiunto un altro paio di funzionalità

Codice: Seleziona tutto

#!/bin/bash

# questo script prende tutti i file .mp3 che si trovano nelle cartella in cui si trova lo script e
# li comprime. (ovviamente comprime solo quelli maggiori di 6.5Mb e con bitrate maggiore di 128KBps)

# assegno al valore dim il valore del primo argomento (solo i primi numeri)
dim=`expr "$1" : '\([0-9]*\)'`

# stampo un manuale
if [ "$1" == "-h" -o  "$1" == "--help" ]
then
  echo -e "\n\t\tes. usage: riduci.sh 5000\n\n  Riduce tutti i file MP3 che si trovano in questa cartella\n  (anche in maniera ricorsiva) piu' grandi di 5Mb ad un bitrate di 128Kbps,\n  non modifica qulli che sono gia' a tale bitrate.\n  Tutti i tag MP3, le posizioni e i nomi dei files vengono mantenuti."
  echo -e "  Per modificare comunque tutti i file indipendentemente dal bitrate\n  inserire come ultimo parametro la parola 'always'."
  echo -e "  Se il comando viene lanciato da un'altra directory (es ~/DirDoveSiTrovaLEseguibile/riduci.sh)\n  si modificano tutti i file che si trovano in quella directory.\n"
  exit
fi

if [ -z `expr "$1" : '\([0-9]*\)'` ]
then
  echo "utilizzo il valore di default 6500"
  dim=6500
fi

always=0
if [ "$1" == "always" -o "$2" == "always" -o "$3" == "always" ]
then
  always=1
  echo "modifico comunque tutti i files indipendentemente dal bitrate"
fi

echo -e "\nInizio dello script: valore $dim Kbyte"

# cerco tutti i file e li stampo sul file tmp con antecedente la dimensione in Kb
find . -type f -exec du {} \; > ~/tmp

# cancello tutte le righe la cui dimensione è minore di 6500, divido i campi con il carattere \t
# attenzione, per indicare \n ho indicato lo \ con il codice ascii \134
#echo -e `awk -v FS="\t" '{if (int($1)>6500) printf "%s\134n",$2}' ~/tmp` > ~/tmp
# devo eseguire la riga di codice che c'è su ma al posto di 6500 devo mettere il valore $dim
inizio="echo -e \`awk -v FS=\"\\t\" '{if (int(\$1)>"
fine=") printf \"%s\134n\",\$2}' ~/tmp\` > ~/tmp"
eval $inizio$dim$fine

echo "Elenco recuperato correttamente nel file '~/tmp'!"
numfile=`cat ~/tmp | wc -l`
let numfile--
echo "Ci sono $numfile files da comprimere."

i=0

# leggo tutti i file uno per uno (riga per riga)
# attenzione alle virgolette, se non ci sono ogni spazio significa un nuovo argomento.

cat ~/tmp | while read file;
  do
    # attenzione alle virgolette nella variabile $file
    if [ "-n" "$file" ]
    then
      let i++

      # leggo il bitrate del file e ne faccio un controllo, se non è maggiore di 128 è inutile ricodificarlo
      bitrate=`id3info "$file" | grep Bitrate | awk '{sub("KBps","",$2); print $2}'`
      #echo $bitrate
      if [ $bitrate -gt 128 -o $always ]
      then
        # recupero i tag del file .mp3 grazie allo script id3info e il bitrate
        title=`id3info "$file" | grep TIT2 | awk -F: '{sub(/[[:space:]]*/,"",$2); print $2}'`
        artist=`id3info "$file" | grep TPE1 | awk -F: '{sub(/[[:space:]]*/,"",$2); print $2}'`
        album=`id3info "$file" | grep TALB | awk -F: '{sub(/[[:space:]]*/,"",$2); print $2}'`
        year=`id3info "$file" | grep TYER | awk -F: '{sub(/[[:space:]]*/,"",$2); print $2}'`
        echo -e "\n File $i/$numfile"
        #echo "$file: $artist - $title : $album - $year ~${file#.}"

        # attenzione: devo creare il secondo file in una cartella temporanea (~/ va benissimo) e poi cancellarlo, amarok poi potrebbe fare una scansione della collezione durante l'encoding e quindi leggere meta' informazioni. (durata 1.41 etc...)
        # codice per comprimere il file mp3
        lame -b 128 --tt "$title" --ta "$artist" --tl "$album" --ty "$year" "$file" ~/tmp.MP3

        # sposto il file ~/tmp.MP3 e sovrascrivo il file vecchio
        mv ~/tmp.MP3 "$file"
        echo -e "\n File $file modificato correttamente\n"
      else
        echo -e "\n Il bitrate del file $file è già minore di $bitrate KBps.\n"
      fi
    fi
  done

rm ~/tmp
Sempre costruendo qualcosa di nuovo: Matag: The Game
Scrivi risposta

Ritorna a “Multimediale”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 2 ospiti