Alternative a mpg123 per MusicOnHold
by admin on Mar.02, 2009, under Asterisk, Telefonia
Il package mpg123, che da sempre costituisce l’applicazione accessoria di Asterisk per la musica d’attesa (musiconhold), è purtroppo affetto da un bug che non consente il rilascio della memoria di cui non necessita più. Ciò costituisce un cosiddetto “memory leak”. Quello che in pratica succede è che il programma consuma sempre più memoria fino a provocare il crash del sistema, per mancanza di memoria disponibile.
Soluzione 1: format_mp3
Una possibile soluzione consiste nell’ usare format_mp3 per la “Music on Hold”, in sostituzione di mpg123
Il modulo format_mp3 fa parte del package asterisk-addons.
Se decidete di utilizzarlo, assicuratevi innanzitutto di aver rimosso mpg123 dal sistema.
L’installazione è una operazione banale:
Occorre naturalmente scompattare il tarball compresso asterisk-addons-.tar.gz e poi, dopo essersi posizionati nella directory format_mp3 (generata dalla scompattazione), impartire:
# make clean install
oppure (con Asterisk in esecuzione)
# make clean autoload
I file sonori dovrebbero essere a 8khz e mono.
Li si può convertire in questa maniera:
# lame -q -p --mp3input -a --preset 8 in.mp3 out.mp3
Soluzione 2: rawplayer
Un’altra possibilità consiste nell’usare rawplayer al posto di mpg123.
In tal modo rawplayer costitusce un semplice sostututo di mpg123, ma più efficiente, dato che non risente dei problemi di memory leaking.
Rawplayer fa parte del package asterisk
Per installare rawplayer occorre: 1) posizionarsi nella directory base dei sorgenti di asterisk e quindi in ‘contrib/utils/’ e compilare il modulo:
# gcc -O2 rawplayer.c -o /usr/bin/rawplayer
Questo comando compila ed installa rawplayer in /usr/bin 2) editare /etc/asterisk/musiconhold.conf e modificare così la entry ‘default’:
default => custom:/var/lib/asterisk/rawmusik,/usr/bin/rawplayer
i file sonori andranno di conseguenza posizionati in /var/lib/asterisk/rawmusik.
Per la conversione dei files è possibile utilizzare (se sox è stato compilato col supporto per il formato mp3):
# sox -c 1 filename.mp3 -t raw -r 8000 -c 1 -s -w filename.raw # cp filename.raw /var/lib/asterisk/rawmusik
* Osservazione:
Se andate a guardarvi il sorgente di rawplayer (rawplayer.c) vedrete che fa una operazione molto semplice: legge il contenuto del rawfile, lo bufferizza, e lo riscrive su stdout.
In maniera più rozza ma simile, diventa possibile far funzionare un rudimentale “rawplayer” così composto:
#!/bin/sh for name in $@; do cat $name ; done
Soluzione 3: madplay
E’ possibile anche utilizzare madplay per generare il sonoro dagli mp3 allo stesso modo di mpg123
Basta definire (in musiconhold.conf) un player custom come di seguito:
default => custom:/var/lib/asterisk/mohmp3/,/usr/bin/madplay --mono -R 8000 --output=raw:-

