Programa C para etiquetado ID3

Introducción:

Los archivos de audio digital pueden contener, además de la pista de audio, texto relacionado y/o información gráfica. La información con la que probablemente esté familiarizado toma la forma de título de la canción, nombre del artista, nombre del álbum, año y género. Esta es la información que se muestra cuando reproduce un archivo de audio digital en su computadora o dispositivo portátil.

El proceso de incluir información que no sea sonido en estos archivos de audio digital se conoce comúnmente como «etiquetado», en el que usted «etiqueta» el archivo de audio con información adicional que describe el archivo de audio. El estándar original para etiquetar archivos digitales fue desarrollado en 1996 por Eric Kemp y acuñó el término ID3. En ese momento, ID3 simplemente significaba «Identificar un MP3».

Versiones de ID3:

Hay principalmente 2 versiones de ID3, ID3v1 e ID3v2 como se describe a continuación:

1. ID3v1: el estándar MP3 no incluía un método para almacenar metadatos de archivos. En 1996, Eric Kemp tuvo la idea de agregar una pequeña porción de datos al archivo de audio, resolviendo así el problema. El método, ahora conocido como ID3v1, se convirtió rápidamente en el estándar para almacenar metadatos en MP3.

La etiqueta ID3v1 ocupa 128 bytes, comenzando con la string TAG 128 bytes desde el final del archivo. La etiqueta se colocó al final del archivo para mantener la compatibilidad con reproductores multimedia más antiguos. Algunos jugadores reproducirían una pequeña ráfaga de estática cuando leyeran la etiqueta, pero la mayoría la ignoró, y casi todos los jugadores modernos la omitirán correctamente. Esta etiqueta permite 30 bytes para cada título, artista, álbum y un «comentario», cuatro bytes para el año y un byte para identificar el género de la canción de una lista predefinida de 80 valores (Winamp luego amplió esta lista a 148 valores).

Michael Mutschler hizo una mejora a ID3v1 en 1997. Dado que el campo de comentarios era demasiado pequeño para escribir algo útil, decidió recortarlo en dos bytes y usar esos dos bytes para almacenar el número de pista. Estas etiquetas se conocen como ID3v1.1

2. ID3v2: en 1998, varios colaboradores crearon una nueva especificación denominada ID3v2.[13] Aunque lleva el nombre de ID3, su estructura es muy diferente a ID3v1.

Las etiquetas ID3v2 son de tamaño variable y generalmente aparecen al comienzo del archivo, lo que ayuda a la transmisión de medios, ya que los metadatos están esencialmente disponibles tan pronto como el archivo comienza a transmitirse en lugar de requerir que se lea todo el archivo primero, como es el caso de ID3v1. Las etiquetas ID3v2 constan de una serie de marcos, cada uno de los cuales contiene una pieza de metadatos. Por ejemplo, el marco TIT2 contiene el título y el marco WOAR contiene la URL del sitio web del artista. Los marcos pueden tener una longitud de hasta 16 MB, mientras que el tamaño total de la etiqueta está limitado a 256 MB. El problema de la internacionalización se resolvió al permitir la codificación de strings no solo en ISO-8859-1, sino también en Unicode. ID3v2 tiene subclasificaciones adicionales a 3 versiones como ID3v2.2, ID3v2.3 e ID3v2.4 con cambios menores en los marcos entre ellos.

Etiquetadores ID3:

Las etiquetas ID3 se pueden editar de varias maneras. En algunas plataformas, las propiedades del archivo se pueden editar visualizando información ampliada en el administrador de archivos. Además, la mayoría de los reproductores de audio permiten editar archivos individuales o en grupos. La edición de grupos de archivos a menudo se denomina «etiquetado por lotes». También existen aplicaciones especializadas, llamadas etiquetadores, que se concentran específicamente en editar las etiquetas y tareas relacionadas. Algunos, como puddletag, ofrecen funciones avanzadas como el etiquetado por lotes avanzado o la edición basada en expresiones regulares.

A continuación se muestra el código para implementar su propio etiquetador.

Ejemplos:

Input: Input MP3 file name which needs to tagged like input.mp3 and output MP3 
file name which would be created as a tagged MP3 file like output.mp3.

Output: MP3 file with tagging information as entered by the user.

A continuación se muestra el código C para implementar su propio etiquetador:

// C program for ID3 tagging of music files
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
  
struct tags // Structure to store tagging information.
{
    char title[100], artist[100], album[100], 
         track_num[100], year[100], genre[100];
};
  
void merge_file(char* file1, char* file2, char* file3)
{
    FILE *f1, *f2, *f3;
    int ch;
    f1 = fopen(file1, "rb"); // Opening in write mode.
    f2 = fopen(file2, "rb");
    f3 = fopen(file3, "wb");
  
    if (f1 == NULL || f2 == NULL) {
        exit(EXIT_FAILURE);
    }
  
    while ((ch = fgetc(f1)) != EOF) // Appending tagging info.
        fputc(ch, f3);
  
    while ((ch = fgetc(f2)) != EOF) // Appending media file info.
        fputc(ch, f3);
  
    // Closing the files.
    fclose(f1);
    fclose(f2);
    fclose(f3);
}
  
void tagging(char* file1, char* file2, char* file3)
{
    int size = 0;
    char clean[100];
    struct tags t;
    unsigned char pad1[7] = { 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76 };
    unsigned char pad2[3] = { 0x00, 0x00, 0x00 };
  
    FILE* f1;
    f1 = fopen(file1, "wb");
  
    fprintf(f1, "ID3");
    fwrite(pad1, sizeof(pad1), 1, f1); /*Essential tag to identify 
                                        as an ID3 tagged media file.*/
  
    gets(clean); // Clearing the input stream.
  
    // Taking input from user.
    printf("\nEnter the title of the mp3:");
    scanf("%[^\n]%*c", t.title);
  
    printf("\nEnter the artist of the mp3:");
    scanf("%[^\n]%*c", t.artist);
  
    printf("\nEnter the album of the mp3.\n");
    scanf("%[^\n]%*c", t.album);
  
    printf("\nEnter the year of the mp3.\n");
    scanf("%[^\n]%*c", t.year);
  
    printf("\nEnter the track number of the mp3.\n");
    scanf("%[^\n]%*c", t.track_num);
  
    // Track Number
    // Tag to identify track number.
    fprintf(f1, "TRCK"); 
  
    // Essential 3 NULL bits required for separation.
    fwrite(pad2, sizeof(pad2), 1, f1); 
  
    size = strlen(t.track_num);
    size++; // Calculating size.
  
     // Appending the size of the track number to tag.
    fprintf(f1, "%c", size);
  
    // Essential 3 NULL bits required for separation.
    fwrite(pad2, sizeof(pad2), 1, f1);
  
    // Adding tag number entered by the user.
    fprintf(f1, "%s", t.track_num); 
  
    // Print Year
    fprintf(f1, "TYER"); 
    fwrite(pad2, sizeof(pad2), 1, f1); 
    size = strlen(t.year);
    size++; // Calculating size.
    fprintf(f1, "%c", size);
    fwrite(pad2, sizeof(pad2), 1, f1); 
    fprintf(f1, "%s", t.year); 
  
    // Print Title
    fprintf(f1, "TIT2"); 
    fwrite(pad2, sizeof(pad2), 1, f1); 
    size = strlen(t.title);
    size++; // Calculating size.
    fprintf(f1, "%c", size);
    fwrite(pad2, sizeof(pad2), 1, f1); 
    fprintf(f1, "%s", t.title);
  
    // Print Artist
    fprintf(f1, "TPE1"); 
    fwrite(pad2, sizeof(pad2), 1, f1); 
    size = strlen(t.artist);
    size++; // Calculating size.
    fprintf(f1, "%c", size);
    fwrite(pad2, sizeof(pad2), 1, f1); 
    fprintf(f1, "%s", t.artist); 
  
    // Print Album
    fprintf(f1, "TALB"); 
    fwrite(pad2, sizeof(pad2), 1, f1); 
    size = strlen(t.album);
    size++; // Calculating size.
    fprintf(f1, "%c", size);
    fwrite(pad2, sizeof(pad2), 1, f1); 
    fprintf(f1, "%s", t.album); 
  
    // Print Genre
    fprintf(f1, "TCON"); // Tag to identify genre.
    fwrite(pad2, sizeof(pad2), 1, f1);
    size = strlen(t.genre);
    size++; // Calculating size.
    fprintf(f1, "%c", size); 
    fwrite(pad2, sizeof(pad2), 1, f1); 
    fprintf(f1, "%s", t.genre); 
  
    fclose(f1); // Closing the file.
}
  
int main()
{
    char file1[100] = "media_info.txt", file2[100], file3[100];
  
    printf("\nEnter the input mp3 file name\n");
    scanf("%s", file2);
    printf("\nEnter the output mp3 file name\n");
    scanf("%s", file3);
  
    // Function to append media info to input file.
    tagging(file1, file2, file3); 
  
    // Function to merge media info and media
    // input file.
    merge_file(file1, file2, file3); 
    return 0;
}

Nota: La carpeta en la que está ejecutando el código debe contener su archivo input.mp3.

Referencias:
http://id3.org/id3v2.3.0
https://en.wikipedia.org/wiki/ID3#ID3v2

Publicación traducida automáticamente

Artículo escrito por Aditya Gupta 4 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *