Cómo funciona la compresión de archivos?

  • Anthony Heddings

    @anthonyheddings

  • Agosto 14, 2018, 6:40am EDT

Los ingenieros de software siempre han desarrollado nuevas formas de encajar muchos datos en un espacio reducido. Ya era así cuando nuestros discos duros eran diminutos, y la llegada de Internet lo ha hecho más crítico. La compresión de archivos desempeña un papel importante en la conexión, permitiéndonos enviar menos datos por la línea para que podamos tener descargas más rápidas y encajar más conexiones en redes ocupadas.

Entonces, ¿cómo funciona?

Responder a esa pregunta implicaría explicar algunas matemáticas muy complicadas, ciertamente más de las que podemos cubrir en este artículo, pero no es necesario entender con precisión cómo funciona matemáticamente para entender lo básico.

Las bibliotecas más populares para comprimir texto se basan en dos algoritmos de compresión, utilizando ambos al mismo tiempo para lograr ratios de compresión muy altos. Estos dos algoritmos son «LZ77» y «codificación Huffman». La codificación Huffman es bastante complicada, y no entraremos en detalles sobre ella aquí. Principalmente, utiliza algunas matemáticas sofisticadas para asignar códigos binarios más cortos a las letras individuales, reduciendo el tamaño de los archivos en el proceso. Si quieres aprender más sobre ello, echa un vistazo a este artículo sobre cómo funciona el código, o a este explicador de Computerphile.

Publicidad

LZ77, por otro lado, es relativamente simple y es de lo que hablaremos aquí. Busca eliminar las palabras duplicadas y sustituirlas por una «llave» más pequeña que represente la palabra.

Toma este breve trozo de texto como ejemplo:

El algoritmo LZ77 miraría este texto, se daría cuenta de que repite «howtogeek» tres veces, y lo cambiaría por esto:

Entonces, cuando quiera volver a leer el texto, reemplazaría cada instancia de (h) por «howtogeek», devolviéndonos a la frase original.

A este tipo de compresión lo llamamos «sin pérdidas»: los datos que se introducen son los mismos que se obtienen. No se pierde nada.

Publicidad

En realidad, LZ77 no utiliza una lista de claves, sino que reemplaza la segunda y tercera ocurrencia con un enlace hacia atrás en la memoria:

Así que ahora, cuando llegue a (h), mirará hacia atrás a «howtogeek» y leerá eso en su lugar.

Si estás interesado en una explicación más detallada, este vídeo de Computerphile es bastante útil.

Ahora, este es un ejemplo idealizado. En la realidad, la mayor parte del texto se comprime con claves tan pequeñas como unos pocos caracteres. Por ejemplo, la palabra «el» se comprimiría incluso cuando aparece en palabras como «allí», «su» y «entonces». Con el texto repetido, se pueden conseguir unos ratios de compresión disparatados. Tomemos este archivo de texto con la palabra «howtogeek» repetida 100 veces. El archivo de texto original tiene un tamaño de tres kilobytes. Sin embargo, cuando se comprime, sólo ocupa 158 bytes. Eso es casi un 95% de compresión.

Publicidad

Ahora bien, ese es un ejemplo bastante extremo ya que acabamos de tener la misma palabra repetida una y otra vez. En la práctica general, probablemente obtendrás alrededor de un 30-40% de compresión utilizando un formato de compresión como ZIP en un archivo que es principalmente texto.

Este algoritmo LZ77 se aplica a todos los datos binarios, por cierto, y no sólo al texto, aunque el texto generalmente es más fácil de comprimir debido a la cantidad de palabras repetidas que la mayoría de los idiomas utilizan. Un idioma como el chino puede ser un poco más difícil de comprimir que el inglés, por ejemplo.

¿Cómo funciona la compresión de imagen y vídeo?

La compresión de vídeo y audio funciona de forma muy diferente. A diferencia de lo que ocurre con el texto, donde puedes tener una compresión sin pérdidas, y no se pierden datos, con las imágenes tenemos lo que se llama «compresión con pérdidas», donde sí se pierden algunos datos. Y cuanto más se comprime, más datos se pierden.

Esto es lo que lleva a esos horribles JPEGs que la gente ha subido, compartido y hecho capturas de pantalla varias veces. Cada vez que la imagen se comprime, pierde algunos datos.

Publicidad

Aquí hay un ejemplo. Esta es una captura de pantalla que tomé y que no ha sido comprimida en absoluto.

Luego tomé esa captura de pantalla y la pasé por Photoshop varias veces, cada vez exportándola como un JPEG de baja calidad. Aquí está el resultado.

Se ve bastante mal, ¿verdad?

Bueno, esto es sólo el peor de los casos, exportando al 0% de calidad JPEG cada vez. A modo de comparación, aquí tenemos un JPEG con una calidad del 50%, que es casi indistinguible de la imagen PNG de origen a menos que la amplíes y la mires de cerca.

El PNG de esta imagen tenía un tamaño de 200 KB, pero este JPEG con una calidad del 50% sólo ocupa 28 KB.

Publicidad

¿Entonces cómo se ahorra tanto espacio? Bueno, el algoritmo JPEG es una proeza de la ingeniería. La mayoría de las imágenes almacenan una lista de números, y cada número representa un solo píxel.

JPEG no hace nada de esto. En su lugar, almacena las imágenes utilizando algo llamado Transformada Discreta del Coseno, que es una colección de ondas sinusoidales sumadas a distintas intensidades. Utiliza 64 ecuaciones diferentes, pero la mayoría de ellas no se utilizan. Esto es lo que hace el deslizador de calidad de JPEG en Photoshop y otras aplicaciones de imagen: elegir cuántas ecuaciones utilizar. Las aplicaciones utilizan entonces la codificación Huffman para reducir el tamaño del archivo aún más.

Esto da a los JPEG una relación de compresión increíblemente alta, que puede reducir un archivo que sería de varios megabytes a un par de kilobytes, dependiendo de la calidad. Por supuesto, si lo usas demasiado, acabas con esto:

Esa imagen es horrible. Pero pequeñas cantidades de compresión JPEG pueden tener un impacto significativo en el tamaño del archivo, y esto hace que JPEG sea muy útil para la compresión de imágenes en sitios web. La mayoría de las imágenes que se ven en Internet están comprimidas para ahorrar tiempo de descarga, especialmente para los usuarios de móviles con conexiones de datos deficientes. De hecho, todas las imágenes de How-To Geek han sido comprimidas para que la carga de la página sea más rápida, y probablemente nunca lo hayas notado.

Compresión de vídeo

El vídeo funciona de forma un poco diferente a las imágenes. Uno pensaría que simplemente comprimirían cada fotograma de vídeo usando JPEG, y ciertamente lo hacen, pero hay un método mejor para el vídeo.

Publicidad

Usamos algo llamado «compresión interframe», que calcula los cambios entre cada fotograma y sólo los almacena. Así, por ejemplo, si tienes una toma relativamente fija que ocupa varios segundos en un vídeo, se ahorra mucho espacio porque el algoritmo de compresión no necesita almacenar todo lo que no cambia en la escena. La compresión entre fotogramas es la principal razón por la que tenemos televisión digital y vídeo en la web. Sin ella, los vídeos ocuparían cientos de gigabytes, más que el tamaño medio del disco duro en 2005, cuando se lanzó YouTube.

Además, como la compresión entre fotogramas funciona mejor con vídeos mayoritariamente estacionarios, esta es la razón por la que el confeti arruina la calidad del vídeo.

Nota: el GIF no hace esto, por lo que los GIFs animados suelen ser muy cortos y pequeños, pero siguen teniendo un tamaño de archivo bastante grande.

Publicidad

Otra cosa a tener en cuenta sobre el vídeo es su bitrate-la cantidad de datos permitidos en cada segundo. Si tu tasa de bits es de 200 kb/s, por ejemplo, tu vídeo se verá bastante mal. La calidad aumenta a medida que lo hace la tasa de bits, pero a partir de un par de megabytes por segundo, el rendimiento disminuye.

Este es un fotograma ampliado de un vídeo de una medusa. El de la izquierda está a 3Mb/s, y el de la derecha a 100Mb/s.

Un aumento de 30 veces en el tamaño del archivo, pero no mucho en la calidad. Generalmente, los vídeos de YouTube se sitúan en torno a los 2-10Mb/s dependiendo de tu conexión, ya que algo más probablemente no se notaría.

Esta demo sí que funciona mejor con vídeo real, así que si quieres comprobarlo por ti mismo, puedes descargar los mismos vídeos de prueba de bitrate utilizados aquí.

Compresión de audio

La compresión de audio funciona de forma muy similar a la compresión de texto e imágenes. Mientras que el JPEG elimina detalles de una imagen que no se ven, la compresión de audio hace lo mismo con los sonidos. Es posible que no tenga que oír el crujido de la púa de la guitarra en la cuerda si la guitarra real es mucho, mucho más fuerte.

Publicidad

El MP3 también utiliza la tasa de bits, que va desde el extremo inferior de 48 y 96 kbps (el extremo inferior) a 128 y 240kbps (bastante bueno) a 320kbps (audio de gama alta), y es probable que sólo escuche la diferencia con unos auriculares (y oídos) excepcionalmente buenos.

También hay códecs de compresión sin pérdidas para el audio, el principal de los cuales es FLAC, que utiliza la codificación LZ77 para ofrecer un audio totalmente sin pérdidas. Algunas personas juran por la perfecta calidad de audio de FLAC, pero con la prevalencia del MP3, parece que la mayoría de la gente no puede notar o no le importa la diferencia.

Anthony Heddings
Anthony Heddings es el ingeniero residente de la nube para LifeSavvy Media, un escritor técnico, programador y un experto en la plataforma AWS de Amazon. Ha escrito cientos de artículos para How-To Geek y CloudSavvy IT que han sido leídos millones de veces.Read Full Bio »