AIFF: Guía Completa del Audio Interchange File Format
AIFF (Audio Interchange File Format) fue desarrollado por Apple en 1988, basado en el contenedor IFF (Interchange File Format) de Electronic Arts. AIFF almacena audio PCM sin comprimir — los mismos datos brutos de forma de onda que WAV — convirtiéndolo en un formato sin pérdida usado extensamente en el ecosistema de audio profesional de Apple (Logic Pro, Final Cut Pro, GarageBand). Su variante comprimida AIFF-C (también llamada AIFC) soporta audio comprimido por códec incluyendo ALAC (Apple Lossless).
Arquitectura de Bloques Basada en IFF
Como WAV/RIFF, AIFF usa una estructura basada en bloques. Sin embargo, AIFF deriva de IFF que usa orden de bytes big-endian (byte más significativo primero), mientras que WAV/RIFF usa little-endian. Esta distinción importa al escribir parsers binarios.
Bloque FORM (nivel superior):
Chunk ID: "FORM" (4 bytes ASCII)
Chunk Size: tamaño total − 8 (4 bytes, uint32 big-endian)
Form Type: "AIFF" o "AIFC" (4 bytes ASCII)
Bloques (en cualquier orden, excepto COMM debe preceder a SSND):
COMM — Bloque Común (parámetros del formato de audio)
SSND — Bloque de Datos de Sonido (muestras PCM)
MARK — Bloque de Marcadores (marcas de tiempo con nombre)
INST — Bloque de Instrumento (parámetros de reproducción MIDI)
NAME — Bloque de Nombre (título de la pista)
AUTH — Bloque de Autor
(c) — Bloque de Copyright
ANNO — Bloques de Anotación
Bloque COMM (18 bytes para AIFF, 24+ bytes para AIFC)
numChannels: int16 — número de canales
numSampleFrames: uint32 — número total de frames de muestra
sampleSize: int16 — bits por muestra (8, 16, 24, 32)
sampleRate: float80 — IEEE 754 de 80 bits (¡10 bytes!)
// Solo AIFF-C:
compressionType: OSType — 'NONE', 'sowt', 'alaw', 'ulaw', 'ALAC', 'fl32'...
compressionName: Pascal string — nombre legible
Importante: La tasa de muestreo se almacena como un float de precisión extendida de 80 bits — un formato no soportado nativamente por la mayoría de lenguajes.
Las muestras PCM en AIFF se almacenan big-endian y con signo para todas las profundidades de bits (incluyendo 8 bits, a diferencia de WAV que usa 8 bits sin signo).
Procesamiento AIFF con Python
Módulo aifc de la Biblioteca Estándar
import aifc, struct
# ---- Leer un archivo AIFF ----
with aifc.open('entrada.aiff', 'r') as af:
n_canales = af.getnchannels()
ancho_muest = af.getsampwidth()
tasa_frames = af.getframerate()
n_frames = af.getnframes()
compresion = af.getcomptype()
duracion = n_frames / tasa_frames
print(f"Canales : {n_canales}")
print(f"Profundidad : {ancho_muest * 8} bits")
print(f"Tasa : {tasa_frames} Hz")
print(f"Duración : {duracion:.3f} s")
print(f"Compresión : {compresion}")
datos_brutos = af.readframes(n_frames)
# Desempaquetar muestras estéreo de 16 bits (big-endian)
n_muestras = n_frames * n_canales
muestras = struct.unpack(f'>{n_muestras}h', datos_brutos) # '>' para big-endian
# ---- Escribir un archivo AIFF ----
import numpy as np
tasa = 44100
freq = 440 # A4
duracion_s = 2.0
t = np.linspace(0, duracion_s, int(tasa * duracion_s), endpoint=False)
forma_onda = (np.sin(2 * np.pi * freq * t) * 32767).astype(np.int16)
with aifc.open('seno_440.aiff', 'w') as af:
af.setnchannels(1)
af.setsampwidth(2)
af.setframerate(tasa)
af.setcomptype(b'NONE', b'not compressed')
af.writeframes(forma_onda.astype('>i2').tobytes())
soundfile para Soporte Avanzado de AIFF
import soundfile as sf
# Leer AIFF / AIFC
datos, tasa_muestreo = sf.read('entrada.aiff')
print(f"Forma: {datos.shape}, tasa: {tasa_muestreo}, dtype: {datos.dtype}")
# Escribir AIFF de 24 bits
sf.write(
'salida_24bit.aiff',
datos,
tasa_muestreo,
subtype='PCM_24',
format='AIFF'
)
# Convertir WAV a AIFF
datos_wav, tasa_wav = sf.read('entrada.wav')
sf.write('salida.aiff', datos_wav, tasa_wav, subtype='PCM_24', format='AIFF')
Conversión AIFF con FFmpeg
# Convertir WAV a AIFF (sin pérdida, misma calidad)
ffmpeg -i entrada.wav -c:a pcm_s24be salida.aiff
# pcm_s24be = PCM con signo de 24 bits big-endian (nativo AIFF)
# Convertir MP3/FLAC a AIFF
ffmpeg -i entrada.flac -c:a pcm_s16be salida.aiff
ffmpeg -i entrada.mp3 -c:a pcm_s24be salida.aiff
# Conversión por lotes de AIFF a FLAC (más pequeño, sin pérdida)
for f in *.aiff; do
ffmpeg -i "$f" -c:a flac "${f%.aiff}.flac"
done
# Convertir AIFF a WAV (intercambio de estudio)
ffmpeg -i entrada.aiff -c:a pcm_s24le salida.wav
# pcm_s24le = 24 bits little-endian (nativo WAV)
AIFF vs WAV vs FLAC
| Característica | AIFF | WAV | FLAC |
|---|---|---|---|
| Orden de bytes | Big-endian | Little-endian | Variable |
| Máx. profundidad bits | 32 bits float | 32 bits float | 32 bits int |
| Compresión | AIFC (varios) | Interna (varios) | DEFLATE sin pérdida |
| Nativo Apple | Sí | Limitado (vía QuickTime) | Vía complementos |
| Tamaño de archivo | Grande (sin comprimir) | Grande (sin comprimir) | ~55% del WAV |
| Uso profesional | Mac/Logic Pro | Windows/Pro Tools | Archivado/entrega |
Errores Comunes
- Sorpresas con el orden de bytes big-endian. Cada campo multi-byte en AIFF es big-endian. Escribir
struct.pack('<h', valor)(little-endian) cuando necesitasstruct.pack('>h', valor)es un error silencioso que produce valores de muestra incorrectos de apariencia válida. - El float de 80 bits para la tasa de muestreo. Ningún lenguaje mainstream tiene soporte nativo para float de 80 bits. Usa siempre un decodificador dedicado — el módulo
aifclo maneja internamente;soundfilelo maneja vía libsndfile. - Confusión AIFF-C vs AIFF. Muchas aplicaciones escriben archivos
AIFCincluso para audio sin comprimir (concompressionType='NONE'). Los parsers que comprueban estrictamenteForm Type == "AIFF"rechazarán estos archivos. Comprueba tantoAIFFcomoAIFC. - Logic Pro escribe AIFF; Pro Tools prefiere WAV. Al intercambiar sesiones entre estudios centrados en Mac y centrados en Windows, convierte AIFF a WAV para evitar problemas de detección de códec en Pro Tools.
Conversiones relacionadas
Pares de formatos de audio más frecuentes: