Libreria di informazioni sui files MPEG Audio per .NET

Sommario

A cosa serve la libreria

Lo scopo è semplice: permettere di estrarre informazioni audio da un file MPEG. Sicuramente tutti conoscete gli MP3 (che non sta altro per MPEG Layer-3). In realtà gli MP3 non sono altro che files MPEG senza video. Grazie a questo condividono con gli MPEG tutte le caratteristiche che andremo ad esaminare. Vi anticipo subito che la tiritera teorica può non esservi gradita quindi potete benissimo saltare il prossimo capitolo :-).

Sommario

Il formato MPEG

Il formato MPEG (motion-picture expert group) ha avuto la sua massima espansione grazie agli algoritmi di compressione dell'audio. Il vero punto di forza, però, è la sua grande flessibilità. L'MPEG ha potuto così mantenersi allo stato dell'arte, cavalcando, fra l'altro, l'onda del Dolby Pro Logic. Come tristemente noi programmatori abbiamo imparato, quando si sente la parola "flessibilità" ci suona un campanellino in testa. Ed è il campanellino dei guai.

Il formato MPEG è un formato "segmentato". Ciò vuol dire che ci sono tanti segmenti autonomi montati uno in seguito all'altro. Ogni segmento contiene informazioni sufficienti per sè stesso e non è assolutamente conscio dei segmenti seguenti.

Qui a fianco vedete uno schema del frame. Come potete notare l'intestazione è a monte e i dati sono sotto. Nell'intestazione sono specificati sia la lunghezza dell'header sia quella della parte dati. Nello header sono memorizzate tutte le informazioni necessarie per decomprimere il chunk sottostante: bitrate, frequenza e codec sono codificate in una struttura ben definita. La libreria la incapsula nella class MindFlavor.MPEG.Audio.Header.

Immagine 1 - MPEG Frame header

Il file MPEG è quindi una serie di frames, ciascuno indipendente dagli altri. Per questo motivo è sempre possibile riprodurre un file MPEG anche se ne è ottenuto metà (ad esempio da un download). E' sufficiente che sia leggibile un singolo frame header perchè sia possibile decodificare uno spezzone. Certi tipi di files hanno la dimensione dei frame che varia in funzione del bitrate e della compressione. Questi particolari tipi di files sono detti a bitrate variabile (VBR - variable bit rate).

Il tag ID3v1

I flussi audio hanno poi la peculiarità di poter avere il tag informativo. Questo tag particolare è conosciuto come ID3v1 tag ed è in fondo al file. La versione ID3v2 è posta all'inizio ed è caratterizzata dal fatto che ha i campi di lunghezza variabile. Questa libreria supporta la versione ID3v1 del tag sia in lettura che in scrittura.

Il vantaggio fondamentale del tag versione 1 è che permette la riscrittura diretta. Avendo i campi di dimensione fissa è possibile modificarli con un seek dell'hard disk. La versione 2 infatti spesso obbliga a compiere uno shift a tutti i frames seguenti (con conseguente decadimento prestazionale). La versione 1 è, però, a lunghezza fissa; tutto il tag deve essere lungo 128 bytes (2^7).

Immagine 2 - ID3v1 Tag

Campo Offset Lunghezza Commento
Tag 0 3 Deve essere presente e deve essere TAG. Questi tre bytes definiscono l'inizio del tag ID3v1.
Titolo 3 30
Artista 33 30
Album 63 30
Anno 93 4
Commento 97 30
Genere 127 1 Il byte genere rappresenta un lookup. Lo standard de facto in questo campo è stato definito da WinAmp.

Immagine 3 - ID3v1 Tag (specifico)

Non preoccupatevi troppo della lunghezza dei campi che passate alla mia libreria. Se sono troppo lunghi verranno automaticamente troncati per rispettare le specifiche.

Sommario

Installazione

Scaricate il file compresso. Decomprimetelo in una cartella temporanea. Nello zip c'è la DLL pronta per essere usata e il file help in formato HTML compresso. Una volta decompresso potete installare la DLL nel global assembly cache (GAC) oppure inserirla in una cartella di staging. Per installarla nel GAC aprite una shell di comando e digitate
gacutil /i MindFlavor.Audio.dll.

Sommario

Usare la libreria

Usare la libreria è decisamente facile. Semplicemente create una nuova istanza della class MindFlavor.MPEG.Information passando nel costruttore il nome del file (ad es. MP3) che volete scandire. Per la documentazione on-line cliccate qui.

Vediamo un pò di codice di esempio:

Information info = new Information("C:\\mp3\\audio.mp3", 1);

In questo modo otteniamo le informazioni del file MPEG audio.mp3, scansionando soltanto il primo header (passando 1 come è secondo parametro).

if(info.Tag != null)
{
	Console.WriteLine(info.Tag.Title);
	Console.WriteLine(info.Tag.Artist);
	Console.WriteLine(info.Tag.Album);
	Console.WriteLine(info.Tag.Comment);
	Console.WriteLine(info.Tag.Year.ToString());
	Console.WriteLine(info.Tag.Genre.ToString());
}

Ora abbiamo stampato sulla console alcune informazioni del tag ID3v1. Il check se è null o meno è necessario perchè alcuni flussi mp3 potrebbero non avere il tag (ad esempio quelli corrotti).

lblVersion.Text = info.Headers[0].VersionID.ToString() + ", " + 
	info.Headers[0].Layer.ToString();

if(info.IsVBR)
	Console.WriteLine("VBR (" + info.AverageBitRate + " Kbs)");
else
	Console.WriteLine(info.Headers[0].BitRate.ToString());

Console.WriteLine(info.Headers[0].PositionInBytes.ToString());
Console.WriteLine(info.Headers[0].Emphasis.ToString());
Console.WriteLine(info.Headers[0].ChannelMode.ToString());
Console.WriteLine(info.Headers[0].IsCopyrighted.ToString());
Console.WriteLine(info.Headers[0].SamplingRate + " Hertz");
Console.WriteLine(info.Headers[0].IsOriginal.ToString());
Console.WriteLine(info.Headers[0].IsFramePadded.ToString());

Ora invece abbiamo mostrato alcune informazioni sul primo header. Dato che nel costruttore abbiamo scelto di scansionare solo il primo questo sarà l'unico header disponibile nell'array Headers.

In caso volessimo operare delle modifiche al tag bisognerà ricordarsi di chiamare il metodo UpdateFileTag.

Sommario

Applicazione dimostrativa

Per testare le potenzialità della classe ho scritto una semplicissima applicazione form. Lo screenshot sotto mostra un esecuzione. La potete scaricare dalla sezione downloads.

Utilizzare l'applicazione è facile. Una volta lanciata inserite la directory in cui ci sono alcuni files mp3. Si popolerà l'elenco (come in figura). Semplicemente selezionando i files dell'elenco vi verranno mostrate tutte le informazioni raccolte. A scopo puramente didattico è possibile modificare il titolo della canzone selezionata e poi rendere persistenti i cambiamenti premendo il pulsante Set. Notate come eseguendo modifiche ma non rendendole persistenti il valore memorizzato non cambi.

Insieme ai binari compilati viene scaricato anche il codice sorgente completo.

Immagine 4 - Applicazione di test (cliccare per ingrandire)

Sommario

Download

Libreria

Versione Data Dimensione Download
1.3.1351.662 13 Settembre 2003
42 KB

Applicazione di esempio

Versione Data Dimensione Download
1.0 (con sorgenti) 14 Settembre 2003
73 KB

Sommario

Data ultimo aggiornamento: 13 Dicembre 2002
Francesco Cogno