Mi búsqueda de ocho años para digitalizar 45 cintas de video. Parte 2

La primera parte describe una difícil búsqueda para digitalizar viejos videos familiares y dividirlos en escenas separadas . Después de procesar todos los clips, quería que su visualización en línea fuera tan conveniente como en YouTube. Dado que estos son recuerdos personales de la familia, no se pueden publicar en YouTube. Necesitamos un alojamiento más privado que sea conveniente y seguro.



Paso 3. Publicación



ClipBucket, un clon de YouTube de código abierto que se puede instalar en su propio servidor



Mi primer intento fue ClipBucket , que se llama a sí mismo un clon de YouTube de código abierto que puede instalar en su servidor.







Sorprendentemente, ClipBucket no tiene instrucciones de instalación. Gracias a un tercer tutorial partido, que automatizan el proceso de instalación utilizando Ansible , una herramienta de gestión de la configuración del servidor.



Parte de la dificultad fue que los scripts de instalación de ClipBucket estaban completamente dañados. En ese momento trabajaba en Google y, según los términos del contrato, no tenía derecho a contribuir al clon de YouTube de código abierto, pero publiqué un informe de error del cual fue fácil hacer las correcciones necesarias. Pasaron los meses y todavía no entendían cuál era el problema. En cambio, agregaron más y más errores con cada lanzamiento.



ClipBucket trabajó en un modelo de consultoría: lanzaron su código de forma gratuita y cobraron una tarifa para ayudar con la implementación. Gradualmente, me di cuenta de que una empresa que gana dinero con el soporte de pago probablemente no esté muy interesada en que los clientes instalen el producto ellos mismos.



MediaGoblin, una alternativa más moderna



Después de meses de frustración con ClipBucket, revisé las opciones disponibles y encontré MediaGoblin .





MediaGoblin  es una plataforma de intercambio de medios independiente



. MediaGoblin tiene muchas ventajas. A diferencia de ClipBucket en PHP antiestético, MediaGoblin está escrito en Python, un lenguaje en el que tengo mucha experiencia en codificación. Hay una interfaz de línea de comandos que facilita la automatización de las descargas de videos. Lo más importante es que MediaGoblin viene en una imagen de Docker que elimina cualquier problema de instalación.



Docker es una tecnología que crea un entorno autónomo para una aplicación que se ejecuta en cualquier lugar. Utilizo Docker en muchos de mis proyectos .


Increíble dificultad de volver a dockerizar MediaGoblin



Supuse que implementar la imagen de la ventana acoplable de MediaGoblin sería trivial. Bueno, no funcionó del todo de esa manera.



A la imagen terminada le faltaban dos funciones necesarias:



  • Autenticación
    • MediaGoblin crea un portal de medios público de forma predeterminada y necesitaba una forma de restringir el acceso no autorizado.
  • Transcodificación


Bueno no hay problema. La imagen de Docker es de código abierto , por lo que puede reconstruirla usted mismo .



Desafortunadamente, la imagen de Docker ya no se crea a partir del repositorio de MediaGoblin actual . Intenté sincronizarlo con la versión de la última compilación exitosa, pero tampoco funcionó. Aunque usé exactamente el mismo código, las dependencias externas de MediaGoblin cambiaron, rompiendo la compilación. Después de docenas de horas, ejecuté el proceso de compilación de MediaGoblin de 10 a 15 minutos una y otra vez hasta que finalmente funcionó.



Unos meses después sucedió lo mismo. En total, durante los últimos años, la cadena de dependencia de MediaGoblin ha roto mi compilación varias veces, y la última vez que sucedió fue justo cuando estaba escribiendo este artículo. Terminé publicando mi propia bifurcación de MediaGoblin, con dependencias codificadas y versiones de biblioteca explícitas. En otras palabras, en lugar de afirmar con dudas que MediaGoblin funciona con cualquier versión de apio > = 3.0, instalé una dependencia específica en apio 4.2.1 porque probé MediaGoblin con esa versión. Parece que el producto necesita un mecanismo de construcción reproducible , pero todavía no lo he hecho.



De todos modos, después de muchas horas de lucha, finalmente pude construir y configurar MediaGoblin en una imagen de Docker. Allí ya era fácil omitir la transcodificación innecesaria y configurar Nginx para la autenticación .



Paso 4. Alojamiento



Dado que MediaGoblin estaba ejecutando Docker en mi máquina local, el siguiente paso fue implementarlo en un servidor en la nube para que la familia pudiera ver el video.



Problema de almacenamiento de video y MediaGoblin



Hay muchas plataformas que toman una imagen de Docker y la alojan en una URL pública. El problema es que, además de la aplicación en sí, se tuvieron que publicar 33 GB de archivos de video. Era posible codificarlos en una imagen de la ventana acoplable, pero resultó ser engorroso y feo. Cambiar una línea de configuración requeriría volver a implementar 33 GB de datos.



Cuando usé ClipBucket, resolví el problema con gcsfuse  , una utilidad que permite que el sistema operativo cargue directorios en Google Cloud como rutas normales del sistema de archivos. Publiqué los archivos de video en Google Cloud y usé gcsfuse para mostrarlos como archivos locales en ClipBucket.



La diferencia fue que ClipBucket se ejecutó en una máquina virtual real, mientras que MediaGoblin se ejecutó en un contenedor Docker. Aquí, montar archivos desde el almacenamiento en la nube resultó ser mucho más difícil. Pasé docenas de horas resolviendo todos los problemas y escribí una publicación de blog completa al respecto .





La integración inicial de MediaGoblin con el almacenamiento de Google Cloud, de la que hablé en 2018.



Después de varias semanas de ajustar todos los componentes, todo funcionó. Sin realizar ningún cambio en el código de MediaGoblin, lo obligo de manera engañosa a leer y escribir archivos multimedia en el almacenamiento en la nube de Google.



El único problema fue que MediaGoblin se volvió obscenamente lento. Tomó la friolera de 20 segundos cargar miniaturas de video en la página de inicio. Si saltaba hacia adelante mientras miraba un video, MediaGoblin se detendría durante 10 segundos infinitos antes de reanudar la reproducción.



El principal problema era que los vídeos y las imágenes llegaban al usuario de forma larga y indirecta. Tuvieron que pasar del almacenamiento en la nube de Google a través de gcsfuse a MediaGoblin, Nginx, y solo entonces ingresaron al navegador del usuario. El principal cuello de botella fue gcsfuse, que no está optimizado para un rendimiento rápido. Los desarrolladores advierten sobre grandes retrasos en el trabajo de la utilidad directamente en la página principal del proyecto:





Advertencias de rendimiento en la documentación de gcsfuse



Idealmente, el navegador debería buscar archivos directamente desde Google Cloud, sin pasar por todas las capas intermedias. ¿Cómo puedo hacer esto sin sumergirme en el código base de MediaGoblin y agregar una compleja lógica de integración de Google Cloud?



Truco del sub_filtro de Nginx



Por suerte, encontré una solución simple, aunque un poco fea. Agregué el siguiente filtro a la configuración default.conf en Nginx :



sub_filter "/mgoblin_media/media_entries/" "https://storage.googleapis.com/MY-GCS-BUCKET/media_entries/";
sub_filter_once off;


En mi instalación, Nginx funcionó como un proxy entre MediaGoblin y el usuario final. La directiva anterior le dice a Nginx que busque y reemplace todas las respuestas HTML de MediaGoblin antes de pasarlas al usuario final. Nginx reemplaza todas las rutas relativas a los archivos multimedia de MediaGoblin con URL de Google Cloud Storage.



Por ejemplo, MediaGoblin genera HTML como este:



<video width="720" height="480" controls autoplay>
  <source
    src="/mgoblin_media/media_entries/16/Michael-riding-a-bike.mp4"
    type="video/mp4">
</video>


Nginx cambia la respuesta:



<video width="720" height="480" controls autoplay>
  <source
    src="https://storage.googleapis.com/MY-GCS-BUCKET/media_entries/16/Michael-riding-a-bike.mp4"
    type="video/mp4">
</video>


Ahora todo está funcionando como se esperaba:





Nginx reescribe las respuestas de MediaGoblin para que los clientes puedan solicitar archivos multimedia directamente desde el almacenamiento en la nube de Google.



La mejor parte de mi solución es que no requiere ningún cambio en el código de MediaGoblin. La directiva de dos líneas de Nginx integra a la perfección MediaGoblin y Google Cloud, aunque estos servicios no saben absolutamente nada entre sí.



Nota : esta solución requiere que los archivos en Google Cloud Storage sean legibles para todos. Para mitigar el riesgo de acceso no autorizado, utilizo un nombre de depósito largo y aleatorio (por ejemplo mediagoblin-39dpduhfz1wstbprmyk5ak29) y verifico que la política de control de acceso del depósito no permite que usuarios no autorizados muestren el contenido del directorio.


Producto final



En este punto, tenía una solución completa y funcional. MediaGoblin se ejecutó felizmente en su propio contenedor en la plataforma en la nube de Google, por lo que no fue necesario parchearlo o actualizarlo con frecuencia. Todo en mi proceso fue automatizado y reproducible, lo que permitió ediciones simples o reversiones a versiones anteriores.



A mi familia le encantó lo fácil que fue ver el video. Con el truco de Nginx anterior, el procesamiento de video ahora es tan rápido como YouTube.



La pantalla de vista previa se ve así:





Contenido del directorio de videos familiares por la



etiqueta destacada Al hacer clic en la miniatura se muestra la siguiente pantalla:





Ver un solo clip en el servidor de medios



Después de muchos años de trabajo, me complació enormemente darles a mis familiares la oportunidad de ver nuestros videos en la misma interfaz fácil de usar que en YouTube, como quería originalmente.



Bono: reducción de costos a menos de $ 1 por mes



No ves videos caseros con frecuencia, solo cada pocos meses. Mi familia generó colectivamente alrededor de 20 horas de tráfico en un año, pero el servidor funcionaba las 24 horas. Pagué $ 15 mensuales por un servidor que estaba abajo el 99,7% del tiempo.



A finales de 2018, Google lanzó el producto Cloud Run . La característica principal fue el lanzamiento de contenedores Docker tan rápido que la aplicación podía responder a las solicitudes HTTP. Es decir, el servidor podría permanecer en modo de espera y comenzar solo cuando alguien quisiera acceder a él. Para aplicaciones como la mía lanzadas con poca frecuencia, los costos bajaron de $ 15 al mes a unos pocos centavos al año.



Por razones que ya no recuerdo, Cloud Run no funcionó con mi imagen de MediaGoblin. Pero con la llegada de Cloud Run, recordé que Herokuofrece un servicio similar de forma gratuita y sus herramientas son mucho más convenientes que las de Google.



Con un servidor de aplicaciones gratuito, su único gasto es el almacenamiento de datos. El almacenamiento regional estándar de Google cuesta 2,3 centavos / GB. El archivo de video es de 33 GB, por lo que solo pago 77 centavos al mes.





El costo de esta solución es de solo $ 0.77 por mes



Consejos para aquellos que buscan probar



Obviamente, el proceso me llevó mucho tiempo. Pero espero que este artículo le ayude a ahorrar del 80 al 90% de sus esfuerzos para digitalizar y publicar videos caseros. En una sección separada, puede encontrar una guía detallada paso a paso para todo el proceso, pero aquí hay algunos consejos generales:



  • Durante la fase de digitalización y edición, conserve la mayor cantidad de metadatos posible.
    • .
    • , .
    • , .
  • .
    • .
    • EverPresent ( , ).
  • , HDD.
  • - , .
    • , , . .
    • (, , ), , .
    • . , .
      • ?
      • ?
      • ?
  • .
    • , .
    • “best of” , .
  • , .
    • , . .
    • , . , .
  • .
    • , , .
    • , , .
  • .
  • .
    •  — .
    •  — . , Slow Snow The National, .



All Articles