Servicios como YouTube ofrecen la posibilidad de subir vídeos de forma ilimitada y sin limitaciones, aunque eso tiene mucho sentido. Apuesto a que la mayoría de la gente no pagaría por subir vídeos a YouTube, sobre todo teniendo en cuenta que la mayoría de los vídeos de YouTube obtienen una pequeña cantidad de visitas. ¿Qué pasaría si te dijera que existe una forma de convertir tus archivos en vídeos para subirlos a YouTube y que luego podrías decodificarlos?
Para ser claros, esto no es algo que debas hacer en serio y definitivamente no deberías confiar en YouTube como medio de almacenamiento. No solo resulta ser una relación de compresión negativa (es decir, los archivos terminan siendomás grandesque cuando empezaste), sino que es algo que YouTube podría prohibir en el futuro si se hiciera en masa. Sin embargo, espero que este artículo sirva como una interesante inmersión en la forma en que se almacenan los archivos y las formas alocadas y extravagantes en que se pueden distribuir.
¡A continuación se muestra el código fuente de los programas que creé para codificar y decodificar archivos en videos, por si quieres probarlo tú mismo! ¡Con el poder de la tecnología, logré convertir una imagen de 7 KB en un video de 9 MB!
No recomendamos utilizar YouTube como medio de almacenamiento de archivos. No solo puede ser inseguro, sino que tampoco es una forma eficiente de almacenar archivos ni de recuperarlos. Es una forma increíblemente poco práctica de almacenar archivos.
Comprensión de los archivos
Una introducción básica sobre cómo se almacenan los archivos
En esencia, un archivo es una secuencia de bytes y, cuando se divide, esta secuencia se divide en segmentos más pequeños y manejables. Esta división se realiza de tal manera que cada segmento es un subconjunto exacto y contiguo de la secuencia de bytes del archivo original. El proceso es inherentemente sin pérdidas, lo que significa que no altera el contenido de los propios bytes. Siempre que estos segmentos se vuelvan a ensamblar en el orden correcto, el archivo original se puede recrear perfectamente.
La técnica que utilizaremos para dividir los archivos en "fotogramas" individuales de un vídeo es operar sobre los archivos a nivel binario, es decir, tratar los archivos como simples conjuntos de unos y ceros. Esta coherencia binaria significa que el proceso es independiente del contenido del archivo, ya sea texto, imagen, vídeo o cualquier tipo de datos. La división y la fusión interactúan directamente con los datos binarios, lo que garantiza que las operaciones sean de aplicación universal e independientes del contenido. Al evitar cualquier compresión o codificación que altere los datos, podemos garantizar una reconstrucción perfecta del archivo original, conservando su estado exacto sin pérdida de información ni calidad.
Mantener la secuencia correcta de las partes divididas es la parte más importante del proceso. En el caso de nuestros videos, nos aseguraremos de que las partes del archivo se almacenen cuadro por cuadro en una línea contigua, de modo que el primer cuadro sea la primera parte, el segundo cuadro sea la segunda parte, etc.
Probando códigos QR
Los códigos QR no funcionaron
Comencé este proyecto investigando si podía usar códigos QR para este proyecto. La idea era simple: cortar un archivo en "fragmentos" que pudieran almacenarse en códigos QR individuales, unirlos en un video y luego decodificar el video. Python tiene una biblioteca de códigos QR que pensé que funcionaría bien y, si bien técnicamente lo hizo, tuvo algunos problemas. En particular, el tamaño máximo de archivo que podía incluir en un código QR era de 2,9 KB, y esto era con la versión 40 del código QR. Como referencia, estos son códigos QRenormes. Al decodificar, el lector de códigos QR en la biblioteca de Python tuvo problemas para validar el código QR, lo que descubrí que era el resultado de la compresión del video y los pequeños píxeles que usa el código QR.
Con eso, volví al punto de partida. Si redujera el tamaño del código QR (por ejemplo, usando la versión 20), el video terminaría siendo demasiado grande y llevaría mucho tiempo codificar los archivos en cientos de códigos QR. Tuve que abordar esto desde otro ángulo, aunque tenía una idea mucho mejor para esto que sería exclusiva pero podría incluir muchos más datos en un solo cuadro.
Construyendo nuestro propio formato para almacenar datos
Usando píxeles como '1' y '0'
En lugar de intentar utilizar un formato ya establecido, opté por... crear uno propio. Obviamente no es nada especial, pero lo que hice, en un nivel muy básico, fue crear un formato que fuera capaz de almacenar 0,26 MB por fotograma. Para cada fotograma del vídeo, un píxel negro representa un 1 y un píxel blanco representa un 0. Con un vídeo de 1920 x 1080, eso significa que hay 2073600 bits de información potenciales, lo que equivale a 0,2592 MB.
Escribí un programa Python que básicamente genera lienzos de 1 y 0 leyendo los datos binarios de un archivo y, cuando llena todos los píxeles, los agrega a una lista de fotogramas y pasa al siguiente. Una vez hecho, los uno todos en un formato MP4 uno tras otro, donde luego puedo usar un decodificador que básicamente lo toma y revierte el proceso. El video anterior es el resultado de esta generación ejecutada en un archivo ZIP de los datos del censo de EE. UU. de 2000 a 2020, y agregué la música en el codificador ya que no hace ninguna diferencia en la calidad del video. Esto está deshabilitado en el video anterior, pero se puede habilitar en el código fuente.
Sin embargo, este método tiene sus inconvenientes, el más importante de los cuales es que la compresión dificulta la recuperación de los datos. Para solucionarlo, modifiqué mi codificador para que cada 1 y 0 tuvieran cinco píxeles de ancho y cinco píxeles de alto. Esto reduce significativamente la cantidad que podemos almacenar por fotograma, bajándola a 10 kb, pero hace que sea mucho más fácil recuperar los datos incluso cuando un vídeo está comprimido. Eso sigue siendo tres veces el tamaño de lo que cada código QR era capaz de almacenar, por lo que sigue siendo una ventaja.
Tuve problemas para recuperar algunos datos de YouTube gracias a su compresión, pero pude verificar que los metadatos y los datos del archivo estaban en su lugar al usar un editor hexadecimal. Al verificar la integridad del archivo ZIP, se reveló que no se podía descomprimir porque el tamaño del archivo no coincidía exactamente. Estoy seguro de que este script se puede perfeccionar con el tiempo para agregar también contingencia de datos, como generar dos fotogramas para cada "fragmento" de información y promediar los datos entre los dos.
Tal como están las cosas, la mejor contingencia que pude hacer en cada cuadro fue calcular un valor "promedio" de 0 o 1 para cada bloque de 5x5 píxeles. Esto funcionó para la compresión estándar de MP4, pero YouTube es una bestia diferente. No soy el primero en hacer esto, ojo. Otras herramientas que existen usan técnicas más avanzadas para hacer lo mismo, comoesta aplicación escrita en Rust, pero la compresión de YouTube también puede estropear esos resultados.
Con archivos más pequeños, pude recuperar los datos sin ningún problema. Por ejemplo, convertí una imagen normal en un vídeo, que pude subir a YouTube, descargar de YouTube y convertir de nuevo en el archivo original. El SHA-256 de ambos archivos resultó diferente, lo que sugiere diferencias en los archivos, pero la imagen se pudo abrir. Sospecho que parte de la razón por la que el SHA-256 resultó diferente es que el último fotograma del vídeo tendrá mucho espacio en blanco, que el decodificador luego interpreta como una colección de 0 en lugar del final del archivo. Pude confirmar esto en un editor hexadecimal.
Ejecutando nuestro codificador y decodificador
Tenemos una solución funcional que puedes probar.
Si quieres probarlo, he publicadomi código fuente en GitHubpara que lo puedas usar. Debes especificar los nombres de los archivos en el código fuente tanto para la entrada como para la salida, y solo se ejecuta en un único hilo. También consume mucha memoria RAM, ya que un archivo de 100 MB utiliza más de 100 GB de espacio de intercambio en mi MacBook Pro M1 para generar un archivo... antes de fallar.
Ten en cuenta que no es un programa perfecto y que esto es más bien una prueba de concepto de lo que puedes hacer con los archivos. Siempre hay formas creativas de almacenar archivos y esta es una de las más creativas que puedes hacer. Funcionará de inmediato, pero es posible que tengas problemas a veces al usarlo con YouTube. Si es así, no dudes en hacer cambios y ver si puedes lograr que funcione.