FLAC: Codec de Audio Sin Pérdida — Análisis Técnico
FLAC (Free Lossless Audio Codec) fue desarrollado por Josh Coalson en 2001 y es mantenido por la Fundación Xiph.Org. A diferencia de los códecs con pérdida que descartan datos de audio, FLAC reproduce audio bit a bit idéntico al original — cada muestra que introduces sale exactamente igual. Típicamente logra una compresión del 50–60% en audio CD, reduciendo aproximadamente a la mitad el tamaño de los archivos WAV sin perder ninguna muestra de la forma de onda original.
Estructura del Stream
Un stream FLAC comienza con el magic de 4 bytes fLaC, seguido de uno o más bloques de metadatos, y luego una secuencia de frames de audio.
Bloques de Metadatos
Cada bloque de metadatos tiene una cabecera de 4 bytes: 1 bit de flag "es-último", tipo de bloque de 7 bits, longitud de 24 bits. Tipos:
| Tipo | Decimal | Descripción |
|---|---|---|
| STREAMINFO | 0 | Obligatorio. Tasa de muestreo, canales, bits por muestra, total de muestras, MD5 |
| PADDING | 1 | Espacio reservado para actualizaciones de etiquetas sin reescribir |
| APPLICATION | 2 | Datos específicos de aplicación (uso de terceros) |
| SEEKTABLE | 3 | Tabla de puntos de búsqueda para acceso aleatorio rápido |
| VORBIS_COMMENT | 4 | Etiquetas clave=valor UTF-8 (artista, título, álbum, etc.) |
| CUESHEET | 5 | Diseño de CD con offsets de pistas e ISRCs |
| PICTURE | 6 | Portada embebida (mismo formato que APIC de ID3v2) |
El bloque STREAMINFO (34 bytes) codifica en bits empaquetados: tamaños mínimo/máximo de bloque (16 bits cada uno), tamaños mínimo/máximo de frame (24 bits cada uno), tasa de muestreo (20 bits, hasta 655.050 Hz), número de canales menos uno (3 bits, hasta 8 canales), bits por muestra menos uno (5 bits, 4–32 bps), total de muestras (36 bits), y firma MD5 de 128 bits del audio sin codificar.
Estructura de Frame de Audio
Cada frame FLAC contiene:
- Cabecera de frame — código de sincronía
0xFF 0xF8, estrategia de bloqueo, tamaño de bloque, tasa de muestreo, asignación de canal, tamaño de muestra, número de frame/muestra, CRC-8 de cabecera - Subframes — uno por canal, cada uno con su propio tipo y codificación
- Pie de frame — CRC-16 del frame completo
Tipos de Codificación de Subframe
El núcleo de compresión de FLAC reside en el predictor de subframe, que explota la correlación temporal:
| Tipo | Código | Descripción |
|---|---|---|
| SUBFRAME_CONSTANT | 0 | Todas las muestras idénticas — almacena solo un valor |
| SUBFRAME_VERBATIM | 1 | Muestras crudas sin comprimir — fallback cuando falla la predicción |
| SUBFRAME_FIXED | 8–12 | Predictor polinomial, orden 0–4, coeficientes fijos |
| SUBFRAME_LPC | 32–63 | Predictor FIR lineal, orden 1–32, coeficientes cuantificados |
Para subframes FIXED, el orden del predictor selecciona coeficientes enteros predefinidos. Para subframes LPC, el codificador calcula coeficientes FIR reales óptimos mediante autocorrelación (algoritmo de Levinson-Durbin) y los cuantifica a precisión entera. Órdenes más altos modelan patrones más complejos pero añaden sobrecarga de coeficientes.
Tras la predicción, los residuos (errores de predicción) se codifican con codificación Golomb-Rice — un codificador de entropía casi óptimo para residuos con distribución de Laplace.
Acoplamiento de Canales
Los archivos estéreo pueden usar modos estéreo decorrelacionados para mejorar la compresión cuando los canales L y R están correlacionados (como en la mayoría de la música):
- Independiente: L y R codificados por separado
- Mid-side: codifica (L+R)/2 como mid y (L−R)/2 como side — generalmente mejor cuando los canales son similares
- Left-side: almacena L y la diferencia L−R
- Right-side: almacena R y la diferencia L−R
El codificador compara todos los modos aplicables y selecciona el que produce el frame más pequeño.
Niveles de Compresión
Los niveles de compresión FLAC (-0 a -8) intercambian velocidad de codificación por tamaño de archivo ajustando el orden del predictor, el tamaño del bloque y el esfuerzo de búsqueda:
| Nivel | Tamaño bloque | Máx. orden LPC | Ratio típico | Velocidad |
|---|---|---|---|---|
| -0 | 1152 | Solo FIXED | ~63% del WAV | Más rápido |
| -1 | 1152 | 0 | ~61% | Muy rápido |
| -2 | 4096 | 0 | ~59% | Rápido |
| -4 | 4096 | 8 | ~57% | Medio |
| -5 | 4096 | 8 | ~55% | Por defecto |
| -6 | 4096 | 12 | ~54% | Lento |
| -8 | 4096 | 32 | ~53% | Más lento |
La diferencia entre -0 y -8 es típicamente solo un 5–10% de archivos más pequeños a 10× el tiempo de codificación. Para archivado, -8 merece la pena; para codificación en tiempo real, -0 o -2 es suficiente.
Codificación FLAC con FFmpeg
# WAV a FLAC, compresión máxima, conservar todas las etiquetas
ffmpeg -i entrada.wav -c:a flac -compression_level 8 salida.flac
# Conversión por lotes de MP3 a FLAC (preserva el rango dinámico pero la calidad está limitada al MP3 original)
for f in *.mp3; do ffmpeg -i "$f" -c:a flac "${f%.mp3}.flac"; done
# Incrustar portada en un FLAC existente
ffmpeg -i audio.flac -i portada.jpg \
-map 0:a -map 1:v \
-c:a copy -c:v copy \
-metadata:s:v comment="Cover (front)" \
con_portada.flac
# Extraer portada embebida
ffmpeg -i audio.flac -an -vcodec copy portada_extraida.jpg
Python: Lectura y Escritura de FLAC
import soundfile as sf
# Leer FLAC — devuelve array float64 por defecto
muestras, tasa = sf.read('pista.flac')
print(f"Tasa: {tasa} Hz | Forma: {muestras.shape} | dtype: {muestras.dtype}")
# Escribir FLAC sin pérdida de 24 bits
sf.write('salida_24bit.flac', muestras, tasa, subtype='PCM_24')
# ---- Manipulación de etiquetas con mutagen ----
from mutagen.flac import FLAC
audio = FLAC('pista.flac')
print(f"Tasa de muestreo : {audio.info.sample_rate} Hz")
print(f"Canales : {audio.info.channels}")
print(f"Bits/muestra : {audio.info.bits_per_sample}")
print(f"Duración : {audio.info.length:.2f} s")
# Leer / escribir etiquetas VorbisComment
print("Título:", audio.get('title', ['(ninguno)'])[0])
audio['artist'] = ['Nuevo Artista']
audio['album'] = ['Edición Remasterizada 2025']
audio.save()
FLAC vs Otros Formatos Sin Pérdida
| Formato | Sin pérdida | Ratio típico | Streaming | Soporte SO |
|---|---|---|---|---|
| FLAC | Sí | ~55% del WAV | HTTP range | Linux/Win/Mac nativo |
| ALAC | Sí | ~60% del WAV | HLS | Ecosistema Apple nativo |
| WAV | Sí (PCM) | 100% | Limitado | Universal |
| AIFF | Sí (PCM) | 100% | Limitado | Apple nativo |
| WavPack | Sí (+ híbrido con pérdida) | ~55% | No | Soporte limitado |
| APE (Monkey's) | Sí | ~50% | No | Soporte hardware limitado |
FLAC es el mejor formato sin pérdida por defecto para ecosistemas no-Apple gracias a sus patentes abiertas, amplio soporte hardware (reproductores portátiles, NAS, amplificadores) y metadatos ricos mediante Vorbis Comment.
Errores Comunes
- Convertir de lossy a FLAC no restaura la calidad. FLAC es sin pérdida — conserva exactamente lo que recibe. Si el MP3 fuente tiene artefactos, el FLAC contendrá esos mismos artefactos.
- FLAC de 24 bits a partir de fuente de 16 bits no añade información. El aumento de profundidad de bits rellena los bits inferiores con ceros. El resultado sónico es idéntico; el tamaño del archivo aumenta.
- FLAC no es streamable de forma nativa. A diferencia de HLS/DASH con ALAC-en-MP4, FLAC requiere peticiones HTTP range o un reproductor específico.
- Etiqueta el campo ALBUM ARTIST al construir bibliotecas musicales. Muchos reproductores y DAPs usan
albumartistpara agrupar compilaciones, noartist.
Conversiones relacionadas
Conversiones de vídeo que encajan con esta guía: