Lector De Etiquetas Para Archivos De Audio En C#

Este programa lee y extrae las etiquetas ID3 versión 1 de un archivo de audio, concretamente los últimos 128 bytes, que contienen información de metadatos como el título, el artista, el álbum, el año, el comentario y el género. Comprueba si el bloque ID3 existe al final del archivo y si el encabezado contiene el identificador "TAG" correcto. El programa extrae y muestra los metadatos, incluyendo el título, el artista, el álbum, el año, el comentario y el género (como un número, correspondiente a un género predefinido en el estándar). El género se representa como un valor de un solo byte y se utiliza una lista predefinida para interpretar el número de género.



Grupo

Manejo de archivos en C#

Objectivo

1. Abra el archivo de audio para leerlo en modo binario.
2. Compruebe si los últimos 128 bytes contienen el encabezado "TAG" que identifica la etiqueta ID3.
3. Extraiga los siguientes campos de la etiqueta ID3:
- Título: 30 caracteres
- Artista: 30 caracteres
- Álbum: 30 caracteres
- Año: 4 caracteres
- Comentario: 30 caracteres
- Género: 1 byte (un entero que representa un género predefinido)

4. Muestre los datos extraídos en un formato legible, convirtiendo el número de género a su género musical correspondiente.
5. Gestione los casos en los que el archivo no contiene una etiqueta ID3.

Las especificaciones ID3 se aplican a cualquier archivo o contenedor audiovisual, pero se utilizan principalmente con contenedores de audio. Existen tres versiones compatibles de la especificación. Por ejemplo, un archivo puede contener simultáneamente las etiquetas de la versión 1.1 y la versión 2.0; en este caso, el reproductor multimedia debe determinar cuáles son relevantes.
La versión 1 de ID3 es una especificación muy sencilla. Implica añadir un bloque fijo de 128 bytes al final del archivo en cuestión. Este bloque contiene las siguientes etiquetas:
Un encabezado que identifica la presencia del bloque ID3 y su versión. Específicamente, este encabezado consta de los caracteres "TAG".
- Título: 30 caracteres.
- Artista: 30 caracteres.
- Álbum: 30 caracteres.
- Año: 4 caracteres.
- Comentario: 30 caracteres.
- Género (música): 1 carácter.

Todas las etiquetas utilizan caracteres ASCII, excepto el género, que es un número entero almacenado en un solo byte. El género musical asociado a cada byte está predefinido en las definiciones estándar e incluye 80 géneros numerados del 0 al 79. Algunos programas de etiquetado han ampliado los géneros predefinidos a más de 79.

Ejemplo de ejercicio en C#

 Copiar código C#
using System;
using System.IO;
using System.Text;

class ID3Reader
{
    // Main method to execute the reading and parsing of ID3 version 1 tags
    static void Main(string[] args)
    {
        // Prompt the user for the audio file path
        Console.WriteLine("Please enter the path of the audio file:");
        string filePath = Console.ReadLine();

        // Check if the file exists
        if (!File.Exists(filePath))
        {
            Console.WriteLine("File does not exist.");
            return; // Exit the program if the file doesn't exist
        }

        try
        {
            // Open the audio file in read-only mode using FileStream
            using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
            {
                // Move to the last 128 bytes of the file (ID3v1 tag location)
                fs.Seek(-128, SeekOrigin.End);

                // Read the last 128 bytes into a byte array
                byte[] id3Tag = new byte[128];
                fs.Read(id3Tag, 0, 128);

                // Check if the tag header contains "TAG" (ID3v1 identifier)
                if (Encoding.ASCII.GetString(id3Tag, 0, 3) == "TAG")
                {
                    // Extract the title, artist, album, year, comment, and genre
                    string title = Encoding.ASCII.GetString(id3Tag, 3, 30).Trim();
                    string artist = Encoding.ASCII.GetString(id3Tag, 33, 30).Trim();
                    string album = Encoding.ASCII.GetString(id3Tag, 63, 30).Trim();
                    string year = Encoding.ASCII.GetString(id3Tag, 93, 4).Trim();
                    string comment = Encoding.ASCII.GetString(id3Tag, 97, 30).Trim();
                    byte genreByte = id3Tag[127]; // Genre is stored in the last byte

                    // Define a list of predefined genres (just a few as an example)
                    string[] genres = new string[]
                    {
                        "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", "Pop/Funk", "Jungle", "Native American", "Cabaret",
                        "New Wave", "Psychadelic", "Rave", "Showtunes", "Trailer", "Lo-Fi", "Trance", 
                        "Classical", "Instrumental", "Acid", "House", "Game", "Sound Clip", "Gospel",
                        "Noise", "AlternRock", "Bass", "Soul", "Punk", "Space", "Meditative", "Instrumental"
                    };

                    // Display the extracted metadata
                    Console.WriteLine("Title: " + title);
                    Console.WriteLine("Artist: " + artist);
                    Console.WriteLine("Album: " + album);
                    Console.WriteLine("Year: " + year);
                    Console.WriteLine("Comment: " + comment);
                    Console.WriteLine("Genre: " + (genreByte >= 0 && genreByte < genres.Length ? genres[genreByte] : "Unknown"));
                }
                else
                {
                    Console.WriteLine("No ID3v1 tag found in the file.");
                }
            }
        }
        catch (Exception ex)
        {
            // Handle any errors that occur during file reading or parsing
            Console.WriteLine("An error occurred: " + ex.Message);
        }
    }
}

 Output

//Given the audio file contains an ID3 tag, the program will display:
Please enter the path of the audio file:
C:\path\to\audio.mp3
Title: My Song
Artist: Some Artist
Album: My Album
Year: 2021
Comment: Great song!
Genre: Rock

//If no ID3 tag is found, the program will output:
Please enter the path of the audio file:
C:\path\to\audio.mp3
No ID3v1 tag found in the file.

Comparte este ejercicio de C#

Practica más ejercicios C# de Manejo de archivos en C#

¡Explora nuestro conjunto de ejercicios de práctica de C#! Diseñados específicamente para principiantes, estos ejercicios te ayudarán a desarrollar una sólida comprensión de los fundamentos de C#. Desde variables y tipos de datos hasta estructuras de control y funciones simples, cada ejercicio está diseñado para desafiarte gradualmente a medida que adquieres confianza en la programación en C#..

  • Convertidor simple de C a C#

    Este programa está diseñado para convertir programas C sencillos a código C#. Toma un programa C como entrada y lo traduce a un programa C# correspondiente que se compila y ejecuta...

  • Programa separador de archivos en C#

    Este programa permite dividir un archivo de cualquier tipo en fragmentos más pequeños de un tamaño específico. El programa toma dos parámetros: el nombre del archivo a dividir y el...

  • Programa para 'cifrar-descifrar' archivos de imagen BMP en C#

    Este programa permite cifrar y descifrar archivos de imagen BMP manipulando la marca "BM" ubicada en los dos primeros bytes del archivo. El programa cambia la marca "BM" al princip...

  • Convertidor de CSV a texto en C#

    Este programa lee un archivo CSV que contiene cuatro bloques de datos por línea. Los tres primeros son textuales (nombre, apellidos y ciudad) y el último es numérico (edad). Proces...

  • Programa de comparación de archivos en C#

    Este programa de C# compara dos archivos de cualquier tipo (texto, binario, etc.) para determinar si son idénticos. El programa lee el contenido de ambos archivos y comprueba si ca...

  • Descodificador de imágenes Netpbm en C#

    Este programa en C# decodifica un archivo de imagen Netpbm (específicamente el tipo "P1") y muestra su contenido en la consola. El programa lee el encabezado, las dimensiones y los...