Casino online









Mercato forex







Il formato MP3



Cos'è e cosa contiene un Mp3
La sigla Mp3 deriva dalla più complicata dicitura MPEG Layer 3: MPEG è l'acronimo di Moving Picture Experts Group, ossia il gruppo di lavoro che ha sviluppato tale codifica e che ha elaborato il formato mp3. Questo è un formato compresso, ossia i dati che riproducono la forma d'onda del suono sono stati fatti passare attraverso un algoritmo che ne ha ridotto la dimensione in termini di spazio occupato in memoria a danno, però, della qualità. L'mp3 infatti comporta una perdita di dati, anche se lieve, durante il processo di codifica e viene perciò definito lossy (da "loose", perdere): tale perdita non costituisce, comunque, un danno grave, poiché solo le informazioni di minore importanza vengono tralasciate e il risultato finale rimane pressochè lo stesso. In questo tutorial non mi occuperò di come viene scritta a livello tecnico l'informazione audio e di come viene trasformata in suono vero e proprio dalla macchina, ma solamente di come reperire tutte le informazioni possibili sul file e sul suo contenuto. Questo processo viene compiuto attraverso l'analisi di due parti fondamentali del file: l'header e i tag ID3.
Tuttavia, prima di passare all'analisi di questi due segmenti di informazione, è necessario conoscere almeno qualcosina sulle onde.


Un po' di teoria sulle onde e sul campionamento
Un'onda (meccanica) è semplicemente una perturbazione di un mezzo materiale, e si propaga in esso con velocità finita. L'onda di cui ci si occpuerà in questo tutorial è il suono. Esso ha una natura leggermente diversa dalle onde meccaniche come possono essere le increspature nell'acqua generate da un sassolino che vi cade, ma per mancanza di tempo e per amor di semplicità, lo tratterò esattamente allo stesso modo, anche perchè questo approccio non è sbagliato (le formule e i meccanismi sono gli stessi), solo leggermente incompleto.
Un suono qualsiasi può essere visto come la sovrapposizione di più onde semplici, delle quali è possibile dare una descrizione matematica precisa. Ogni onda elementare dipende da tre fattori fondamentali: e si può rappresentare in questo modo in un grafico spazio-spazio:


Grafico spazio-spazio
Prodotto con MGraphing


Il grafico qua sopra mostra l'onda vista "di fianco": ogni suo punto è un punto del mezzo attraversato che ha diversa posizione su y. Il grafico che segue, invece, è una legge spazio-tempo che definisce la posizione y di un punto al passare del tempo:


Grafico spazio-tempo
Prodotto con MGraphing


Sembrano uguali, in effetti, ma in questo caso la distanza tra due creste o due ventri è una grandezza misurata in secondi e si chiama periodo, ossia quel lasso di tempo trascorso il quale il punto si ritova nella stessa posizione y. Il reciproco del periodo (1 / Periodo) è la frequenza, misurata in Hertz (Hz). Dal grafico appena sopra possiamo vedere che il punto ritorna alla posizione y = 0 dopo circa 6 secondi (2 volte pi greco per la precisione): diremo quindi che il suo periodo è 6 secondi e che la sua frequenza è 1/6 Hz, mentre la sua ampiezza è 4.
Un suono, composto dalla sovrapposizione di più onde, può anche non assomigliare a queste belle sinusoidi, ma potrebbe presentarsi con un profilo di questo tipo:


Grafico di quattro onde sovrapposte
Prodotto con MGraphing


O, addirittura, potrebbe essere all'apparenza del tutto irregolare, come i prossimi due esempi:


Grafico di quattro onde sovrapposte
Prodotto con Waves





Zoom sull'onda di un file mp3 (Aherit's Theme)
Prodotto con Audacity


Avendo visto questo esempi, appare facile capire che un normale player non deve cercare di estrapolare tutte le singole onde semplici che formano il risultato finale, ma deve solamente cercare di riprodurre, seguendo la stessa sinusoide, il suono che è stato codificato all'interno del file musicale. Questo viene fatto mediante un dispositivo interno al computer, chiamato Digital to Analog Converter (DAC), che converte il segnale digitale in una data differenza di potenziale e quindi in un segnale elettrico trasmesso agli altoparlanti, i quali fanno di conseguenza vibrare le membrane al loro interno per produrre il suono desiderato. Da questo punto di vista, il funzionamento è semplice, ma se lo guardassimo dal lato opposto?
L'Analog to Digital Converter (ADC) è quello che ci interessa per comprendere alcuni concetti usati più avanti. Poiché svolge il compito inverse, l'ADC converte un suono reale in formato digitale, ed è qui che iniziano i problemi. L'onda sonora che spinge sulle membrane del microfono viene trasformata in segnale elettrico attraverso particolari materiali detti "piezoelettrici" (ossia in grado di generare elettricità quando vengono sottoposti a pressione), i quali trasmettono il loro output all'ADC. Ora la macchina deve convertire un segnale analogico, ossia reale, fisico, in digitale. Il primo problema consiste nel trovare un modo per determinare l'ampiezza dell'onda (e quindi il volume): ammettendo che i metriali testé citati possano generare una differenza di potenziale variabile tra -10V e +10V, si ha un range di 20V. Tuttavia nella realtà il segnale è continuo, ossia in termini semplici, esiste sempre una via di mezzo tra due misure: in questo caso potremmo avere una tensione di 5V, ma anche di 5,1V, ma anche di 5,01V, ma anche di 5,00000000001V e così via all'infinito. Digitalmente, questo non è riproducibile, in quanto si dispone di una quantità fissa di memoria e di risorse e si dice, perciò, che il segnale digitale è discreto [Se fate mente locale sulla differenza tra l'insieme dei numeri Reali e quello dei numeri Naturali, forse, vi verrà più facile capirlo]. È stato convenuto, quindi, di dividere il range a disposizioni in 65535 parti, ossia tutti i possibili valori che un intero a 4 bytes (Int32) può assumere (da -32767 a +32768), ottenendo una sensibilità abbastanza elevata da poter riprodurre ampiezze indistingibili all'orecchio umano.
Il secondo problema è simile, ma riguarda il tempo. Guardate questi due grafici:


Onda analogica e onda digitale


L'onda in rosso è quella analogica (quella che noi sentiamo), mentre quella in blu sarebbe la sua ripdoruzione digitale: non ci assomiglia molto. In questo esempio, la posizione y di ogni punto viene rilevata a intervalli di tempo di 1 secondo, ossia la sua frequenza di campionamento è 1Hz. Si definisce frequenza di campionamento (o sampling frequency) la frequenza con la quale viene rilevata la posizione di tutti i punti che oscillano. Risulta evidente che questa frequenza è troppo bassa per riprodurre fedelmente l'onda originale. Aumentandola, si aumenterà anche la somiglianza fra le due versioni, fino a renderle quasi irriconoscibili, anche se saranno pur sempre diverse. Tuttavia, esiste un teorema, noto come Teorema del campionamento di Nyquist-Shannon il quale afferma che superata una certa frequenza di campionamento fn, almeno doppia della massima frequenza rilevabile fM, l'orecchio umano non percepisce più alcuna differenza.

fn >= 2fM

Dato che l'uomo medio riesce a percepire da 20Hz fino a 20'000Hz, si è stabilito che 44'100Hz fosse un buon valore per la frequenza di campionamento (dato che è superiore a 20'000Hz * 2).
N.B.: la frequenza di campionamento non è il bitrate: la prima determina quante rilevazioni l'ADC debba fare al secondo, mentre il secondo determina la quantità di dati da riprodurre in un secondo.
Ora veniamo alla parte pratica.


L'Header
L'header costituisce la "testata" del file e contiene informazioni generali sulle modalità di riproduzione e altri aspetti che riguardano la versione di codifica eccetera. Anche se si potrebbe pensare così, non è posto sempre all'inizio dello stream, poiché, come vedremo, altre informazioni possono essere stipate prima dell'header principale. Esso è costituito da una sequenza ininterrotta di 32 bits, così suddivisi:

Offset Lunghezza Descrizione
0 11 Bits di riconoscimento
Questi 11 bits servono per riconoscere l'inizio dell'header. Tutti e undici sono impostati a 1 ed è quindi molto facile individuarli. Tanto per curiosità il numero binario da 11 bits 11111111111 è uguale al decimale 2047.
11 2 Bits di formato
Questi due bits possono assumere quattro diverse disposizioni, a seconda delle quali vengono distinte le diverse versioni del formato MPEG, secondo questo semplice schema:
  • 00 : MPEG Versione 2.5
  • 01 : Non utilizzato
  • 10 : MPEG Versione 2 (ISO/IEC 13818-3)
  • 11 : MPEG Version 1 (ISO/IEC 11172-3)
13 2 Bits di layer
Questi altri due bits servono invece a distinguere quale Layer, ossia quale codifica e per quali tipi di dato, venga usata. Ci sono tre tipi di Layer (1, 2, 3), e quello che stiamo analizzando è, ovviamente, il Layer 3 di Mp3. Le combinazioni possibili usate sono:
  • 00 : Non utilizzato
  • 01 : Layer 3
  • 10 : Layer 2
  • 11 : Layer 1
15 1 Bit di protezione
Questo singolo bit determina se il file è protetto da Crc. In questo caso, seguiranno altri 16 bits di controllo di cui non ci occuperemo. Il Crc è un sistema di controllo che serve per calcolare il checksum, di cui certamente avrete già sentito parlare. O no? Beh, in caso contrario forse questo vi rinferscherà la memoria. Avete mai provato ad aprire un file compresso corrotto (ad esempio zip o rar) e ricevere il messaggio "Checksum errato"? Il Checksum è un metodo che serve per controllare l'integrità di dati contenuti in un file e si attua, nel caso più semplice, sommando alcuni bytes di informazione e memorizzando il valore di questa somma. Il bit in questione, quindi, può essumere due valori: 1 se il file è protetto da questa mostruosità, altrimenti 0.
16 4 Bits di bitrate
Questi quattro bit indicano il bitrate del file, ossia quanti dati vengono eseguiti in un secondo, ed è misurato in kilobits per secondo (kbps). Anche in questo caso, la sequenza di bits non esprime un numero ma corrisponde a certi valori determinati che variano in funzione della versione del formato e del tipo di codifica. Se a qualche masochista interessa, ecco una tabella di tutti i valori supportati:

Bits M1 I M1 II M1 III M2 I M2 II e III
0000 Libero
0001 32 32 32 32 8
0010 64 48 40 48 16
0011 96 56 48 56 24
0100 128 64 56 64 32
0101 160 80 64 80 40
0110 192 96 80 96 48
0111 224 112 96 112 56
1000 256 128 112 128 64
1001 288 160 128 144 80
1010 320 192 160 160 96
1011 352 224 192 176 112
1100 384 256 224 192 128
1101 416 320 256 224 144
1110 448 384 320 256 160
1111 Non utilizzato
Legenda: M1 = MPEG versione 1, M2 = MPEG versione 2 e 2.5, I = Layer 1, II = Layer 2, III = Layer 3

I valori in cui è riportato il testo "Libero" sono arbitrariamente calcolabili dall'applicazione che legge il file. Gli altri valori, invece, rappresentano precisi bitrate che rimangono costanti per tutto il tempo di riproduzione. Ci sono, invero, altre particolari tecniche che consentono di cambiare il bitrate durante la riproduzione, ma non sono argomento trattato in questo tutorial.
20 2 Bits per la frequenza di campionamento
Questi due bits rappresentano la frequenza di campionamento usata. I valori che possono assumere i due bits sono:

Bits M1 M2 M2.5
00 44'100 22'050 11'025
01 48'000 24'000 12'000
10 32'000 16'000 8'000
11 Non utilizzato
22 1 Bit di riempimento
Questo è un bit di controllo e serve per stabilire se i frames presenti nel corpo del files (ossia i singoli pezzi di dato) abbiano una dimensione normale o leggermente eccedente. Viene usato dall'applicazione che legge e riproduce il file e può assumere i due valori 0 (dimensione normale) o 1 (dimensione eccedente).
23 1 Bit privato
Questo è un bit cosiddetto "privato", ossia non ha alcuno scopo nel file, ma è, per così dire, "regalato" al programmatore che ne può cambiare il valore a piacimento a seconda di cosa voglia fare l'applicazione. Ad esempio potrebbe essere impostato a 0 per i brani non ancora ascoltati e su 1 per quelli già ascoltati.
24 2 Bits di canale
Altri bits che servono, stavolta, per determinare la modalità di riproduzione.
  • 00 : Stereo
  • 01 : Joint-Stereo
  • 10 : Dual-Channel
  • 11 : Mono
Joint-Stereo è un particolare tipo di riproduzione Stereo dove anziché esserci i canali Left e Right (sinistro e destro), ci sono i canali Mid e Side (centrale e laterale): ha una resa particolarmente buona per un bitrate di 224kbps.
Dual-Channel è invece la tecnologia di un componente hardware che serve per raddopiare la velocità di trasferimento dei dati da e verso la RAM.
26 2 Bits di informazione sul canale Stereo
Questi due bits servono per determinare quale tipo di stereo venga usato se nel Layer III viene attivata la modalità Joint-Stereo (essi hanno una funzione diversa per i layer 1 e 2, ma noi ora ci stiamo occupando solo di mp3).
Il primo bit determina se è attivo il MS-Stereo, mentre il secondo se è attivo l'Intensity Stereo.
28 1 Bit di Copyright
Questo bit determina se c'è un Copyright sul file.
29 1 Bit di originalità
E questo determina se il file è un prodotto multimediale originale o se ne è una copia: 1 se è originale, altrimenti 0.
30 1 Bits di Emphasis
Gli ultimi due bits determinano l'Emphasis. Questo parametro viene utilizzato per determinare in che modo elminare il rumore dal suono, ma non è molto usato.


Riassumendo, quindi: In tutto 32 bits esatti, ossia 4 miseri bytes. Pensate che nelle dimensioni di un Int32 c'è tutta questa mole di informazioni.


Una prova pratica
Ora che siamo a conoscenza della struttura di un header, perchè non curiosare un po' dei file mp3? Non scriveremo un programma (per ora) ma ci limiteremo a fare una cosa manuale.
Prima di tutto, serve un Hex Editor, un programma che sia in grado di farci vedere un file aperto in modalità binaria, e che possa rappresentare ogni byte in binario, esadecimale e decimale. Se non possedete un Hex Editor (o se ce l'avete ma volete seguire il mio esempio), potete scaricare Neo Hex Editor Free: nonostante sia una versione freeware ha una quantità spropositata di funzioni ed è molto buono (oltre ad avere una bella interfaccia). Il file che analizzeremo è reperibile qui: si tratta della rapsodia ungara numero 2, di Franz Liszt, uno dei miei brani preferiti. Scaricatela e ascoltatela... poi continuate a leggere.
Aprite il file con l'hex editor. Per prima cosa dobbiamo individuare gli 11 bits di riconoscimento, e per fare questo, dato che i dati vengono rappresentati un byte alla volta (8bit), iniziamo col cercare un byte pieno di valore ff: selezionate il primo byte, poi fate Edit->Find (type = Hex Byte) e digitate ff.


Primo risultato


Il primo risultato che appare è un byte ff all'indirizzo 000000b2, ma come vedete ho evidenziato tre particolari in rosso. Il primo è il byte successivo, ossia 54, infatti se proviamo a metterli di fianco diventano:

ff 54 = 11111111 00110110

Noi però sappiamo che i bits di riconoscimento sono 11, mentre qui ce ne sono solo 8 di fila, quindi questo non è l'header del file mp3. Il secondo segno rosso indica i primi tre byte sotto forma di caratteri che iniziano il file: essi sono "ID3". Come vedremo, l'ID3 è un sistema di tag e frame usato per incapsualre all'interno del file mp3 informazioni aggiuntive. Poiché anch'esso ha una sua specifica dimensione era ovvio che quel byte non potesse essere l'inzio dell'header principale, ma questo non lo potevate sapere. Nel tutorial successivo è spiegato anche come leggere questi tag. Per ora continuaimo la ricerca, premendo F3. Arriviamo all'indirizzo 00001000, e vediamo i byte ff fb. Trasformiamo in binario:

ff fb = 11111111 11111011

Vediamo che sono presenti gli 11 bits di riconoscimento. In verità, non conoscendo la grandezza del tag ID3 (che è variabile), potrebbe anche essere una coincidenza. Esaminiamo i bit che vengono dopo, ossia 1101. Se si tratta dell'header principale, questi bits 4 bits dovranno rappresentare, a due a due: E in effetti questoè vero e si verifica guardano i valori riportati nella chilometrica tabella di sopra: Ma forse siete ancora diffidenti... dopotutto, se continuate la ricerca vedrete molti altri ff. Procediamo nell'analisi ottenendo ulteriori prove. L'ultimo bit di fb è il bit di protezione che, essendo impostato a 1, ci informa che su questo file c'è una protezione CRC, ma questo non è dettaglio essenziale. Invece possiamo ulteriormente controprovare che questo sia l'header principale controllando i successivi 4 bits del bitrate: dopotutto possiamo vederlo con mediaplayer. Guardando nell'ultimo cerchiolino rosso dell'immagine di sopra, si vede un pulsante con l'immagine di uno zero e un uno, che permette di modificare, e quindi anche di vedere, i bit corrispondenti al byte selezionato. Selezioniamo il byte successivo, 90 e clicchiamo sul pulsante appena introdotto. La finestra che si presenta è questa, ovviamente senza i miei scarabocchi rossi:


Il byte 90


  1. 4 bits di bitrate: dato che siamo in un MPEG 1, Layer 3, i bits 1001 corrispondo a 128kbps, valore che coincide con quello mostrato da media player e dall'explorer


    Il bitrate è proprio 128kbps
  2. 2 bits per la frequenza di campionamento: 00 in MPEG 1 corrispondono a 44'100Hz
  3. 1 bit di riempimento: 0, ossia lunghezza dei frames normale
  4. 1 bit privato: 0, non ancora utilizzato oppure impostato su False, chissà per quali scopi
E poi si può procedere con l'ultimo byte che non sto ad analizzare. Soddisfatti?





 

The Totem's Lair - Copyright (C) 2009
È vietata la riproduzione sia totale che parziale del sito.