Cargando la página...

Cómo leer y escribir meta información en archivos mp3 - ID3v1 a fondo

Publicado por Gastón el 21/03/2009 en PHP - Nivel Básico

Tabla de contenidos

Avatar de

La tabla de contenidos pertenece al artículo completo y no al contenido parcial de cada página del mismo si fuese el caso.

Leer los comentarios.

Resúmen

Supongamos que tenemos un sitio de música y tenemos infinidad de archivos mp3. Toda la información sobre titulos, artistas, albumes, años de publicación, incluso generos, pueden permanecer en el propio archivo mp3. Aprendamos como gestionar esta información facilmente con PHP.

Sobre el autor

Avatar de Gastón

Gastón tiene 31 años, vive en Argentina / Santa Fe / Santa Fe y su ocupación es Desarrollador de aplicaciones web.

Forma parte del club desde 19/10/2009 a las 20:52 habiendo estado en linea ayer a las 18:27 por última vez.

Ha publicado 50 artículos en clubdesarrolladores con un promedio de valoración de 7.96 puntos. Puedes visitar su sitio web en http://www.devstudios.com.ar

Estadísticas

  • Leido 3166 veces
  • Valorado 6.50 puntos

ID3v1



El ID3v1 es un bloque de 128 bytes que se agrega al final del archivo de música mp3 y que contiene información sobre dicho tema. Ya sea el nombre del tema, el artista, el album, el año de publicación, un comentario y por último el genero.

Lo que voy a enseñar es como leer y escribir esta información al final de los archivos mp3, esté o no esté, porque puede ser que el archivo no tenga esta información incrustada al momento de accederlo.

Cabe aclarar que existe ID3v2, que nos permite almacenar mas información como compositores, etc., pero a eso lo veremos en otro artículo.

Les voy a presentar la estructura del ID3v1 para que sea más facil de ver.

ID3v1
{
Tag: 3 bytes; //Es la marca que indica la existencia de la firma, debe ser igual a 'TAG'
Title: 30 bytes; //El nombre del tema en si
Artist: 30 bytes; //El grupo o solista que interpreta el tema, no confundir con el compositor
Album: 30 bytes; //El nombre del album o disco en el que se incluye el tema
Year: 4 bytes; //El año de publicación del tema en formato AAAA
Comment: 30 bytes; //Un comentario para el tema :)
Genre: 1 byte; // El genero al que pertenece el tema, es un valor entre 0 y 255
}


Para los generos tenemos 256 valores diferentes, indicados por un entero de 1 byte (Genre), sin embargo actualmente no se utilizan estos 256. En nuestro ejemplo usaremos 147 generos y los colocaremos en un array:

$GENRES = array('Blues', 'Classic Rock', 'Country', 'Dance', 'Disco', 'Funk', 'Grunge', 'Hip-Hop', 'Jazz', 'Metal', 'New Age', 'Oldies', 'Other', 'Pop', 'R&B', 'Rap', 'Reggae', 'Rock', 'Techno', 'Industrial', 'Alternative', 'Ska', 'Death Metal', 'Pranks', 'Soundtrack', 'Euro-Techno', 'Ambient', 'Trip-Hop', 'Vocal', 'Jazz+Funk', 'Fusion', 'Trance', 'Classical', 'Instrumental', 'Acid', 'House', 'Game', 'Sound Clip', 'Gospel', 'Noise', 'AlternRock', 'Bass', 'Soul', 'Punk', 'Space', 'Meditative', 'Instrumental Pop', 'Instrumental Rock', 'Ethnic', 'Gothic', 'Darkwave', 'Techno-Industrial', 'Electronic', 'Pop-Folk', 'Eurodance', 'Dream', 'Southern Rock', 'Comedy', 'Cult', 'Gangsta', 'Top 40', 'Christian Rap', 'Pop/Funk', 'Jungle', 'Native American', 'Cabaret', 'New Wave', 'Psychadelic', 'Rave', 'Showtunes', 'Trailer', 'Lo-Fi', 'Tribal', 'Acid Punk', 'Acid Jazz', 'Polka', 'Retro', 'Musical', 'Rock & Roll', 'Hard Rock', 'Folk', 'Folk-Rock', 'National Folk', 'Swing', 'Fast Fusion', 'Bebob', 'Latin', 'Revival', 'Celtic', 'Bluegrass', 'Avantgarde', 'Gothic Rock', 'Progressive Rock', 'Psychedelic Rock', 'Symphonic Rock', 'Slow Rock', 'Big Band', 'Chorus', 'Easy Listening', 'Acoustic', 'Humour', 'Speech', 'Chanson', 'Opera', 'Chamber Music', 'Sonata', 'Symphony', 'Booty Bass', 'Primus', 'Porn Groove', 'Satire', 'Slow Jam', 'Club', 'Tango', 'Samba', 'Folklore', 'Ballad', 'Power Ballad', 'Rhythmic Soul', 'Freestyle', 'Duet', 'Punk Rock', 'Drum Solo', 'Acapella', 'Euro-House', 'Dance Hall', 'Goa', 'Drum & Bass', 'Club-House', 'Hardcore', 'Terror', 'Indie', 'BritPop', 'Negerpunk', 'Polsk Punk', 'Beat', 'Christian Gangsta Rap', 'Heavy Metal', 'Black Metal', 'Crossover', 'Contemporary Christian', 'Christian Rock', 'Merengue', 'Salsa', 'Trash Metal', 'Anime', 'Jpop', 'Synthpop');


Leer ID3v1 desde PHP



La lectura desde PHP es muy simple, asi que sin más aclaraciones les muestro el código fuente:

function readID3v1($filename)
{
global $GENRES;
$handle = fopen($filename, "rb");
fseek($handle, -128, SEEK_END);
$data = fread($handle, 128);
fclose($handle);
$ID3v1['Tag'] = substr($data, 0, 3);
$ID3v1['Title'] = substr($data, 3, 30);
$ID3v1['Artist'] = substr($data, 33, 30);
$ID3v1['Album'] = substr($data, 63, 30);
$ID3v1['Year'] = substr($data, 93, 4);
$ID3v1['Comment'] = substr($data, 97, 30);
$ID3v1['Genre'] = $GENRES[ord(substr($data, 127))];
return $ID3v1;
}


Lo implementé como una función que recoge el nombre del archivo y retorna un array con los valores rescatados del archivo en cuestión. Se trata de un array asociativo.

Escribir ID3v1 desde PHP



Para escribir debemos proporcionarle a esta función el nombre del archivo mp3 y un array como el que retorna readID3v1 con los valores que deseamos grabar en el archivo.

function writeID3v1($filename, $ID3v1)
{
global $GENRES;
$aux = readID3v1($filename);
$handle = fopen($filename, "ab");
if ($aux['Tag'] == 'TAG')
{
fseek($handle, -128, SEEK_END);
}
$id3v1_string = 'TAG';
$id3v1_string .= str_pad($ID3v1['Title'], 30);
$id3v1_string .= str_pad($ID3v1['Artist'], 30);
$id3v1_string .= str_pad($ID3v1['Album'], 30);
$id3v1_string .= str_pad($ID3v1['Year'], 4);
$id3v1_string .= str_pad($ID3v1['Comment'], 30);
$genre = array_keys($GENRES, $ID3v1['Genre']);
$id3v1_string .= chr($genre[0]);
fwrite($handle, $id3v1_string, 128);
fclose($handle);
}


Como se puede apreciar es sumamente simple gestionar el id3v1 y permite tener en el mismo mp3 información bastante útil.
Basandose en estas funciones se pueden escribir clases que pueden servir para un sistema que administre colecciones, o simplemente para actualizar nuestras colecciones de mp3.

Si tiene alguna pregunta sobre éste artículo por favor deje un comentario y será respondido.

También recuerde que éste artículo tiene descargas disponibles.

Descargas

descarga Ejemplo - Gestionar ID3v1 desde PHP (21.03.09 | 79 descargas | 1.45 Kbytes) Más información:

Comentarios

Sus comentarios son importantes.

Listado de comentarios

No hay comentarios para listar, si desea puede crear el primer comentario para este artículo.

Agregar un comentario

Debe estar identificado para agregar un comentario