[HOWTO] Streaming σε Shoutcast από Linux

Εισαγωγή

Μετά από ενασχόληση μερικών εβδομάδων με το ζήτημα έχω καταλήξει σε κάποια αρκετά χρήσιμα συμπεράσματα/αποτελέσματα σχετικά με το Streaming προς έναν Shoutcast server χρησιμοποιώντας Linux. Ο παρακάτω «οδηγός» που απευθύνεται σε υποψήφιους «DJ» ίσως να περιέχει ελλείψεις οι οποίες οφείλονται πρωτίστως σε έλλειψη τεκμηρίωσης (documentation) των χρησιμοποιούμενων πακέτων λογισμικού και δευτερευόντως σε προσωπική απροθυμία περεταίρω σπατάλης χρόνου για κάτι που φαίνεται να δουλεύει…

Το πιο πιθανόν είναι να υπάρχουν εναλλακτικές προσεγγίσεις ή πακέτα (όπως και η επιφύλαξη στο μέλλον να υπάρξουν πιο ολοκληρωμένες και εύχρηστες λύσεις). Η πατέντα που χρησιμοποιώ και περιγράφω απαιτεί την ορθή εγκατάσταση, ρύθμιση και συνδυασμένη εκτέλεση παρακάτω πακέτων λογισμικού:

Γενικές οδηγίες εγκατάστασης πακέτων

Σε κάθε διανομή Linux υπάρχει ένας συγκεκριμένος τρόπος εγκατάστασης πακέτων λογισμικού. Κάποιες διανομές έχουν υποστήριξη για ορισμένα πακέτα, για ορισμένα δεν έχουν. Αν κάποιο από τα παραπάνω πακέτα υποστηρίζεται ήδη από τη διανομή σας, τότε συνίσταται να το εγκαταστήσετε με τον standard τρόπο που γνωρίζετε.

Σε περίπτωση που κάποιο πακέτο ΔΕΝ υποστηρίζεται, τότε θα πρέπει να ακολουθήσετε τις γενικές οδηγίες εγκατάστασης λογισμικού που χρησιμοποιεί σχεδόν κάθε πακέτο στο Linux. Τα πακέτα που δεν ρυθμίζονται και εγκαθίστανται με τον standard τρόπο ακολουθούν μια διαδικασία που κατά κανόνα περιγράφεται σε ένα αρχείο συνήθως με όνομα INSTALL, README, ή με οδηγίες που μπορεί να βρει κανείς στο διαδίκτυο.

Ο standard τρόπος είναι αρκετά ευθύς και εύκολος:

Κώδικας:
tar xvzf <package_name>
cd <package_directory>
./configure
make
make install

 

Οι πρώτες δυο εντολές αποσυμπιέζουν το πακέτο με τον πηγαίο κώδικα και μας δίνουν πρόσβαση σε αυτόν. Η εντολή configure αναζητά κάποιες standard παραμέτρους του συστήματός σας που απαιτούνται για τη μεταγλώττιση και εγκατάσταση του πακέτου. Συνήθως οι όποιες ρυθμίσεις επιτρέπονται, γίνονται μέσω του configure. Η εντολή make κάνει την μεταγλώττιση του πακέτου (compile) και η make install την εγκατάσταση των απαιτούμενων αρχείων στις επιλεγμένες/επιθυμητές θέσεις στο σύστημά σας.

Περιττή λεπτομέρεια: Αν είστε σίγουροι ότι δε θα υπάρξουν επιπλοκές μπορείτε να τρέξετε το make και το make install σε ένα βήμα ως

Κώδικας:
make && make install

 

ή ακόμα πιο σύντομα τρέχοντας μόνο το make install, καθώς για την εγκατάσταση κάθε αρχείου από το make install γίνεται έλεγχος για το αν έχουν μεταγλωττιστεί τα αντίστοιχα τμήματα του προγράμματος. Αν δεν έχουν μεταγλωττιστεί (που δε θα έχουν μεταγλωττιστεί, αφού δεν τρέξαμε το make μεταγλωττίζονται επί τόπου.

Σε περίπτωση που θέλετε να ορίσετε διαφορετικές παραμέτρους στην αυτορρύθμιση του πακέτου μπορείτε να δείτε τις επιλογές με την εντολή

Κώδικας:
./configure –help

 

Μια συνηθισμένη τροποποίηση που γίνεται είναι η επιλογή του καταλόγου εγκατάστασης. Εξ’ ορισμού το configure ορίζει ως κατάλογο-προορισμό το /usr/local/. Αν θέλετε π.χ. να εγκαταστήσετε το πακέτο στον κατάλογο του συστήματος /usr, τότε τρέχετε

Κώδικας:
./configure –prefix=/usr

 

Επίσης να σημειωθεί ότι τουλάχιστον η τελευταία εντολή (make install) προφανώς πρέπει να γίνεται ως root! Οι οδηγίες αυτές είναι γενικές σχεδόν για κάθε πακέτο του linux αλλά καλό είναι να υπάρχουν Razz

Τέλος, μια τεχνική λεπτομέρεια που ίσως αποδειχθεί μείζονα στο σύστημά σας. Όταν δεν εγκαθιστάτε ένα πακέτο στην standard τοποθεσία /usr, αλλά π.χ. στο /usr/local (που είναι το default του configure) ενδέχεται να υπάρξουν κάποιες δυσκολίες. Συγκεκριμένα, κάποια πακέτα που προϋποθέτουν άλλα, αναζητούν τις λεπτομέρειές τους μέσω αρχείων .pc με τη βοήθεια του προγράμματος pkg-config. Σε αυτήν την περίπτωση πρέπει να πείτε στο pkg-config ότι υπάρχουν πακέτα και σε άλλες τοποθεσίες, αλλάζοντας τη μεταβλητή περιβάλλοντος PKG_CONFIG_PATH. Αυτό γίνεται εύκολα προσθέτοντας (για την περίπτωση του /usr/local) προσθέτοντας την παρακάτω γραμμή σε κάποιο αρχείο αρχικοποίησης του συστήματος (π.χ. στο /etc/profile.d/):

Κώδικας:
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/

 

Η τελευταία φαινομενική δυσκολία είναι ότι κάποιες βιβλιοθήκες, παρόλο που έχουν εγκατασταθεί και το pkg-config της βρίσκει, δεν μπορούν να εντοπιστούν από το configure. Συνήθως η λύση είναι αφού κάνετε εγκατάσταση να τρέξετε το πρόγραμμα

Κώδικας:
ldconfig

 

το οποίο ενημερώνει το σύστημα για τις τελευταία εγκατεστημένες βιβλιοθήκες.

Εγκατάσταση των libsamplerate & lame

Οι libsamplerate και lame είναι δυο βιβλιοθήκες για μετατροπή (conversion) και κωδικοποίηση ψηφιακού σήματος ήχους ανάμεσα σε διάφορες μορφές και προαπαιτούνται για κάποια από τα βασικά πακέτα που πρόκειται να χρησιμοποιήσουμε.

Εγκατάσταση των jack-connection-kit & qjackctl

Το jack-connection-kit είναι ένα πρόγραμμα που λειτουργεί σαν δαίμων αναπαραγωγής, ανακατεύθυνσης και επεξεργασίας του ήχου. Είναι το βασικό εργαλείο που βοηθά στην ανακατεύθυνση του ήχου από τον player που χρησιμοποιούμε προς τον Shoutcast Server, δηλ. τον ραδιοφωνικό σταθμό στον οποίο θέλουμε να εκπέμψουμε.

Το qjackctl δεν είναι τίποτα παραπάνω από ένα front-end, δηλ. ένα προγραμματάκι με γραφικά, παραθυράκι και ιστορίες το οποίο διευκολύνει τη χρήση του jack-connection-kit. Αντί κανείς να χρησιμοποιεί και να ρυθμίζει το ack-connection-kit απλώς ανοίγει το qjackctl, και με δυο-τρια clicks έχει έναν σωστά ρυθμισμένο και ενεργό jack daemon στο σύστημά του.

Και γι’ αυτά τα δυο πακέτα ισχύουν οι παραπάνω standard οδηγίες εγκατάστασης.

Εγκατάσταση του beep-media-player

Το beep-media-player (συντομογραφικά bmp) είναι η εξέλιξη ενός κλασικού winamp-like πακέτου αναπαραγωγής ήχου του Linux, του xmms. Ο βασικός κώδικας είναι εν πολλοίς παρόμοιος ή συμβατός με του xmms, και γι’ αυτό κάποια plugins του xmms που μας χρειάζονται μπορούν να χρησιμοποιηθούν και για το bmp.

Υπάρχουν διάφοροι λόγοι που έχω επιλέξει το bmp έναντι του xmms (το οποίο τεχνικά έκανε «μια χαρά» τη δουλειά από μόνο του). Το bmp έχει βελτιώσεις στην εμφάνιση, στο anti-aliasing (στρογγύλεμα) των γραμματοσειρών, πιο εύκολη προσθήκη αρχείων στη λίστα καθώς και κάποιες ευχρηστίες στην διαχείριση της λίστας (με κυριότερη την προ-δρομολόγηση τραγουδιών προς αναπαραγωγή με το πλήκτρο Q) που βοηθούν πολύ στη δημιουργία «προγράμματος μουσικής».

Προσέξτε μόνο ότι η έκδοση 0.9.7.1 είναι η τελευταία της σειράς του beep-media-player. Η ομάδα ανάπτυξης προέβη σε μια πλήρη επανασυγγραφή του κώδικα και άρχισε ξεχωριστό «παρακλάδι», από το οποίο προέκυψε το BMPx, το οποίο μεν θα αντικαταστήσει το bmp αλλά στο μέλλον, καθώς βρίσκεται στα πρώιμα στάδια ανάπτυξης και είναι αρκετά δύσκολο στην εγκατάσταση και ασταθές Wink

Το εγκαθιστάτε με τον standard τρόπο.

Εγκατάσταση των xmms-crossfade & xmms-jack

Δυο plugins του xmms που με μικρές τροποποιήσεις των συγγραφέων τους μπορούν να χρησιμοποιηθούν και στον bmp.

Το xmms-crossfade προσθέτει το εφέ της ομαλής μετάβασης από τραγούδι σε τραγούδι (με fade-out στο τραγούδι που τελειώνει και μίξη με το fade-in του τραγουδιού που αρχίζει). Το εγκαθιστάτε προαιρετικά. Η εγκατάστασή του γίνεται με μια μικροδιαφοροποίηση από τον standard τρόπο σε περίπτωση που θα επιλέξετε τον bmp έναντι του xmms:

Κώδικας:
tar xvzf <package_name>
cd <package_directory>
./configure –enable-player=bmp
make
make install

 

Εν ολίγοις στο configure ορίζετε ότι πρόκειται να χρησιμοποιήσετε τον bmp ώστε να χρησιμοποιηθούν οι κατάλληλες τροποποιήσεις και φυσικά το πακέτο να εγκατασταθεί στη σωστή θέση (στα plugins του bmp και όχι του xmms).

Το xmms-jack είναι απαιτούμενο plugin για την αποστολή του ήχου στον jack daemon αντί για το standard output plugin που χρησιμοποιείτε. Η εγκατάσταση και πάλι διαφοροποιείται από την standard διαδικασία καθώς πρέπει να οριστεί ο bmp ως player και όχι ο xmms. Εδώ έχουμε διαφορά και από το crossfade plugin:

Κώδικας:
tar xvzf <package_name>
cd <package_directory>
./configure
make -f Makefile.BMP
make -f Makefile.BMP install

 

Εγκατάσταση του oddcastv3

Το σήμα του player που παίζετε μουσική μέσω του xmms-jack, όπως προείπαμε κατευθείνεται προς τον jack daemon. Το oddcastv3 είναι το πρόγραμμα που παίρνει το σήμα από τον jack daemon και το στέλνει στον Shoutcast Server.

Ρύθμιση και χρήση των jack-connection-kit & qjackctl

Όπως προείπαμε δε θα τρέχουμε απ’ ευθείας τον jack daemon, αλλά μέσω του γραφικού προγράμματος qjackctl. Τρέχετε πάντα το qjackctl ως root. Από το κουμπί setup ανοίγει ένα παράθυρο ρυθμίσεων. Στο tab «Settings» βεβαιωθείτε ότι έχετε ορίσει τον σωστό driver ήχου (συνήθως alsa) και ότι έχετε ενεργοποιήσει την επιλογή «Realtime». Κατόπιν στο tab «Misc» ενεργοποιήστε την επιλογή «Enable system tray icon» ώστε να μπορείτε να ελαχιστοποιήσετε το πρόγραμμα σε ένα απλό εικονιδιάκι στην μπάρα εργασίας σας αντί να βλέπετε το κυρίως παράθυρο συνέχεια μπροστά σας. Αποθηκεύστε τις ρυθμίσεις και επιστρέψτε στο κεντρικό παράθυρο.

Πατώντας το «Play» ξεκινάτε τον jack daemon. Βεβαιωθείτε ότι δεν τρέχετε ήδη κάποια εφαρμογή που απασχολεί την κάρτα ήχου σας. Με την έναρξη του jack daemon όλες οι εφαρμογές θα σωπάσουν, καθώς ο jack απασχολεί εξ’ ολοκλήρου την κάρτα. Ακούγεται μόνο ό,τι επικοινωνεί με τον jack. Τώρα μπορείτε να ξεκινήσετε τον bmp.

Σημείωση: Μην ανοίγετε το qjackctl περισσότερες της μια φορές.

Ρύθμιση και χρήση του beep-media-player

Αν δεν εγκαταστήσατε το xmms-crossfade τα πράγματα είναι αρκετά σύντομα: Πηγαίνετε στις επιλογές του bmp και αλλάξτε το output plugin σε «Jack driver 0.16».

Αν έχετε και το xmms-crossfade επιλέξτε ως output plugin το «Crossfade Plugin». Από κάτω ακριβώς έχει ένα κουμπί «Preferences» (ή «Προτιμήσεις» για τους Ελληνάρες»). Εκεί ρυθμίζετε το xmms-crossfade. Πείτε του στο «Output Method» αντί για «Builtin OSS Driver» να στέλνει τον ήχο σε «Output Plugin». Στο frame που θα σας εμφανιστεί από κάτω «Output Plugin» επιλέξτε το «Jack Driver» και είστε έτοιμοι.

Κάποια σχόλια για τη χρήση του bmp: Στο κάτω μέρος του παραθύρου playlist υπάρχουν κουμπιά για προσθήκη/αφαίρεση αρχείων. Αν δεν έχετε ενεργοποιήσει το «Shuffle» (τυχαία διαδοχή τραγουδιών) μπορείτε να ορίσετε εσείς με ποια σειρά θα ακούγονται τα τραγούδια. Εντοπίζετε με τη σειρά που θέλετε τα τραγουδία, τα επιλέγετε στη λίστα και πατάτε το αγγλικό γράμμα «Q» (με ελληνικό πληκτρολόγιο δε θα πιάσει, το νου σας). Δίπλα στο τραγούδι προστίθεται ένας αριθμός σε τετραγωνάκι που λέει ποια είναι η σειρά του τραγουδιού. Μπορείτε να επιλέξετε όσα τραγούδια θέλετε με τη σειρά και να φτιάξετε το πρόγραμμά σας. Ξαναπατώντας Q σε ένα δρομολογημένο τραγούδι το απο-δρομολογείτε. Δυστυχώς δεν είναι εύκολο (ή δεν ξέρω πως γίνεται) αφού έχετε ορίσει π.χ. τα επόμενα 10 τραγούδια να παρεμβάλλετε κάποιο για «άμεση αναπαραγωγή», καθώς κάθε φορά που πατάτε Q το τραγούδι που έχετε επιλέξει μπαίνει στο ΤΕΛΟΣ της ουράς.

Ρύθμιση και χρήση του oddcastv3

Το oddcastv3 θέλει ένα αρχείο ρυθμίσεων ώστε να ξέρει τις πληροφορίες του server στον οποίο θα στέλνει το σήμα, καθώς και τις πηγές του jack από τις οποίες θα το «τραβάει». Το αρχείο ρυθμίσεων που έχω φτιάξει για έναν server είναι το παρακάτω:

Κώδικας:
##############################################################################
# DJ Broadcasting Settings for oddcastv3
#
# Server: http://147.xxx.yyy.17
# Author: drcypher (drcypher@mail.ntua.gr)
# Date: 19.04.2006
# Listen: http://147.102.192.17:8900/
# Path: /usr/local/etc/oddcast_LAME.zzzz.conf
############################################################################### Connection Settings
Server=147.xxx.yyy.17
Port=8900
ServerPassword=serverpassword
ServerMountpoint=/stream
ServerPublic=1
AutomaticReconnectSecs=10# Encoder Settings
Encode=MP3 Lame
BitrateNominal=24
NumberChannels=1
Samplerate=22050
ServerType=shoutcast
ExternalFile=/tmp/song#YP Settings
ServerStreamURL=http://www.xxx.yyy.gr/
ServerName=S.E.M.F.E. Radio (drcypher broadcasting)
ServerDescription=Peiramatikos Radiofonikos Stathmos
ServerGenre=Skylaika

#Advanced Settings
LogLevel=1
LogFile=oddcastv3.log
SaveAsWAV=0
OutputControl=SERVER,GENERAL,OUTPUT

 

Προφανώς θα αλλάξετε το password στο πραγματικό Razz Η επιλογή «MP3 Lame» σημαίνει ότι θα στέλνετε το σήμα σε μορφή MP3, τα υπόλοιπα είναι αυτονόητα και θα πρέπει να ορίζονται σύμφωνα με τις υποδείξεις του administrator του server Wink

Τώρα πρέπει να βρούμε τις πηγές σήματος που θα χρησιμοποιήσει το oddcastv3 από τον jack daemon. Ως root με την εντολή

Κώδικας:
jack_lsp

 

βλέπετε τις διαθέσιμες «πόρτες ήχου» του jack daemon. Τυπική έξοδος είναι η παρακάτω:

Κώδικας:
alsa_pcm:capture_1
alsa_pcm:capture_2
alsa_pcm:playback_1
alsa_pcm:playback_2
xmms-jack_5828_000:out_0
xmms-jack_5828_000:out_1

 

Οι αριθμοί στο xmms-jack αλλάζουν κάθε φορά που ξεκινάτε τον bmp. Το oddcastv3 θέλει τουλάχιστον 2 πόρτες για να τρέξει, ενώ οι playback πόρτες δεν είναι διαθέσιμες.

Αν θέλετε να εκπέμπετε μόνο την έξοδο του bmp θα πρέπει να επιλέξετε τις δυο xmms-jack πόρτες. Αν θέλετε να εκπέμψετε ότι τραβάει η κάρτα ήχου (π.χ. από το μικρόφωνο του συστήματος, το line in, κτλ.) θα βάλετε τις δυο capture. Αν θέλετε να εκπέμψετε ΚΑΙ τα δυο θα βάλετε μια από το καθένα.

Η κατάσταση είναι λίγο μπέρδεμα, γι’ αυτό έφτιαξα ένα scriptάκι το οποίο απαιτεί ως root σε μια κονσόλα να τρέξετε μόνο μια εντολή. Ξεκινάει το qjackctl, το bmp και το oddcastv3 αυτόματα. Αν σας βοηθάει καλώς:

Κώδικας:
###############################################################################
#!/bin/bash
#
# Name: bcast.sh
# Purpose: Broadcasting utility through bmp->jackd->oddcastv3
#
# Author: drcypher (drcypher@mail.ntua.gr)
# Date: 19.04.2006
################################################################################ Figure out correct configuration
if [ -z «$1″ ]; then
conf=»zzzz»;
else
conf=»$1″;
fiecho $0: Using $conf configuration…# Start QJackCtl
echo -ne $0: Starting up QJackCtl…
qjackctl -s > /dev/null 2>&1 &
jack_pid=$(ps ax | grep qjackctl | head -n 1 | cut -d » » -f 1-2)
echo done [pid:$jack_pid]

# Wait for jack to wake up
sleep 1

# Start BMP in play mode (wish playlist is not empty)
echo -ne $0: Starting up Beep Media Player…
beep-media-player -p > /dev/null 2>&1 &
bmp_pid=$(ps ax | grep beep-media-player | head -n 1 | cut -d » » -f 1-2)
echo done [pid:$bmp_pid]

# Wait for user to start oddcast (must have loaded a playlist and pushed the play button)
echo -ne $0: Press any key to start oddcast…
read

# Recursively restart oddcastv3 in case something goes wrong. Give exit choice
while [ 1 ]; do
jack_port=$(jack_lsp | grep xmms | head -n 1)
echo $0: Starting up oddcastv3 [$jack_port]…
oddcastv3 alsa_pcm:capture_1 $jack_port -c /usr/local/etc/oddcast_LAME.$conf.conf
echo -ne $0: Restart Oddcast or e[X]it?
read choice
if [ «$choice» = «X» -o «$choice» = «x» ]; then
break;
fi
done

echo $0: Goodbye!

 

Τυπική έξοδος του παραπάνω είναι η ακόλουθη:

Έξοδος:
./bcast.sh: Using edra configuration…
./bcast.sh: Starting up QJackCtl…done [pid: 5815]
./bcast.sh: Starting up Beep Media Player…done [pid: 5231]
./bcast.sh: Press any key to start oddcast…
./bcast.sh: Starting up oddcastv3 [xmms-jack_5828_000:out_0]…
SERVER: Connecting
SERVER: Socket connected
SERVER: Password OK
SERVER: Success
SERVER: Connected
OUTPUT: 18 Kbps
OUTPUT: 24 Kbps
OUTPUT: 24 Kbps
:
:
Advertisements

Σχολιάστε

Εισάγετε τα παρακάτω στοιχεία ή επιλέξτε ένα εικονίδιο για να συνδεθείτε:

Λογότυπο WordPress.com

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό WordPress.com. Αποσύνδεση /  Αλλαγή )

Φωτογραφία Google

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Google. Αποσύνδεση /  Αλλαγή )

Φωτογραφία Twitter

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Twitter. Αποσύνδεση /  Αλλαγή )

Φωτογραφία Facebook

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Facebook. Αποσύνδεση /  Αλλαγή )

Σύνδεση με %s