Min åttaåriga strävan efter att digitalisera 45 videokassetter. Del 2

Den första delen beskriver den svåra strävan att digitalisera gamla familjevideor och bryta ner dem i separata scener.. Efter att ha bearbetat alla klipp ville jag organisera deras visning online lika bekvämt som på YouTube. Eftersom det är personliga minnen från familjen kan de inte läggas upp på själva YouTube. Vi behöver ett mer privat värdskap som är både bekvämt och säkert.

Steg 3: Publicering

ClipBucket, en YouTube-klon med öppen källkod som kan installeras på din egen server

Det första jag försökte ClipBucket, som kallar sig en YouTube-klon med öppen källkod som du kan installera på din server.

Min åttaåriga strävan efter att digitalisera 45 videokassetter. Del 2

Överraskande nog har ClipBucket inga installationsinstruktioner. Tack vare till extern ledning я automatiserade installationsprocessen via Ansible, ett verktyg för hantering av serverkonfigurationer.

En del av svårigheten var att ClipBuckets installationsskript var helt trasiga. På den tiden jag jobbade på Google och enligt villkoren i kontraktet hade jag inte rätt att bidra till YouTube-klonen med öppen källkod, men jag har lagt ut en felrapport, varifrån erforderliga korrigeringar lätt kunde göras. Det gick månader och de förstod fortfarande inte vad problemet var. Istället lade de till allt больше buggar i varje utgåva.

ClipBucket arbetade på en konsultmodell – de släppte sin kod gratis och debiterade för implementeringshjälp. Så småningom gick det upp för mig att ett företag som tjänar pengar på betald support förmodligen inte är särskilt intresserade av att låta kunder installera produkten själva.

MediaGoblin, ett modernare alternativ

Efter månader av frustration med ClipBucket tittade jag på de tillgängliga alternativen och hittade MediaGoblin.

Min åttaåriga strävan efter att digitalisera 45 videokassetter. Del 2
MediaGoblin är en offline-mediadelningsplattform

MediaGoblin har många godsaker. Till skillnad från ClipBucket i fula PHP är MediaGoblin skrivet i Python, ett språk jag har mycket erfarenhet av kodning. Äta kommandoradsgränssnitt, vilket gör att du enkelt kan automatisera videonedladdning. Viktigast av allt, MediaGoblin kommer med Docker-bild, vilket eliminerar eventuella installationsproblem.

Hamnarbetare är en teknik som skapar en autonom miljö för en applikation att köra var som helst. Jag använder Docker i många av hans projekt.

Den överraskande svårigheten att återdocka MediaGoblin

Jag antog att det skulle vara en trivial uppgift att distribuera MediaGoblin docker-bilden. Tja, det gick inte riktigt så.

Den färdiga bilden innehöll inte två nödvändiga funktioner:

  • autentisering
    • MediaGoblin skapar en offentlig medieportal som standard, och jag behövde ett sätt att begränsa åtkomsten till utomstående.
  • Omkodning
    • Varje gång du laddar ner en video försöker MediaGoblin koda om den för optimal streaming. Om videon från början är redo för streaming försämrar omkodning kvaliteten.
    • MediaGoblin tillhandahåller inaktivera omkodning via konfigurationsalternativ, men detta kan inte göras i en befintlig Docker-avbildning.

Nåväl, inga problem. Docker-bilden medföljer öppen källa, så det är möjligt bygga om den själv.

Tyvärr är Docker-bilden inte längre byggd från den nuvarande. MediaGoblin-förrådet. Jag försökte synkronisera den med versionen från det senaste framgångsrika bygget, men det misslyckades också. Även om jag använde exakt samma kod ändrades MediaGoblins externa beroenden, vilket bröt bygget. Efter dussintals timmar körde jag igenom MediaGoblin-byggprocessen på 10-15 minuter om och om igen tills det äntligen fungerade.

Några månader senare hände samma sak. Totalt har MediaGoblin-beroendekedjan brutit min konstruktion flera gånger under de senaste åren, och senast det hände var precis när jag skrev den här artikeln. Jag publicerade äntligen egen gaffel av MediaGoblin c hårdkodade beroenden och explicit specificerade versioner av bibliotek. Med andra ord istället för det tveksamma påståendet att MediaGoblin fungerar med vilken version som helst selleri >= 3.0, jag installerade ett specifikt versionsberoende selleri 4.2.1eftersom jag testade MediaGoblin med den här versionen. Det ser ut som att produkten behöver reproducerbar byggmekanism, men jag har inte gjort det än.

Hur som helst, efter många timmars kamp kunde jag äntligen bygga och konfigurera MediaGoblin i en Docker-bild. Det var redan lätt där hoppa över onödig omkodning и installera Nginx för autentisering.

Steg 4. Hosting

Eftersom MediaGoblin körde Docker på min lokala dator var nästa steg att distribuera den till en molnserver så att familjen kunde titta på videon.

MediaGoblin och videolagringsproblemet

Det finns många plattformar som tar en Docker-bild och är värd för den på en offentlig URL. Haken är att förutom själva appen behövde 33 GB videofiler publiceras. Det var möjligt att hårdkoda dem till en Docker-bild, men det skulle vara krångligt och fult. Att ändra en konfigurationsrad skulle kräva omdistribuering av 33 GB data.

När jag använde ClipBucket löste jag problemet med gcsfuse - ett verktyg som låter operativsystemet ladda upp kataloger till Google Clouds molnlagring som vanliga vägar till filsystemet. Jag var värd för videofilerna på Google Cloud och använde gcsfuse för att få dem att visas i ClipBucket som lokala filer.

Skillnaden var att ClipBucket körde i en riktig virtuell maskin, medan MediaGoblin körde i en Docker-container. Här visade det sig att montera filer från molnlagring vara mycket svårare. Jag tillbringade dussintals timmar med att lösa alla problem och skrev om det hela blogginlägget.

Min åttaåriga strävan efter att digitalisera 45 videokassetter. Del 2
MediaGoblins initiala integration med Google Cloud-lagring, som jag pratar om berättade 2018

Efter flera veckors justering av alla komponenter fungerade allt. Utan att göra några ändringar i MediaGoblins kod, lurade jag den till att läsa och skriva mediefiler till Googles molnlagring.

Det enda problemet var att MediaGoblin blev obscent långsamt. Det tog hela 20 sekunder för videominiatyrer att laddas in på startsidan. Om du hoppade framåt medan du tittade på en video, skulle MediaGoblin pausa i ändlösa 10 sekunder innan du återupptog uppspelningen.

Det största problemet var att videorna och bilderna tog en lång, rundad väg till användaren. De var tvungna att gå från Googles molnlagring genom gcsfuse till MediaGoblin, Nginx - och först då kom de till användarens webbläsare. Den huvudsakliga flaskhalsen var gcsfuse, som inte är optimerad för hastighet. Utvecklarna varnar för stora förseningar i verktygets drift direkt på projektets huvudsida:

Min åttaåriga strävan efter att digitalisera 45 videokassetter. Del 2
varningar om låg prestanda i gcsfuse-dokumentationen

Helst bör webbläsaren hämta filer direkt från Google Cloud och kringgå alla mellanliggande lager. Hur kan du göra detta utan att dyka in i MediaGoblin-kodbasen eller lägga till komplex Google Cloud-integreringslogik?

Sub_filter trick i nginx

Lyckligtvis hittade jag en enkel lösning немного ful. Jag lade till default.conf-konfigurationen i Nginx ett sådant filter:

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

I min installation fungerade Nginx som en proxy mellan MediaGoblin och slutanvändaren. Ovanstående direktiv instruerar Nginx att söka och ersätta alla MediaGoblin HTML-svar innan de skickas till slutanvändaren. Nginx ersätter alla relativa sökvägar till MediaGoblin mediefiler med webbadresser från Googles molnlagring.

Till exempel genererar MediaGoblin HTML så här:

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

Nginx ändrar svaret:

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

Nu fungerar allt som förväntat:

Min åttaåriga strävan efter att digitalisera 45 videokassetter. Del 2
Nginx skriver om svar från MediaGoblin så att klienter kan begära mediefiler direkt från Googles molnlagring

Det bästa med min lösning är att den inte kräver några ändringar av MediaGoblin-koden. Nginx tvåradsdirektiv integrerar sömlöst MediaGoblin och Google Cloud, även om tjänsterna absolut inte vet något om varandra.

Notera: Den här lösningen kräver att filer i Googles molnlagring är läsbara av alla. För att minska risken för obehörig åtkomst använder jag ett långt, slumpmässigt bucket-namn (t.ex. mediagoblin-39dpduhfz1wstbprmyk5ak29) och verifiera att hinkens åtkomstkontrollpolicy inte tillåter obehöriga användare att visa innehållet i katalogen.

Slutprodukt

Vid det här laget hade jag en komplett fungerande lösning. MediaGoblin körde glatt i sin egen container på Googles molnplattform, så den behövde inte lappas eller uppdateras ofta. Allt i min process var automatiserat och reproducerbart, vilket möjliggör enkla redigeringar eller återställningar till tidigare versioner.

Min familj gillade verkligen hur lätt det var att titta på videorna. Med hjälp av Nginx-hacket som beskrivs ovan blev arbetet med videor lika snabbt som på YouTube.

Visningsskärmen ser ut så här:

Min åttaåriga strävan efter att digitalisera 45 videokassetter. Del 2
Innehållet i familjevideokatalogen efter taggen "Bäst"

Om du klickar på miniatyrbilden visas en skärm så här:

Min åttaåriga strävan efter att digitalisera 45 videokassetter. Del 2
Visa ett enstaka klipp på en mediaserver

Efter år av arbete var det otroligt givande att ge familjemedlemmar möjligheten att titta på våra videor i samma användarvänliga YouTube-liknande gränssnitt som jag ursprungligen ville ha.

Bonus: Minska kostnaderna till mindre än $1 per månad

Du tittar inte ofta på hemmavideor, bara varannan månad. Min familj genererade tillsammans cirka 20 timmars trafik på ett år, men servern körde 15/99,7. Jag betalade $XNUMX per månad för en server som låg nere XNUMX% av tiden.

I slutet av 2018 släppte Google produkten Cloud Run. Killer-funktionen körde Docker-behållare så snabbt att applikationen kunde svara på HTTP-förfrågningar. Det vill säga, servern kunde förbli i standby-läge och starta endast när någon ville komma åt den. För sällan körda applikationer som mina har kostnaden sjunkit från $15 per månad till några cent per år.

Av skäl som jag inte längre minns fungerade inte Cloud Run med min MediaGoblin-bild. Men med tillkomsten av Cloud Run kom jag ihåg det Heroku erbjuder en liknande tjänst gratis, och deras verktyg är mycket mer användarvänliga än Googles.

Med en gratis applikationsserver är den enda kostnaden datalagring. Googles vanliga regionala lagring kostar 2,3 cent/GB. Videoarkivet tar upp 33 GB, så jag betalar bara 77 cent i månaden.

Min åttaåriga strävan efter att digitalisera 45 videokassetter. Del 2
Denna lösning kostar endast 0,77 USD per månad

Tips till dig som planerar att prova

Självklart tog processen lång tid för mig. Men jag hoppas att den här artikeln hjälper dig att spara 80-90 % av ansträngningen att digitalisera och publicera dina hemmavideor. I ett separat avsnitt kan du hitta detaljerad steg-för-steg-guide under hela processen, men här är några allmänna tips:

  • Under digitaliserings- och redigeringsfasen, bevara så mycket metadata som möjligt.
    • Värdefull information finns ofta inspelad på videokassettetiketter.
    • Håll koll på vilket klipp som spelades in från vilket band och i vilken ordning.
    • Skriv ner datumet för inspelningen, vilket kan visas på videon.
  • Överväg att betala för professionella digitaliseringstjänster.
    • Du kommer extremt det är svårt och dyrt att matcha dem när det gäller digitaliseringskvalitet.
    • Men håll dig borta från ett företag som heter EverPresent (meddela mig om du behöver detaljer).
  • Om du digitaliserar själv, köp en hårddisk.
    • Okomprimerad standardupplösningsvideo tar 100-200 MB per minut.
    • Jag behöll allt på mitt Synology DS412 + (10 TB).
  • Spela in metadata i något vanligt format som inte är knutet till en specifik applikation.
    • Klippbeskrivningar, tidskoder, datum etc.
    • Om du sparar metadata i ett applikationsspecifikt format (eller ännu värre, inte sparar det alls) kommer du inte att kunna göra om jobbet om du bestämmer dig för att använda en annan lösning.
    • När du redigerar ser du mycket användbar metadata på videon. Du kommer att förlora dem om du inte sparar dem.
      • Vad händer i videon?
      • Vem är registrerad där?
      • När spelades detta in?
  • Markera dina favoritvideor.
    • För att vara ärlig är de flesta hemvideor ganska tråkiga.
    • Jag applicerar "best of"-taggen på mina favoritklipp och öppnar dem när jag vill titta på roliga videor.
  • Organisera en helhetslösning så tidigt som möjligt så att processen går direkt från början till slut.
    • Jag försökte först digitalisera alla band, sedan redigera alla band osv.
    • Jag önskar att jag hade börjat med ett band och gjort allt arbete med det. Då skulle jag förstå vilka beslut och i vilka skeden som påverkar slutresultatet.
  • Fortsätt omkoda till ett minimum.
    • Varje gång du redigerar eller kodar om ett klipp minskar du dess kvalitet.
    • Digitalisera ditt råmaterial med högsta kvalitet och koda sedan om varje klipp exakt en gång till det format som webbläsare renderar.
  • Använd den enklaste lösningen för att publicera videoklipp.
    • I efterhand verkar MediaGoblin vara ett alltför komplext verktyg för det ganska enkla scenariot att generera webbsidor med en statisk uppsättning videofiler.
    • Om jag skulle börja om skulle jag använda en statisk webbplatsgenerator som Hugo, Jekyll eller Gridsomt.
  • Gör installationen.
    • Videoredigering är ett roligt sätt att kombinera de bästa ögonblicken från flera videor.
    • Huvudsaken i redigering är musik. Till exempel är temat fantastiskt Långsam snö från The National, detta är min personliga upptäckt.

Källa: will.com