La mia ricerca durata otto anni per digitalizzare 45 videocassette. Parte 2

La prima parte descrive la difficile ricerca per digitalizzare vecchi video di famiglia e scomporli in scene separate.. Dopo aver elaborato tutte le clip, volevo organizzarne la visione online in modo comodo come su YouTube. Poiché si tratta di ricordi personali della famiglia, non possono essere pubblicati su YouTube stesso. Abbiamo bisogno di un hosting più privato che sia conveniente e sicuro.

Passaggio 3: pubblicazione

ClipBucket, un clone di YouTube open source che può essere installato sul tuo server

La prima cosa che ho provato you video, che si autodefinisce un clone di YouTube open source che puoi installare sul tuo server.

La mia ricerca durata otto anni per digitalizzare 45 videocassette. Parte 2

Sorprendentemente, ClipBucket non ha istruzioni di installazione. Grazie a alla gestione esterna я automatizzato il processo di installazione via ansible, uno strumento di gestione della configurazione del server.

Parte della difficoltà era che gli script di installazione di ClipBucket erano completamente danneggiati. In quel momento io ha lavorato presso Google e secondo i termini del contratto non avevo il diritto di contribuire al clone open source di YouTube, ma io ha pubblicato una segnalazione di bug, da cui si potrebbero facilmente apportare le necessarie correzioni. Passarono i mesi e ancora non capivano quale fosse il problema. Invece hanno aggiunto tutto più bug in ogni versione.

ClipBucket ha operato in base a un modello di consulenza: ha rilasciato il proprio codice gratuitamente e ha addebitato costi per l'assistenza nella distribuzione. A poco a poco mi sono reso conto che un'azienda che guadagna dal supporto a pagamento probabilmente non è molto interessata a che i clienti installino il prodotto da soli.

MediaGoblin, un'alternativa più moderna

Dopo mesi di frustrazione con ClipBucket, ho esaminato le opzioni disponibili e ho trovato MediaGoblin.

La mia ricerca durata otto anni per digitalizzare 45 videocassette. Parte 2
MediaGoblin è una piattaforma di condivisione multimediale offline

MediaGoblin ha molte chicche. A differenza di ClipBucket nell'antiestetico PHP, MediaGoblin è scritto in Python, un linguaggio con cui ho molta esperienza di programmazione. Mangiare interfaccia della riga di comando, che ti consente di automatizzare facilmente il download dei video. Ancora più importante, MediaGoblin viene fornito con Immagine Docker, che elimina qualsiasi problema di installazione.

docker è una tecnologia che crea un ambiente autonomo affinché un'applicazione possa essere eseguita ovunque. Utilizzo Docker molti dei suoi progetti.

La sorprendente difficoltà di ri-dockerizzare MediaGoblin

Supponevo che la distribuzione dell'immagine docker MediaGoblin sarebbe stata un compito banale. Beh, le cose non sono andate proprio così.

L'immagine finita non conteneva due funzioni necessarie:

  • autenticazione
    • MediaGoblin crea un portale multimediale pubblico per impostazione predefinita e avevo bisogno di un modo per limitare l'accesso agli estranei.
  • Transcodifica
    • Ogni volta che scarichi un video, MediaGoblin tenta di transcodificarlo per uno streaming ottimale. Se il video è inizialmente pronto per lo streaming, la transcodifica ne riduce la qualità.
    • MediaGoblin fornisce disabilitando la transcodifica tramite le opzioni di configurazione, ma ciò non può essere fatto in un'immagine Docker esistente.

Bene, nessun problema. Viene fornita l'immagine Docker fonte aperta, quindi è possibile ricostruiscilo tu stesso.

Sfortunatamente, l'immagine Docker non è più creata da quella attuale. Archivio MediaGoblin. Ho provato a sincronizzarlo con la versione dell'ultima build riuscita, ma anche questo non è riuscito. Anche se ho utilizzato esattamente lo stesso codice, le dipendenze esterne di MediaGoblin sono cambiate, interrompendo il build. Dopo decine di ore, ho ripetuto più e più volte il processo di creazione di MediaGoblin, durato 10-15 minuti, finché alla fine non ha funzionato.

Qualche mese dopo accadde la stessa cosa. In totale, la catena di dipendenze di MediaGoblin ha interrotto la mia build diverse volte negli ultimi due anni e l'ultima volta che è successo è stato proprio mentre stavo scrivendo questo articolo. Finalmente ho pubblicato proprio fork di MediaGoblin c dipendenze codificate e versioni di librerie esplicitamente specificate. In altre parole, invece della dubbia affermazione che MediaGoblin funziona con qualsiasi versione sedano >= 3.0, ho installato una dipendenza della versione specifica sedano 4.2.1perché ho testato MediaGoblin con questa versione. Sembra che il prodotto abbia bisogno meccanismo di costruzione riproducibile, ma non l'ho ancora fatto.

Ad ogni modo, dopo molte ore di lotta, sono finalmente riuscito a creare e configurare MediaGoblin in un'immagine Docker. Già lì era facile saltare la transcodifica non necessaria и installa Nginx per l'autenticazione.

Passaggio 4. Hosting

Dato che MediaGoblin eseguiva Docker sul mio computer locale, il passo successivo è stato distribuirlo su un server cloud in modo che la famiglia potesse guardare il video.

MediaGoblin e il problema dell'archiviazione dei video

Esistono molte piattaforme che accettano un'immagine Docker e la ospitano su un URL pubblico. Il problema è che oltre all'app stessa si dovevano pubblicare 33 GB di file video. Era possibile codificarli in un'immagine Docker, ma sarebbe scomodo e brutto. La modifica di una riga di configurazione richiederebbe la ridistribuzione di 33 GB di dati.

Quando ho usato ClipBucket ho risolto il problema con gcsfuse - un'utilità che consente al sistema operativo di caricare directory nell'archivio cloud di Google Cloud come percorsi regolari al file system. Ho ospitato i file video su Google Cloud e ho utilizzato gcsfuse per farli apparire in ClipBucket come file locali.

La differenza era che ClipBucket veniva eseguito in una macchina virtuale reale, mentre MediaGoblin veniva eseguito in un contenitore Docker. In questo caso, montare file dal cloud storage si è rivelato molto più difficile. Ho passato dozzine di ore a risolvere tutti i problemi e ne ho scritto intero post del blog.

La mia ricerca durata otto anni per digitalizzare 45 videocassette. Parte 2
L'integrazione iniziale di MediaGoblin con lo spazio di archiviazione Google Cloud, di cui sto parlando raccontato nel 2018

Dopo diverse settimane di regolazione di tutti i componenti, tutto ha funzionato. Senza apportare alcuna modifica al codice di MediaGoblin, l'ho ingannato facendogli leggere e scrivere file multimediali nell'archivio cloud di Google.

L'unico problema era che MediaGoblin era diventato oscenamente lento. Ci sono voluti 20 secondi interi per caricare le miniature dei video sulla home page. Se saltassi in avanti mentre guardi un video, MediaGoblin si fermerebbe per 10 secondi interminabili prima di riprendere la riproduzione.

Il problema principale era che i video e le immagini impiegavano un percorso lungo e tortuoso per raggiungere l'utente. Dovevano passare dal cloud storage di Google tramite gcsfuse a MediaGoblin, Nginx e solo allora sono arrivati ​​al browser dell'utente. Il collo di bottiglia principale era gcsfuse, che non è ottimizzato per la velocità. Gli sviluppatori avvertono dei grandi ritardi nel funzionamento dell'utilità direttamente sulla pagina principale del progetto:

La mia ricerca durata otto anni per digitalizzare 45 videocassette. Parte 2
avvertenze riguardo alle basse prestazioni nella documentazione di gcsfuse

Idealmente, il browser dovrebbe recuperare i file direttamente da Google Cloud, ignorando eventuali livelli intermedi. Come puoi farlo senza immergerti nel codice base di MediaGoblin o aggiungere la complessa logica di integrazione di Google Cloud?

Trucco Sub_filter in nginx

Fortunatamente ho trovato una soluzione semplice, però leggermente brutto. Ho aggiunto alla configurazione default.conf in Nginx un tale filtro:

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

Nella mia configurazione, Nginx ha agito come proxy tra MediaGoblin e l'utente finale. La direttiva di cui sopra indica a Nginx di cercare e sostituire tutte le risposte HTML di MediaGoblin prima di fornirle all'utente finale. Nginx sostituisce tutti i percorsi relativi ai file multimediali MediaGoblin con gli URL dal cloud storage di Google.

Ad esempio, MediaGoblin genera HTML in questo modo:

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

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

Ora tutto funziona come previsto:

La mia ricerca durata otto anni per digitalizzare 45 videocassette. Parte 2
Nginx riscrive le risposte di MediaGoblin in modo che i clienti possano richiedere file multimediali direttamente dallo spazio di archiviazione cloud di Google

La parte migliore della mia soluzione è che non richiede alcuna modifica al codice MediaGoblin. La direttiva a due righe di Nginx integra perfettamente MediaGoblin e Google Cloud, anche se i servizi non sanno assolutamente nulla l'uno dell'altro.

Nota: questa soluzione richiede che i file nell'archivio cloud di Google siano leggibili da tutti. Per ridurre il rischio di accesso non autorizzato, utilizzo un nome di bucket lungo e casuale (ad es. mediagoblin-39dpduhfz1wstbprmyk5ak29) e verificare che la policy di controllo degli accessi del bucket non consenta agli utenti non autorizzati di visualizzare il contenuto della directory.

Prodotto finale

A questo punto avevo una soluzione completa e funzionante. MediaGoblin funzionava perfettamente nel proprio contenitore sulla piattaforma cloud di Google, quindi non aveva bisogno di patch o aggiornamenti frequenti. Tutto nel mio processo era automatizzato e riproducibile, consentendo semplici modifiche o rollback alle versioni precedenti.

Alla mia famiglia è piaciuto molto quanto fosse facile guardare i video. Con l'aiuto dell'hack Nginx sopra descritto, lavorare con i video è diventato veloce come su YouTube.

La schermata di visualizzazione si presenta così:

La mia ricerca durata otto anni per digitalizzare 45 videocassette. Parte 2
Contenuti del catalogo video di famiglia per tag “Best”

Cliccando sulla miniatura si apre una schermata come questa:

La mia ricerca durata otto anni per digitalizzare 45 videocassette. Parte 2
Visualizzazione di un singolo clip su un server multimediale

Dopo anni di lavoro, è stato incredibilmente gratificante offrire ai membri della famiglia l'opportunità di guardare i nostri video nella stessa interfaccia user-friendly simile a YouTube che inizialmente desideravo.

Bonus: riduci i costi a meno di $ 1 al mese

Non guardi spesso i video domestici, solo ogni pochi mesi. La mia famiglia ha generato complessivamente circa 20 ore di traffico in un anno, ma il server era attivo 15 ore su 99,7, XNUMX giorni su XNUMX. Ho pagato $ XNUMX al mese per un server inattivo il XNUMX% delle volte.

Alla fine del 2018, Google ha rilasciato il prodotto Corsa sul cloud. La funzionalità killer era l'esecuzione dei contenitori Docker così rapidamente che l'applicazione poteva rispondere alle richieste HTTP. Cioè, il server potrebbe rimanere in modalità standby e avviarsi solo quando qualcuno volesse accedervi. Per le applicazioni eseguite raramente come la mia, il costo è sceso da $ 15 al mese a pochi centesimi all'anno.

Per ragioni che non ricordo più, Cloud Run non funzionava con la mia immagine MediaGoblin. Ma con l'avvento di Cloud Run me ne sono ricordato Heroku offre un servizio simile gratuitamente e i suoi strumenti sono molto più intuitivi di quelli di Google.

Con un application server gratuito, l'unico costo è l'archiviazione dei dati. Lo spazio di archiviazione regionale standard di Google costa 2,3 centesimi/GB. L'archivio video occupa 33 GB, quindi pago solo 77 centesimi al mese.

La mia ricerca durata otto anni per digitalizzare 45 videocassette. Parte 2
Questa soluzione costa solo $ 0,77 al mese

Suggerimenti per chi ha intenzione di provare

Ovviamente il processo mi ha richiesto molto tempo. Ma spero che questo articolo ti aiuti a risparmiare l'80-90% dello sforzo di digitalizzazione e pubblicazione dei tuoi video domestici. In una sezione separata puoi trovare guida dettagliata passo dopo passo durante tutto il processo, ma ecco alcuni suggerimenti generali:

  • Durante la fase di digitalizzazione e modifica, preserva quanti più metadati possibile.
    • Informazioni preziose sono spesso registrate sulle etichette delle videocassette.
    • Tieni traccia di quale clip è stata girata da quale nastro e in quale ordine.
    • Annota la data delle riprese, che potrebbe apparire sul video.
  • Valuta la possibilità di pagare per servizi di digitalizzazione professionali.
    • Desideri чрезвычайно è difficile e costoso eguagliarli in termini di qualità della digitalizzazione.
    • Ma stai lontano da un'azienda chiamata EverPresent (inviami un messaggio se hai bisogno di dettagli).
  • Se esegui tu stesso la digitalizzazione, acquista un HDD.
    • Il video a definizione standard non compresso richiede 100-200 MB al minuto.
    • Ho tenuto tutto sul mio Synology DS412 + (10TB).
  • Registra i metadati in un formato comune non legato a un'applicazione specifica.
    • Descrizioni dei clip, codici temporali, date, ecc.
    • Se salvi i metadati in un formato specifico dell'applicazione (o, peggio, non li salvi affatto), non sarai in grado di ripetere il lavoro se decidi di utilizzare una soluzione diversa.
    • Durante la modifica, vedi molti metadati utili sul video. Li perderai se non li salvi.
      • Cosa succede nel video?
      • Chi è registrato lì?
      • Quando è stato registrato?
  • Contrassegna i tuoi video preferiti.
    • Ad essere onesti, la maggior parte dei video domestici sono piuttosto noiosi.
    • Applico il tag "best of" ai miei clip preferiti e li apro quando voglio guardare video divertenti.
  • Organizzare una soluzione completa il prima possibile in modo che il processo proceda direttamente dall'inizio alla fine.
    • Ho provato prima a digitalizzare tutti i nastri, poi a modificarli, ecc.
    • Vorrei aver iniziato con un nastro e aver fatto tutto il lavoro con esso. Poi capirei quali decisioni e in quali fasi influiscono sul risultato finale.
  • Continua a ricodificare al minimo.
    • Ogni volta che modifichi o ricodifichi una clip, ne riduci la qualità.
    • Digitalizza il tuo filmato grezzo alla massima qualità, quindi transcodifica ogni clip esattamente una volta nel formato renderizzato in modo nativo dai browser.
  • Utilizza la soluzione più semplice possibile per pubblicare videoclip.
    • In retrospettiva, MediaGoblin sembra uno strumento eccessivamente complesso per lo scenario abbastanza semplice di generazione di pagine Web con un insieme statico di file video.
    • Se dovessi ricominciare da capo, utilizzerei un generatore di siti statici come Hugo, Jekyll o Gridoso.
  • Effettuare l'installazione.
    • L'editing video è un modo divertente per combinare i momenti migliori di più video.
    • La cosa principale nel montaggio è la musica. Ad esempio, il tema è fantastico Neve lenta da The National, questa è la mia scoperta personale.

Fonte: habr.com