Pista de audio de disco compacto

El formato de archivo CDA es un formato de Microsoft que cumple con la especificación RIFF .

Los archivos CDA (Compact Disc Audio) son generados por Windows cuando este sistema operativo accede a un CD de audio . Cada título del CD de audio se ve entonces como un archivo de 44 bytes con la extensión ".cda". Los archivos se denominan "Track01.cda", "Track02.cda", etc.

El archivo .cda copiado a la computadora es inútil sin el CD, ya que es solo un acceso directo al CD.

Los archivos CDA no existen como tales en el CD de audio. Son una especie de atajo creado por Windows, que apunta al área del CD que contiene las muestras de sonido.

Organizar un archivo CDA

compensar largo contenido
0x00 4 los 4 caracteres ASCII "RIFF"
0x04 4 el tamaño del siguiente fragmento: siempre 36 (44 - 8), en 4 bytes (orden de Intel)
0x08 4 identificador de fragmento: los 4 caracteres ASCII "CDDA"
0x0C 4 los 3 caracteres ASCII "fmt" seguidos de un espacio
0x10 4 longitud del fragmento: siempre 24, en 4 bytes (orden de Intel)
0x14 2 Versión en formato CD, en 2 bytes (pedido Intel). EnMayo de 2006, es siempre 1.
0x016 2 número del rango, en 2 bytes (orden Intel). La primera pista tiene el número 1.
0x18 4 identificador calculado por Windows para cdplayer.exe.
0x1c 4 desplazamiento del rango, en número de cuadros (orden Intel)
0x20 4 duración del rango, en número de cuadros (orden de Intel)
0x24 1 posición del rango: marcos
0x25 1 posición de la pista: segundos
0x26 1 posición de la playa: minutos
0x27 1 un byte nulo (valor binario 0)
0x28 1 duración del rango: fotogramas
0x29 1 duración de la pista: segundos
0x2a 1 duración de la playa: minutos
0x2b 1 un byte nulo (valor binario 0)

Al fijarse el tamaño de un archivo CDA, así como su organización, siempre hay un solo fragmento único, llamado "CDDA" (que significa disco compacto para audio digital ).

El identificador creado por Windows lo utiliza el reproductor de CD de Windows 95 y Windows 98 (cdplayer.exe). Este reproductor no se puede conectar a FreeDB o CDDB . Para que muestre el nombre del artista y el título de la canción, debe ingresar manualmente esta información en el archivo cdplayer.ini (en el directorio de instalación de Windows ), en una sección que lleva el nombre de este identificador. Este identificador no tiene relación con el DiscId utilizado por FreeDB o CDDB , es una creación puramente de Microsoft , para el uso mencionado anteriormente.

La posición y la longitud de los rangos utilizan marcos como una unidad. Hay 75 cuadros por segundo . Es el bloque de datos más pequeño que se puede leer de un CD de audio, correspondiente a un sector del CD.

Toda la información que requiere varios bytes se codifica con el byte de orden de Intel (little endian).

Ejemplo de análisis de un archivo CDA, en Perl

El programa de demostración suministrado es un script de Perl. El script debe iniciarse con un parámetro: la ruta al directorio o el disco que contiene los archivos CDA.

#! /bin/perl -w use strict; my $path_cda; # chemin vers les CDA (paramètre du script) my $data_cda; # contenu d'un fichier CDA my @liste_cda; # la liste des fichiers CDA du répertoire my $fic_cda; # le nom du fichier CDA courant my $mins; my $secs; my $frames; # tester qu'un argument a été fourni $path_cda = shift; die("argument: le nom du répertoire") if (!defined($path_cda)); # ouvrir, lire, puis refermer le fichier CDA opendir(DIR_CDA, $path_cda) or die ("impossible d'ouvrir le répertoire $path_cda"); @liste_cda = grep /.*cda$/i, readdir(DIR_CDA); closedir(DIR_CDA); print "plage début durée début durée\n"; print " frames frames min:sec:frm min:sec:frm\n"; foreach $fic_cda (@liste_cda) { # charger le contenu du fichier CDA dans une variable open(CDA, "<:raw", $path_cda.$fic_cda) or die("impossible d'ouvrir le fichier $fic_cda"); $data_cda = <CDA>; close(CDA); # vérifier la taille du fichier, et le header die "taille invalide" if (length($data_cda) != 44); die "entête invalide" if (substr($data_cda, 0, 0x0f) ne "RIFF\$\x00\x00\x00CDDAfmt"); # afficher le numéro de la plage printf sprintf("%02d ", ord(substr($data_cda, 0x16, 1))); # afficher les informations sur la plage : position en frames $frames = unpack("V", substr($data_cda, 0x1c, 4)); printf sprintf("%06d ", $frames); # afficher les informations sur la plage : durée en frames $frames = unpack("V", substr($data_cda, 0x20, 4)); printf sprintf("%06d ", $frames); # afficher les informations sur la plage : position min:sec:frames ($frames, $secs, $mins) = unpack("CCC", substr($data_cda, 0x24, 3)); printf sprintf("%02d:%02d:%02d = %06d frm ", $mins, $secs, $frames, ((($mins * 60) + $secs) * 75) + $frames); # afficher les informations sur la plage : durée min:sec:frames ($frames, $secs, $mins) = unpack("CCC", substr($data_cda, 0x28, 3)); printf sprintf("%02d:%02d:%02d = %06d frm", $mins, $secs, $frames, ((($mins * 60) + $secs) * 75) + $frames); print "\n"; }

En las columnas que muestran la posición y la duración en minutos: segundos: formato de fotogramas, el script agrega el número de fotogramas equivalente a esta duración. La posición en ambos sistemas debería ser la misma. En la práctica, sin embargo, se observa una diferencia de 150 fotogramas, correspondiente a los 2 segundos de pregap (ver Libro Rojo ).

Resultados de la secuencia de comandos

El guión anterior fue lanzado en el álbumSome Great Reward  " de Depeche Mode . Los resultados se copian a continuación, se ha agregado una columna de "longitud de la manga" que contiene la duración indicada en la manga.

plage début durée début durée durée pochette frames frames min:sec:frm min:sec:frm 01 000032 017015 00:02:32 = 000182 frm 03:46:65 = 017015 frm 3:46 02 017047 022780 03:49:22 = 017197 frm 05:03:55 = 022780 frm 5:03 03 039827 017398 08:53:02 = 039977 frm 03:51:73 = 017398 frm 3:51 04 057225 021387 12:45:00 = 057375 frm 04:45:12 = 021387 frm 4:45 05 078612 014570 17:30:12 = 078762 frm 03:14:20 = 014570 frm 3:14 06 093182 020045 20:44:32 = 093332 frm 04:27:20 = 020045 frm 4:27 07 113227 018970 25:11:52 = 113377 frm 04:12:70 = 018970 frm 4:12 08 132197 021068 29:24:47 = 132347 frm 04:40:68 = 021068 frm 4:40 09 153265 028952 34:05:40 = 153415 frm 06:26:02 = 028952 frm 6:26

Encontramos la diferencia de dos segundos entre los dos campos de "posición".
La duración mostrada por un reproductor de CD o por un software de reproducción puede ser: