La meva recerca de vuit anys per digitalitzar 45 videocassettes. Part 2

La primera part descriu la difícil recerca de digitalitzar vídeos familiars antics i dividir-los en escenes separades. Després de processar tots els clips, volia organitzar la seva visualització en línia tan convenient com a YouTube. Com que es tracta de records familiars personals, no es poden publicar a YouTube mateix. Necessitem un allotjament més privat que sigui convenient i segur.

Pas 3: Publicació

ClipBucket, un clon de codi obert de YouTube que es pot instal·lar al vostre propi servidor

Primer de tot ho vaig intentar ClipBucket, que es diu a si mateix un clon de YouTube de codi obert que podeu instal·lar al vostre servidor.

La meva recerca de vuit anys per digitalitzar 45 videocassettes. Part 2

Sorprenentment, ClipBucket no té cap instruccions d'instal·lació. Gràcies a a la gestió externa я automatitzat el procés d'instal·lació via Ansible, una eina de gestió de la configuració del servidor.

Part de la dificultat va ser que els scripts d'instal·lació de ClipBucket estaven completament trencats. En aquell moment jo treballava a Google i segons els termes del contracte no tenia dret a contribuir al clon de codi obert de YouTube, però jo va publicar un informe d'error, a partir del qual es podrien fer fàcilment les correccions necessàries. Van passar els mesos i encara no entenien quin era el problema. En canvi, ho van afegir tot més que errors en cada llançament.

ClipBucket va treballar en un model de consultoria: van publicar el seu codi de manera gratuïta i van cobrar per ajuda amb el desplegament. A poc a poc em vaig adonar que una empresa que guanya diners amb suport de pagament probablement no està molt interessada a que els clients instal·lin el producte ells mateixos.

MediaGoblin, una alternativa més moderna

Després d'uns mesos de frustració amb ClipBucket, vaig revisar les opcions disponibles i vaig trobar Mediagoblin.

La meva recerca de vuit anys per digitalitzar 45 videocassettes. Part 2
Mediagoblin és una plataforma autònoma per compartir mitjans

MediaGoblin té moltes llaminadures. A diferència de ClipBucket en PHP antiestètic, MediaGoblin està escrit en Python, un llenguatge amb el qual tinc molta experiència escrivint codi. Menja interfície de línia d'ordres, que us permet automatitzar fàcilment la descàrrega de vídeos. El més important és que MediaGoblin ve amb Imatge de Docker, que elimina qualsevol problema amb la instal·lació.

estibador és una tecnologia que crea un entorn autònom perquè una aplicació s'executi a qualsevol lloc. Jo faig servir Docker a molts dels meus projectes.

La sorprenent dificultat de tornar a acoblar MediaGoblin

Vaig suposar que desplegar la imatge acobladora de MediaGoblin seria una tasca trivial. Bé, això no va funcionar així.

A la imatge acabada, hi havia dues funcions necessàries:

  • Autenticació
    • MediaGoblin crea un portal de mitjans públics de manera predeterminada i necessitava una manera de restringir l'accés a persones de fora.
  • Transcodificació
    • Cada vegada que baixeu un vídeo, MediaGoblin intenta transcodificar-lo per a una reproducció òptima. Si el vídeo està inicialment preparat per a la transmissió en temps real, la transcodificació degrada la qualitat.
    • MediaGoblin ofereix desactivant la transcodificació mitjançant opcions de configuració, però això no es pot fer en una imatge de Docker existent.

Bé, cap problema. La imatge de Docker ve amb codi obert, així que és possible reconstrueix-lo tu mateix.

Malauradament, la imatge de Docker ja no es construeix a partir de l'actual Repositori de MediaGoblin. Vaig provar de sincronitzar-lo amb la versió de l'última compilació reeixida, però també va fallar. Tot i que vaig utilitzar exactament el mateix codi, les dependències externes de MediaGoblin van canviar, trencant la construcció. Després de desenes d'hores, vaig recórrer el procés de creació de MediaGoblin de 10 a 15 minuts una i altra vegada fins que finalment va funcionar.

Uns mesos després va passar el mateix. En total, la cadena de dependència de MediaGoblin ha trencat la meva compilació diverses vegades durant els últims dos anys, i l'última vegada que va passar va ser just mentre escrivia aquest article. Finalment vaig publicar forquilla pròpia de MediaGoblin c dependències codificades en dur i versions de biblioteca especificades explícitament. En altres paraules, en lloc de la dubtosa afirmació que MediaGoblin funciona amb qualsevol versió api >= 3.0, he instal·lat una dependència de versió específica api 4.2.1perquè vaig provar MediaGoblin amb aquesta versió. Sembla que el producte necessita mecanisme de construcció reproduïble, però encara no ho he fet.

De totes maneres, després de moltes hores de lluita, finalment vaig poder construir i configurar MediaGoblin en una imatge de Docker. Allà ja era fàcil saltar la transcodificació innecessària и instal·leu Nginx per a l'autenticació.

Pas 4. Hosting

Com que MediaGoblin executava Docker al meu ordinador local, el següent pas va ser desplegar-lo en un servidor al núvol perquè la família pogués veure el vídeo.

MediaGoblin i el problema d'emmagatzematge de vídeo

Hi ha moltes plataformes que prenen una imatge de Docker i l'allotgen en una URL pública. El problema és que, a més de l'aplicació, s'havien de publicar 33 GB d'arxius de vídeo. Va ser possible codificar-los en una imatge docker, però va resultar feixuc i lleig. Canviar una línia de configuració requeriria una redistribució de 33 GB de dades.

Quan vaig utilitzar ClipBucket, vaig resoldre el problema amb gcsfuse - una utilitat que permet al sistema operatiu penjar directoris a l'emmagatzematge al núvol de Google Cloud com a camins habituals al sistema de fitxers. Vaig allotjar els fitxers de vídeo a Google Cloud i vaig utilitzar gcsfuse per mostrar-los com a fitxers locals a ClipBucket.

La diferència era que ClipBucket funcionava en una màquina virtual real, mentre que MediaGoblin funcionava en un contenidor Docker. Aquí, muntar fitxers des de l'emmagatzematge al núvol va resultar molt més difícil. Vaig passar desenes d'hores resolent tots els problemes i vaig escriure sobre això entrada sencera del blog.

La meva recerca de vuit anys per digitalitzar 45 videocassettes. Part 2
La integració inicial de MediaGoblin amb l'emmagatzematge de Google Cloud, que jo va dir el 2018

Després de diverses setmanes ajustant tots els components, tot va funcionar. Sense fer cap canvi al codi de MediaGoblin, faig trampes per aconseguir que llegeixi i escrigui fitxers multimèdia a l'emmagatzematge al núvol de Google.

L'únic problema va ser que MediaGoblin es va tornar obscenament lent. Van trigar 20 segons complets a carregar les miniatures de vídeo a la pàgina d'inici. Si vas saltar endavant mentre veies un vídeo, MediaGoblin es va fer una pausa de 10 segons abans de reprendre la reproducció.

El principal problema era que els vídeos i les imatges anaven a l'usuari d'una manera llarga i indirecta. Van haver de passar de l'emmagatzematge al núvol de Google a través de gcsfuse a MediaGoblin, Nginx, i només llavors van entrar al navegador de l'usuari. El coll d'ampolla principal era gcsfuse, que no està optimitzat per a un rendiment ràpid. Els desenvolupadors adverteixen sobre grans retards en la utilitat just a la pàgina principal del projecte:

La meva recerca de vuit anys per digitalitzar 45 videocassettes. Part 2
Edita advertències sobre el baix rendiment a la documentació de gcsfuse

L'ideal és que el navegador extreu fitxers directament de Google Cloud, evitant totes les capes intermèdies. Com puc fer-ho sense aprofundir en la base de codi de MediaGoblin i afegir una lògica complexa d'integració de Google Cloud?

Truc de sub_filtre a nginx

Per sort, però, he trobat una solució fàcil немного lleig. He afegit a la configuració default.conf a Nginx tal filtre:

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

A la meva configuració, Nginx va actuar com a intermediari entre MediaGoblin i l'usuari final. La directiva anterior indica a Nginx que cerqui i substitueixi totes les respostes HTML de MediaGoblin abans de servir-les a l'usuari final. Nginx substitueix tots els camins relatius als fitxers multimèdia MediaGoblin amb URL de l'emmagatzematge al núvol de Google.

Per exemple, MediaGoblin genera HTML com aquest:

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

Nginx canvia la resposta:

<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>

Ara tot funciona com s'esperava:

La meva recerca de vuit anys per digitalitzar 45 videocassettes. Part 2
Nginx reescriu les respostes de MediaGoblin perquè els clients puguin sol·licitar fitxers multimèdia directament des de l'emmagatzematge al núvol de Google

La millor part de la meva solució és que no requereix cap canvi al codi de MediaGoblin. La directiva de dues línies de Nginx integra perfectament MediaGoblin i Google Cloud, tot i que els serveis no saben absolutament res els uns dels altres.

Nota: Aquesta solució requereix que els fitxers de l'emmagatzematge al núvol de Google siguin llegibles per tothom. Per reduir el risc d'accés no autoritzat, faig servir un nom de compartiment llarg i aleatori (p. ex. mediagoblin-39dpduhfz1wstbprmyk5ak29) i verifiqueu que la política de control d'accés del cub no permet que els usuaris no autoritzats mostrin el contingut del directori.

Producte final

En aquest punt, tenia una solució completa i funcional. MediaGoblin es va executar feliçment al seu propi contenidor a Google Cloud Platform, de manera que no calia pegar-lo ni actualitzar-lo amb freqüència. Tot el meu procés estava automatitzat i reproduïble, permetent edicions senzilles o retrocessos a versions anteriors.

A la meva família li va agradar molt el fàcil que és veure vídeos. Amb l'ajuda del hack de Nginx descrit anteriorment, treballar amb vídeo es va fer tan ràpid com a YouTube.

La pantalla de visualització té aquest aspecte:

La meva recerca de vuit anys per digitalitzar 45 videocassettes. Part 2
Contingut del catàleg de vídeos familiars per etiqueta "Millor"

Si feu clic a la miniatura, apareixerà una pantalla com aquesta:

La meva recerca de vuit anys per digitalitzar 45 videocassettes. Part 2
Visualització d'un únic clip en un servidor multimèdia

Després d'anys de treball, va ser increïblement gratificant donar als membres de la família l'oportunitat de veure els nostres vídeos a la mateixa interfície fàcil d'utilitzar semblant a YouTube que jo volia inicialment.

Bonificació: reduïu els costos a menys d'1 $ al mes

Mireu vídeos domèstics amb poca freqüència, només cada pocs mesos. La meva família va generar col·lectivament unes 20 hores de trànsit a l'any, però el servidor funcionava les 15 hores del dia. Vaig pagar 99,7 dòlars mensuals per un servidor que va baixar el XNUMX% del temps.

A finals de 2018, Google va llançar el producte Cloud Run. La funció assassina executava contenidors Docker tan ràpidament que l'aplicació podia respondre a les sol·licituds HTTP. És a dir, el servidor podria romandre en mode d'espera i començar només quan algú hi volgués anar. Per a aplicacions d'ús poc freqüent com la meva, els costos han passat de 15 dòlars al mes a uns quants cèntims a l'any.

Per raons que ja no recordo, Cloud Run no va funcionar amb la meva imatge de MediaGoblin. Però amb l'arribada de Cloud Run ho vaig recordar Heroku ofereix un servei similar de forma gratuïta i les seves eines són molt més fàcils d'utilitzar que les de Google.

Amb un servidor d'aplicacions gratuït, l'única despesa és l'emmagatzematge de dades. L'emmagatzematge regional estàndard de Google costa 2,3 cèntims/GB. L'arxiu de vídeo és de 33 GB, així que només pago 77 cèntims al mes.

La meva recerca de vuit anys per digitalitzar 45 videocassettes. Part 2
Aquesta solució només costa 0,77 dòlars al mes

Consells per a aquells que ho van a provar

Evidentment, el procés em va portar molt de temps. Però espero que aquest article us ajudi a estalviar entre un 80 i un 90% de l'esforç de digitalitzar i publicar els vostres vídeos casolans. En una secció a part podeu trobar guia detallada pas a pas durant tot el procés, però aquí teniu alguns consells generals:

  • Deseu el màxim de metadades possibles durant la fase de digitalització i edició.
    • Sovint s'enregistra informació valuosa a les etiquetes de cassets de vídeo.
    • Enregistreu quin clip s'ha extret de quin casset i en quin ordre.
    • Anoteu la data del rodatge, que pot aparèixer al vídeo.
  • Penseu en pagar per serveis de digitalització professionals.
    • Ho faràs extremadament és difícil i costós igualar-los pel que fa a la qualitat de la digitalització.
    • Però allunyeu-vos d'una empresa anomenada EverPresent (feu-me saber si necessiteu més detalls).
  • Si fas la digitalització tu mateix, compra un disc dur.
    • El vídeo de definició estàndard sense comprimir triga entre 100 i 200 MB per minut.
    • Ho vaig guardar tot al meu Synology DS412 + (10 TB).
  • Escriu metadades en algun format comú que no estigui vinculat a una aplicació específica.
    • Descripcions de clips, codis de temps, dates, etc.
    • Si deseu metadades en un format específic de l'aplicació (o pitjor, no les deseu en absolut), no podreu tornar a fer la feina si decidiu utilitzar una solució diferent.
    • Durant l'edició, veus moltes metadades útils al vídeo. Els perdràs si no els deseu.
      • Què passa al vídeo?
      • Qui està registrat allà?
      • Quan es va gravar això?
  • Etiqueta els teus vídeos preferits.
    • Per ser honest, la majoria del contingut de vídeo casolà és bastant avorrit.
    • Aplico l'etiqueta "el millor de" als meus clips preferits i els obro quan vull veure vídeos divertits.
  • Organitzeu una solució integral tan aviat com sigui possible perquè el procés vagi immediatament de principi a fi.
    • Primer vaig intentar digitalitzar totes les cintes, després editar totes les cintes, etc.
    • M'agradaria haver començat amb una cinta i haver fet tota la feina amb ella. Aleshores entendria quines decisions i en quines etapes afecten el resultat final.
  • Mantingueu la recodificació al mínim.
    • Cada vegada que editeu o torneu a codificar un clip, en reduïu la qualitat.
    • Digitalitzeu les imatges en brut amb la màxima qualitat i, a continuació, transcodifiqueu cada clip exactament una vegada al format que reprodueixen els navegadors de manera nativa.
  • Utilitzeu la solució més senzilla possible per publicar videoclips.
    • En retrospectiva, MediaGoblin sembla una eina massa complexa per a un escenari bastant senzill de generar pàgines web amb un conjunt estàtic de fitxers de vídeo.
    • Si hagués de començar de nou, utilitzaria un generador de llocs estàtic com ara Hugo, Jekyll o Gridsome.
  • Fes un muntatge.
    • L'edició de vídeo és una manera divertida de combinar els millors moments de diversos vídeos.
    • El més important en l'edició és la música. Per exemple, el tema és sorprenent Neu lenta de The National, aquest és el meu descobriment personal.

Font: www.habr.com