1+ import os
2+ from pydub import AudioSegment , effects
3+ from pydub .utils import mediainfo
4+
5+ def get_min_bitrate (files ):
6+ """Analizza i file e restituisce il bitrate più basso trovato (in kbps)."""
7+ bitrates = []
8+ for f in files :
9+ try :
10+ info = mediainfo (f )
11+ # Il bitrate è riportato in bit/s (es. 128000)
12+ bitrate = int (info .get ('bit_rate' , 192000 ))
13+ bitrates .append (bitrate )
14+ except :
15+ continue
16+
17+ if not bitrates :
18+ return "128k"
19+
20+ # Troviamo il minimo e convertiamo in formato 'k' (es. 128k)
21+ min_k = int (min (bitrates ) / 1000 )
22+ return f"{ min_k } k"
23+
24+ def process_audio_optimized ():
25+ output_filename = "risultato_ottimizzato.mp3"
26+ files = sorted ([f for f in os .listdir ('.' ) if f .endswith ('.mp3' ) and f != output_filename ])
27+
28+ if not files :
29+ print ("Nessun file MP3 trovato!" )
30+ return
31+
32+ # 1. Analisi del bitrate minimo per risparmiare spazio
33+ target_bitrate = get_min_bitrate (files )
34+ print (f"Bitrate ottimizzato rilevato: { target_bitrate } " )
35+
36+ combined = AudioSegment .empty ()
37+ silence = AudioSegment .silent (duration = 3000 )
38+
39+ print (f"Elaborazione di { len (files )} file..." )
40+
41+ for f in files :
42+ try :
43+ # Caricamento e standardizzazione
44+ audio = AudioSegment .from_mp3 (f ).set_frame_rate (44100 ).set_channels (2 )
45+
46+ # 2. Normalizzazione del volume (porta il picco a 0 dB)
47+ audio = effects .normalize (audio )
48+
49+ print (f"Aggiungendo e normalizzando: { f } " )
50+ combined += audio + silence
51+ except Exception as e :
52+ print (f"Errore su { f } : { e } " )
53+
54+ # 3. Esportazione finale
55+ print (f"Esportazione in corso ({ target_bitrate } , CBR)..." )
56+ combined .export (
57+ output_filename ,
58+ format = "mp3" ,
59+ bitrate = target_bitrate ,
60+ parameters = ["-write_xing" , "0" ] # Forza CBR puro per compatibilità timer
61+ )
62+
63+ print ("-" * 30 )
64+ print (f"COMPLETATO!" )
65+ print (f"File: { output_filename } " )
66+ print (f"Peso ottimizzato con bitrate: { target_bitrate } " )
67+ print (f"Durata totale: { len (combined ) / 1000 } secondi." )
68+ print ("-" * 30 )
69+
70+ if __name__ == "__main__" :
71+ process_audio_optimized ()
0 commit comments