[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [volume] [parte]


Capitolo 645.   Audio attraverso la rete

Ci sono tanti modi di gestire l'audio attraverso la rete. La tecnica più semplice, anche se non è necessariamente la più efficace, consiste nella realizzazione di una connessione TCP normale dove ogni nodo intrattiene una sessione indipendente. Si intende il limite di questo nel fatto che ogni utente che si collega aggiunge del carico alla rete. In pratica, questo approccio può andare bene solo in reti locali poco popolate, oppure con particolari doti di velocità.

Figura 645.1. Idea generale del funzionamento di un sistema di diffusione di audio attraverso la rete, per mezzo di un servente con funzione di ripetitore.

diffusione audio

In questo capitolo viene mostrato inizialmente l'uso di NetStreamer, anche se rispetto a Icecast può considerarsi superato.

645.1   NetStreamer

Lo schema di funzionamento di NetStreamer (1) si basa su un demone, NrServer, che comunque deve essere avviato esplicitamente sullo sfondo, il quale svolge il ruolo di ripetitore nei confronti di uno o più clienti di trasmissione. Successivamente, gli utenti che vogliono collegarsi al ripetitore per ascoltare ciò che viene trasmesso, utilizzano altri clienti specifici per la ricezione. Le connessioni sono di tipo TCP e di solito si utilizza la porta 8 888.

Un solo servente NetStreamer può gestire più sorgenti audio (provenienti da altrettanti clienti per la trasmissione), per cui i clienti hanno la possibilità di scegliere su quale trasmissione «sintonizzarsi». In base a questo principio, NetStreamer simula la gestione di una stazione radio UHF che opera sulle frequenze tra 88 MHz e 108 MHz: i clienti di trasmissione, quando si collegano definiscono il nome della propria «stazione radio» e la «frequenza», rappresentando questa ultima attraverso un valore che esprime decimi di megahertz; i clienti per la ricezione si sintonizzano utilizzando come riferimento il valore della frequenza utilizzata dalle stazioni di trasmissione.

È importante osservare che la ricezione delle trasmissioni attraverso diversi clienti di ricezione, non può essere sincronizzata. Ciò accade a causa dell'esigenza di accumulare una memoria tampone necessaria a garantire la continuità nel flusso della riproduzione audio.

645.1.1   Attivazione di una «stazione radio»

Il ripetitore è quindi il servente di NetStreamer. Nella stessa rete possono essere predisposti diversi serventi indipendenti, anche se questo non dovrebbe essere di alcuna utilità. Tutto si limita all'avvio di NrServer con l'indicazione della porta TCP da utilizzare per le comunicazioni:

NrServer :8888 &[Invio]

In alternativa, è possibile indicare anche il nome del nodo, per uniformità con la notazione utilizzata dai clienti:

NrServer localhost:8888 &[Invio]

Si osservi il fatto che NrServer deve essere messo esplicitamente in funzione sullo sfondo.

Il cliente che trasmette al ripetitore può essere collocato indipendentemente nello stesso elaboratore del ripetitore o in un altro nodo. Naturalmente, collocandolo nello stesso elaboratore si evita di intasare ulteriormente la rete locale con questa connessione.

Si tratta di utilizzare NrTransmitter, il quale deve avere una fonte di audio digitale, indicando in particolare il nodo del ripetitore, la porta di comunicazione, il nome della stazione radio virtuale e la frequenza virtuale di trasmissione.

Si distinguono tre situazioni importanti in funzione del modo in cui viene fornita l'informazione audio digitale al programma NrTransmitter: i file di dispositivo standard, lo standard input o una serie di file di registrazioni precedenti, realizzati sempre con NetStreamer.

645.1.2   Audio digitale proveniente dai dispositivi standard

Quando si dispone di una scheda audio, quello che questa è in grado di catturare, ovvero il canale audio indicato per la registrazione, può essere letto dai soliti file di dispositivo già mostrati più volte. Per fare in modo che un cliente di trasmissione NetStreamer prenda questa fonte, si utilizza la sintassi seguente:

NrTransmitter Device campionamento frequenza_virtuale nome_stazione [nodo]:porta

La parola chiave Device posta come primo argomento serve proprio a specificare questo comportamento del cliente di trasmissione. La frequenza di campionamento è un numero che si riferisce a kilohertz (simbolo: «kHz») e comunque può essere scelto solo tra 8 e 16. La frequenza virtuale è un numero che esprime i decimi di megahertz a cui si vuole simulare la trasmissione radio.

A titolo di esempio, volendo trasmettere quello che viene dalla scheda audio con un campionamento di 16 kHz utilizzando la frequenza virtuale di 88,5 MHz per la stazione radio denominata «Stazione 1», che utilizza il ripetitore dinkel.brot.dg alla solita porta 8 888, si può utilizzare il comando seguente:

NrTransmitter Device 16 885 "Stazione 1" dinkel.brot.dg:8888 &[Invio]

In alternativa, se il ripetitore si trova nello stesso elaboratore, si potrebbe fare riferimento al nodo localhost, abbreviando eventualmente nel modo seguente:

NrTransmitter Device 16 885 "Stazione 1" :8888 &[Invio]

645.1.3   Audio digitale proveniente dallo standard input

Quando l'audio viene fornito a NrTransmitter attraverso lo standard input, questo deve essere in un formato PCM, ovvero senza intestazione particolare, praticamente quello che genera MP3blaster, solo che per il momento MP3blaster non può emetterlo in questo modo:

mp3blaster --sound-device=file_temporaneo file_mp3

Successivamente:

cat file_temporaneo | NrTransmitter StdIn campionamento frequenza_virtuale nome_stazione \
  \[nodo]:porta campionamento_in_ingresso

Rispetto alla sintassi vista per l'utilizzo dei dispositivi standard, in questo caso il primo argomento è la parola chiave StdIn, aggiungendo in coda un numero corrispondente alla frequenza di campionamento con cui arrivano i dati in ingresso. L'esempio dei comandi seguenti mostra l'utilizzo di un file FIFO (pipe con nome) per ricreare un flusso continuo.

mkfifo /tmp/musica[Invio]

mp3blaster --sound-device=/tmp/musica[Invio]

In un altro terminale o console virtuale:

cat /tmp/musica | \
  \NrTransmitter StdIn 16 885 "Stazione 1" \
  \dinkel.brot.dg:8888 44 &
[Invio]

Oppure, se la trasmissione avviene nello stesso nodo locale:

cat /tmp/musica | NrTransmitter StdIn 16 885 "Stazione 1" \
  \:8888 44 &
[Invio]

645.1.4   Audio digitale contenuto all'interno di «nastri»

Attraverso NetStreamer è possibile registrare dei file con un formato audio digitale speciale, che nella logica di questo applicativo sono dei nastri, esattamente come si farebbe in una stazione radio. Viene mostrato in seguito come realizzare tali file; per il momento si tenga presente che devono avere l'estensione .tape.

NrTransmitter Directory campionamento frequenza_virtuale nome_stazione \
  \[nodo]:porta directory_dei_nastri

Rispetto a quanto visto in precedenza, si osserva che il primo argomento è la parola chiave Directory e in coda si nota l'indicazione di una directory all'interno della quale NrTransmitter va a cercare i file che terminano con l'estensione .tape. Questi file vengono scelti con una sequenza casuale e trasmessi in continuazione. Vengono riproposti i due esempi già visti in precedenza; in particolare, si fa riferimento ai file contenuti probabilmente in un disco innestato per l'occasione: /mnt/musica.

NrTransmitter Directory 16 885 "Stazione 1" dinkel.brot.dg:8888 \
  \/mnt/musica &
[Invio]

NrTransmitter Directory 16 885 "Stazione 1" :8888 /mnt/musica &[Invio]

645.1.5   Ricezione di una stazione radio virtuale

La ricezione è un procedimento più semplice; tutto quello che serve è indicare la frequenza virtuale e il ripetitore a cui ci si vuole collegare:

NrReceiver frequenza_virtuale [nodo]:porta

Il risultato viene passato ai file di dispositivo per l'input dell'audio digitale. Per esempio, per ascoltare la trasmissione proveniente dal ripetitore collocato nel nodo dinkel.brot.dg (alla solita porta) alla frequenza virtuale di 88,5 MHz, si può usare il comando seguente:

NrReceiver 885 dinkel.brot.dg:8888[Invio]

In alternativa a NrReceiver si può utilizzare NrRecFrontend che, come suggerisce il nome, è un programma frontale per X. In tal caso si indica solo il ripetitore a cui collegarsi, perché la frequenza è specificata attraverso il pannello di questo programma.

NrRecFrontend [nodo]:porta

La figura 645.2 mostra come si può presentare NrRecFrontend quando è collegato alla stazione radio virtuale vista tante volte in questi esempi.

Figura 645.2. Pannello frontale del ricevitore di NetStreamer.

NetStreamer-frontale

Come si può osservare, appare anche il pulsante <record>. Questo permette di iniziare una registrazione in un file .tape di NetStreamer. Per la precisione, si registra la trasmissione nel file ~/default.tape. Questo file può essere poi rinominato e utilizzato per le trasmissioni.

645.1.6   Creazione di nastri

Oltre alla possibilità di registrare dei file .tape per NetStreamer attraverso il pannello di un ricevitore NrRecFrontend, si può usare il programma NrEncoder che è in grado di generare tali file a partire da un formato PCM.

NrEncoder campionamento_in_ingresso campionamento_in_uscita

Lo schema sintattico mostra che gli unici argomenti sono il campionamento in ingresso e quello in uscita espressi in kilohertz. L'input viene fornito attraverso lo standard input e l'output si ottiene dallo standard output. Per esempio, con l'aiuto di MP3blaster si può convertire un file MP3 in due passaggi:

mp3blaster --sound-device=/tmp/musica mio_file.mp3[Invio]

cat /tmp/musica | NrEncoder 44 16 > mio_file.tape[Invio]

Il formato di questi file di NetStreamer è precisamente: CCITT ADPCM.

645.2   Icecast 1

Icecast 1 (2) è un sistema di trasmissione di audio digitale MP3 attraverso il protocollo HTTP.

Icecast 1 è da considerarsi un lavoro obsoleto. Al suo posto si inserisce Icecast 2 che utilizza soltanto il formato Ogg Vorbis per la diffusione di audio digitale attraverso la rete.

Il meccanismo di funzionamento è quello a cui si accenna all'inizio del capitolo, con la particolarità di presentare il flusso digitale come fa il protocollo HTTP, iniziando con l'intestazione seguente, seguita poi dalla codifica MP3:

HTTP/1.0 200 OK
Server: icecast/1.0.0
Content-type: audio/mpeg

Icecast si compone di un servente, corrispondente all'eseguibile icecast e di un programma cliente per la trasmissione al servente, ovvero al ripetitore, dei file MP3 che altri clienti possono poi ricevere e riprodurre.

Il servente icecast non richiede file di configurazione, dal momento che tutte le informazioni necessarie per il suo funzionamento vengono fornite attraverso la riga di comando; tuttavia, le distribuzioni GNU/Linux possono organizzare il pacchetto in modo da avviare il servizio nell'ambito della procedura di inizializzazione del sistema, dove lo script di avvio potrebbe leggere un file di configurazione con le informazioni necessarie a comporre il comando completo di avvio di icecast.

icecast [opzioni]

A titolo di esempio si può vedere come potrebbe essere strutturato, in modo elementare, lo script per l'avvio del servizio Icecast:

#!/bin/sh
#
# init.d/icecast {start|stop|restart}
#

# Importazione della configurazione di Icecast
. /etc/defaults/icecast

# Analisi dell'argomento usato nella chiamata.
case "$1" in
  start)
        echo -n "Avvio del servizio Icecast: "
        /usr/sbin/icecast $OPZIONI &
        echo
        ;;
  stop)
        echo -n "Disattivazione del servizio Icecast: "
        killall icecast
        echo
        ;;
  *)
        echo "Utilizzo: pippo {start|stop}"
        exit 1
esac

exit 0

Si può osservare che lo script importa inizialmente il file /etc/defaults/icecast, nel quale evidentemente viene dichiarata la variabile di ambiente OPZIONI. Per esempio, sempre semplificando al massimo, questo file esterno potrebbe essere strutturato nel modo seguente, con l'unico scopo di stabilire una parola d'ordine per l'invio di un flusso audio da ritrasmettere:

PASSWORD=D.BOQjOm40WtQ

OPZIONI="-p $PASSWORD"

La parola d'ordine in questione, potrebbe essere accettata in chiaro, oppure in modo cifrato, come si intende in questo esempio. Per ottenere la parola d'ordine cifrata a partire da quella in chiaro, si può usare il programma Makepasswd, (3) che non fa parte di Icecast 1:

echo ciao | makepasswd --clearfrom - --crypt[Invio]

ciao       D.BOQjOm40WtQ

In pratica, la parola d'ordine in chiaro è «ciao», mentre la stringa cifrata equivalente è «D.BOQjOm40WtQ».

Il servente di Icecast utilizza in modo predefinito delle porte TCP per ricevere e inviare il flusso audio MP3. La porta 8 000 viene utilizzata normalmente per concedere l'accesso ai programmi clienti, la porta 8 001 viene utilizzata per ricevere il flusso audio da ritrasmettere ed eventualmente la porta 8 002 serve per l'amministrazione remota del servente.

Si osservi il fatto che un servente di Icecast potrebbe essere utilizzato anche da un utente comune, tanto più in considerazione dell'utilizzo normale di porte non privilegiate per il suo funzionamento. In tal caso, evidentemente, non si farebbe uso di script della procedura di inizializzazione del sistema.

L'esempio mostrato anticipa l'uso dell'opzione -p, con la quale si stabilisce una parola d'ordine. Ciò permette di evitare che un cliente non autorizzato possa utilizzare il servente per trasmettere un flusso audio. Per conoscere le altre opzioni disponibili è possibile consultare la pagina di manuale icecast(8).

Il servente Icecast prevede anche un file di configurazione che dovrebbe corrispondere a /etc/icecast/icecast.conf, che però qui non viene descritto. A ogni modo, in questo file è possibile anche specificare la parola d'ordine per gli accessi, senza bisogno di usare l'opzione -p nella riga di comando.

645.2.1   Trasmissione al ripetitore

Icecast offre il programma shout per la trasmissione al servente del flusso audio MP3:

shout nodo [opzioni] [file_mp3]...

In condizioni normali, è più che sufficiente l'indicazione dell'indirizzo o del nome del nodo in cui si trova il servente da contattare per la trasmissione, assieme all'elenco di file MP3 da trasmettere. Spesso è necessario aggiungere una parola d'ordine per accedere al servente e questo si ottiene con l'opzione -P. La tabella 645.7 riepiloga alcune opzione di uso comune.

Tabella 645.7. Opzioni principali di shout.

Opzione Descrizione
-P stringa
Parola d'ordine da trasmettere al servente.
-e n
Accede al servente attraverso la porta indicata.
-l
Continua la trasmissione all'infinito.
-p file_elenco
Indica i file da trasmettere attraverso l'elenco contenuto nel file.
-r
Sequenza casuale nella trasmissione dei file audio.

A seconda di come viene compilato, questo programma potrebbe avere la necessità di accedere a porzioni del file system per cui servono privilegi particolari di accesso. Se ciò accade, il programma va avviato come utente root:

shout dinkel.brot.dg -P ciao *.mp3[Invio]

L'esempio precedente fa sì che vengano trasmessi i file corrispondenti al modello *.mp3 al servente dinkel.brot.dg, fornendo la parola d'ordine «ciao», utilizzando la porta TCP predefinita (8 001).

shout dinkel.brot.dg -P ciao -p elenco[Invio]

Questo secondo esempio è simile al precedente, con la differenza che i file MP3 non vengono elencati nella riga di comando, ma sono forniti in un elenco contenuto nel file di testo elenco.

shout dinkel.brot.dg -P ciao -r -l -p elenco[Invio]

Questo ultimo esempio aggiunge l'uso delle opzioni -r e -l, con le quali si ottiene rispettivamente una sequenza casuale nell'ordine dei file audio trasmessi e una trasmissione senza fine.

645.2.2   Ricezione del flusso audio digitale

Il sistema usato da Icecast per trasmettere audio digitale MP3 attraverso il protocollo HTTP è uno standard diffuso, per cui sono diversi i programmi per l'esecuzione di file MP3 che sono anche in grado di collegarsi a un flusso di questo tipo. In particolare è disponibile FreeAmp o Zinf, che per accedere a un servente Icecast si utilizzano semplicemente così:

freeamp http://nodo:porta
zinf http://nodo:porta

L'esempio seguente fa sì che FreeAmp o Zinf si colleghi al nodo dinkel.brot.dg, alla porta 8 000 in attesa di un flusso MP3:

freeamp http://dinkel.brot.dg:8000[Invio]

zinf http://dinkel.brot.dg:8000[Invio]

Icecast offre anche un programma cliente abbastanza spartano, che si limita a emettere il flusso ottenuto attraverso lo standard output. Si tratta di listen:

listen nodo porta [proxy porta]

La sintassi del programma è essenziale; in particolare si può osservare il vantaggio dato dall'uso del protocollo HTTP, che in questo modo consente di utilizzare anche un proxy se ciò è necessario per raggiungere la rete esterna.

Da solo, listen serve a poco, perché non fa altro che ricevere il flusso MP3 emettendolo attraverso lo standard output; tuttavia può essere utile per verificare il funzionamento del servizio di Icecast.

645.3   Ricezione di radio attraverso Internet

Internet è popolata da «stazioni radio» di tutti i generi. Queste emittenti utilizzano vari tipi di protocolli e di sistemi di compressione, però non tutto è accessibile attraverso il software libero. Di solito si possono ascoltare stazioni Showcast e Icecast.

645.3.1   Applicativi comuni per la ricezione di stazioni radio via Internet

Sono molti i programmi in grado di ricevere stazioni radio da Internet; in generale, ogni buon programma per l'esecuzione di file musicali è anche in grado di accedere a dei protocolli di rete. In particolare vale la pena di citare: Xmms, (4) Rhythmbox, (5) FreeAmp (6) e Zinf. (7) Si osservi comunque che quasi tutti i programmi che sono in grado di eseguire dei file multimediali (nel senso di audio e video assieme), sono anche in grado di leggere file che contengono solo audio e anche di collegarsi a una stazione radio del genere.

Figura 645.8. Rhythmbox durante l'ascolto di una stazione radio.

rhythmbox-front

Figura 645.9. Configurazione di una stazione radio con Rhythmbox.

rhythmbox-config-radio

645.3.2   Indirizzi di accesso a stazioni radio via Internet

Nelle situazioni più comuni, la ricezione di una stazione radio di Internet si ottiene specificando un indirizzo che fa riferimento al protocollo HTTP, con l'indicazione eventuale di una porta alternativa. Per esempio: http://dinkel.brot.dg:8000, http://dinkel.brot.dg/radio/1001, http://dinkel.brot.dg:80/radio/1001,...

In alternativa, al posto di fare riferimento direttamente alla fonte, l'indirizzo può riguardare un file che indica una o più origini alternative. Per esempio, l'indirizzo http://www.mostlyclassical.com/mp3/classical128k.pls punta in pratica al file classical128k.pls che deve essere letto e interpretato per accedere alla stazione radio vera e propria. Questo file, la cui estensione sta per play list, potrebbe avere un contenuto simile a quello seguente:

[playlist]
NumberOfEntries=4
File1=http://64.236.34.196:80/stream/1006
Title1=S K Y . F M - Mostly Classical - Relax... it's good for you!
Length1=-1
File2=http://64.236.34.4:80/stream/1006
Title2=S K Y . F M - Mostly Classical - Relax... it's good for you!
Length2=-1
File3=http://64.236.34.196:80/stream/1006
Title3=S K Y . F M - Mostly Classical - Relax... it's good for you!
Length3=-1
File4=http://64.236.34.4:5190/stream/1006
Title4=S K Y . F M - Mostly Classical - Relax... it's good for you!
Length4=-1
Version=2

In tal modo, in base all'esempio, il programma per la ricezione di questa radio può tentare l'accesso a quattro ripetitori diversi: http://64.236.34.196:80/stream/1006, http://64.236.34.4:80/stream/1006, http://64.236.34.196:80/stream/1006 e http://64.236.34.4:5190/stream/1006.

645.3.3   Streamtuner

Streamtuner(8) è un programma frontale grafico, in grado di raccogliere gli elenchi principali di radio via Internet e di avviare il programma appropriato per il loro ascolto. Inoltre, può pilotare il programma Streamripper per registrare la trasmissione su file.

Figura 645.11. Streamtuner durante il funzionamento. Si vede in primo piano anche XMMS, avviato da Streamtuner per l'ascolto della stazione radio selezionata dall'elenco.

Streamtuner e XMMS

645.3.4   Streamripper

Streamripper(9) è un programma che si utilizza a riga di comando, ma che spesso viene utilizzato attraverso programmi frontali diversi, che ha lo scopo di filtrare un flusso audio digitale per salvarlo in file audio separati:

streamripper indirizzo [opzioni]

Come si vede dal modello sintattico, l'utilizzo più semplice del programma richiede solo l'indicazione di un indirizzo (URI) dal quale ottenere la sorgente audio digitale. In modo predefinito, il programma crea una directory con il nome della stazione radio, all'interno della quale va a inserire i file, i cui nomi provengono dalle indicazioni che possono essere raccolte dal flusso audio stesso. Ecco un esempio:

streamripper http://194.79.31.234:7120[Invio]

Connecting...
stream: Radio Skipper - Live from Canada, America, Italy, France, <pnewline>England, Germany
server name: SHOUTcast/Linux v1.9.5
bitrate: 128
meta interval: 32768

[ripping...    ] Robbie Nevil - C'est La Vie [  1.69M]
[ripping...    ] Promo ID 31 - Radio Skipper [  326kb]
[ripping...    ] Barry White - Let the music play [  1.11M]

Si ottiene la sottodirectory Radio Skipper - Live from Canada, America, Italy, France, England, Germany/, all'interno della quale appaiono dei file audio:

cd Radio*[Invio]

ls [Invio]

Barry White - Let the music play.mp3
Promo ID 31 - Radio Skipper.mp3
Robbie Nevil - C'est La Vie.mp3

645.4   Riferimenti

Appunti di informatica libera 2007.02 --- Copyright © 2000-2007 Daniele Giacomini -- <daniele (ad) swlibero·org>


1) NetStreamer   GNU GPL

2) Icecast   GNU GPL

3) Makepasswd   GNU GPL

4) Xmms   GNU GPL

5) Rhythmbox   GNU GPL

6) FreeAmp   GNU GPL

7) Zinf   GNU GPL

8) Streamtuner   simile a BSD

9) Streamripper   GNU GPL


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome audio_attraverso_la_rete.htm

[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico]

Valid ISO-HTML!

CSS validator!