Mitt åtte år lange forsøk på å digitalisere 45 videokassetter. Del 2

Den første delen beskriver den vanskelige søken etter å digitalisere gamle familievideoer og bryte dem ned i separate scener.. Etter å ha behandlet alle klippene, ønsket jeg å organisere visningen deres på nettet like praktisk som på YouTube. Siden dette er personlige minner fra familien, kan de ikke legges ut på selve YouTube. Vi trenger en mer privat hosting som er både praktisk og sikker.

Trinn 3: Publisering

ClipBucket, en åpen kildekode YouTube-klone som kan installeres på din egen server

Det første jeg prøvde ClipBucket, som kaller seg en åpen kildekode YouTube-klone som du kan installere på serveren din.

Mitt åtte år lange forsøk på å digitalisere 45 videokassetter. Del 2

Overraskende nok har ikke ClipBucket noen installasjonsinstruksjoner. Takk til til ekstern ledelse я automatisert installasjonsprosessen via Ansible, et administrasjonsverktøy for serverkonfigurasjon.

En del av vanskeligheten var at ClipBucket-installasjonsskriptene var fullstendig ødelagte. På den tiden jeg jobbet hos Google og i henhold til vilkårene i kontrakten hadde jeg ikke rett til å bidra til YouTube-klonen med åpen kildekode, men jeg har lagt ut en feilrapport, hvorfra de nødvendige rettelser lett kunne gjøres. Det gikk måneder, og de forsto fortsatt ikke hva problemet var. I stedet la de til alt mer enn feil i hver utgivelse.

ClipBucket opererte på en konsulentmodell - de ga ut koden sin gratis og belastet for distribusjonsassistanse. Det gikk etter hvert opp for meg at et selskap som tjener penger på betalt support sannsynligvis ikke er særlig interessert i at kundene skal installere produktet selv.

MediaGoblin, et mer moderne alternativ

Etter måneder med frustrasjon med ClipBucket, så jeg på de tilgjengelige alternativene og fant MediaGoblin.

Mitt åtte år lange forsøk på å digitalisere 45 videokassetter. Del 2
MediaGoblin er en offline mediedelingsplattform

MediaGoblin har mange godbiter. I motsetning til ClipBucket i skjemmende PHP, er MediaGoblin skrevet i Python, et språk jeg har mye erfaring med koding. Spise kommandolinjegrensesnitt, som lar deg enkelt automatisere videonedlasting. Viktigst, MediaGoblin kommer med Docker-bilde, som eliminerer eventuelle installasjonsproblemer.

Docker er en teknologi som skaper et autonomt miljø for en applikasjon å kjøre hvor som helst. Jeg bruker Docker i mange av prosjektene hans.

Den overraskende vanskeligheten med å re-dockere MediaGoblin

Jeg antok at distribusjon av MediaGoblin docker-bilde ville være en triviell oppgave. Vel, det gikk ikke helt sånn.

Det ferdige bildet inneholdt ikke to nødvendige funksjoner:

  • Autentisering
    • MediaGoblin oppretter en offentlig medieportal som standard, og jeg trengte en måte å begrense tilgangen til utenforstående.
  • Omkoding
    • Hver gang du laster ned en video, prøver MediaGoblin å omkode den for optimal strømming. Hvis videoen i utgangspunktet er klar for streaming, forringer omkoding kvaliteten.
    • MediaGoblin tilbyr deaktivere transkoding via konfigurasjonsalternativer, men dette kan ikke gjøres i et eksisterende Docker-bilde.

Vel, ikke noe problem. Docker-bildet følger med åpen kilde, så det er mulig bygge den opp igjen selv.

Dessverre er Docker-bildet ikke lenger bygget fra det nåværende. MediaGoblin-depot. Jeg prøvde å synkronisere den med versjonen fra det siste vellykkede bygget, men det mislyktes også. Selv om jeg brukte nøyaktig samme kode, endret MediaGoblins eksterne avhengigheter seg og brøt bygget. Etter dusinvis av timer kjørte jeg gjennom MediaGoblin-byggeprosessen på 10-15 minutter om og om igjen til den endelig fungerte.

Noen måneder senere skjedde det samme. Totalt har MediaGoblin-avhengighetskjeden brutt bygget mitt flere ganger i løpet av de siste par årene, og sist gang det skjedde var akkurat mens jeg skrev denne artikkelen. Jeg publiserte endelig egen gaffel av MediaGoblin c hardkodede avhengigheter og eksplisitt spesifiserte versjoner av biblioteker. Med andre ord, i stedet for den tvilsomme påstanden om at MediaGoblin fungerer med hvilken som helst versjon selleri >= 3.0, installerte jeg en spesifikk versjonsavhengighet selleri 4.2.1fordi jeg testet MediaGoblin med denne versjonen. Det ser ut som produktet trenger reproduserbar byggemekanisme, men jeg har ikke gjort det ennå.

Uansett, etter mange timers kamp, ​​klarte jeg endelig å bygge og konfigurere MediaGoblin i et Docker-bilde. Det var allerede lett der hoppe over unødvendig omkoding и installer Nginx for autentisering.

Trinn 4. Hosting

Siden MediaGoblin kjørte Docker på min lokale datamaskin, var neste trinn å distribuere den til en skyserver slik at familien kunne se videoen.

MediaGoblin og videolagringsproblemet

Det er mange plattformer som tar et Docker-bilde og er vert for det på en offentlig URL. Haken er at i tillegg til selve appen, måtte 33 GB med videofiler publiseres. Det var mulig å hardkode dem til et Docker-bilde, men det ville være tungvint og stygt. Endring av én linje med konfigurasjon vil kreve omdistribuering av 33 GB data.

Da jeg brukte ClipBucket løste jeg problemet med gcsfuse - et verktøy som lar operativsystemet laste opp kataloger til Google Cloud-skylagring som vanlige stier til filsystemet. Jeg var vert for videofilene på Google Cloud og brukte gcsfuse for å få dem til å vises i ClipBucket som lokale filer.

Forskjellen var at ClipBucket kjørte i en ekte virtuell maskin, mens MediaGoblin kjørte i en Docker-beholder. Her viste det seg å montere filer fra skylagring å være mye vanskeligere. Jeg brukte dusinvis av timer på å løse alle problemene og skrev om det hele blogginnlegget.

Mitt åtte år lange forsøk på å digitalisere 45 videokassetter. Del 2
MediaGoblins første integrasjon med Google Cloud-lagring, som jeg snakker om fortalt i 2018

Etter flere uker med justering av alle komponentene, fungerte alt. Uten å gjøre noen endringer i MediaGoblins kode, jukset jeg den til å lese og skrive mediefiler til Googles skylagring.

Det eneste problemet var at MediaGoblin ble uanstendig treg. Det tok hele 20 sekunder før videominiatyrbilder ble lastet inn på hjemmesiden. Hvis du hoppet fremover mens du så på en video, ville MediaGoblin pause i endeløse 10 sekunder før du gjenopptok avspillingen.

Hovedproblemet var at videoene og bildene tok en lang, rundkjøringsvei til brukeren. De måtte gå fra Google skylagring gjennom gcsfuse til MediaGoblin, Nginx – og først da kom de til brukerens nettleser. Hovedflaskehalsen var gcsfuse, som ikke er optimalisert for hastighet. Utviklerne advarer om store forsinkelser i verktøyets drift rett på prosjektets hovedside:

Mitt åtte år lange forsøk på å digitalisere 45 videokassetter. Del 2
Rediger advarsler om lav ytelse i gcsfuse-dokumentasjonen

Ideelt sett bør nettleseren hente filer direkte fra Google Cloud og omgå eventuelle mellomlag. Hvordan kan du gjøre dette uten å dykke ned i MediaGoblin-kodebasen eller legge til kompleks Google Cloud-integrasjonslogikk?

Sub_filter triks i nginx

Heldigvis fant jeg en enkel løsning немного stygg. Jeg la til default.conf-konfigurasjonen i Nginx et slikt filter:

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

I mitt oppsett fungerte Nginx som en proxy mellom MediaGoblin og sluttbrukeren. Direktivet ovenfor instruerer Nginx til å søke og erstatte alle MediaGoblin HTML-svar før de vises til sluttbrukeren. Nginx erstatter alle relative stier til MediaGoblin-mediefiler med URL-er fra Googles skylagring.

For eksempel genererer MediaGoblin HTML slik:

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

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

Nå fungerer alt som forventet:

Mitt åtte år lange forsøk på å digitalisere 45 videokassetter. Del 2
Nginx omskriver svar fra MediaGoblin slik at klienter kan be om mediefiler direkte fra Googles skylagring

Det beste med løsningen min er at den ikke krever noen endringer i MediaGoblin-koden. Nginx sitt to-linjers direktiv integrerer sømløst MediaGoblin og Google Cloud, selv om tjenestene vet absolutt ingenting om hverandre.

Note: Denne løsningen krever at filer i Google skylagring er lesbare for alle. For å redusere risikoen for uautorisert tilgang bruker jeg et langt, tilfeldig bøttenavn (f.eks. mediagoblin-39dpduhfz1wstbprmyk5ak29) og kontroller at bøttens tilgangskontrollpolicy ikke tillater uautoriserte brukere å vise innholdet i katalogen.

Sluttprodukt

På dette tidspunktet hadde jeg en komplett, fungerende løsning. MediaGoblin kjørte fornøyd i sin egen beholder på Googles skyplattform, så det trengte ikke å bli lappet eller oppdatert ofte. Alt i prosessen min var automatisert og reproduserbart, noe som muliggjorde enkle redigeringer eller tilbakeføringer til tidligere versjoner.

Familien min likte virkelig hvor enkelt det var å se videoene. Ved hjelp av Nginx-hacket beskrevet ovenfor ble arbeidet med videoer like raskt som på YouTube.

Visningsskjermen ser slik ut:

Mitt åtte år lange forsøk på å digitalisere 45 videokassetter. Del 2
Innhold i familievideokatalogen etter taggen «Best»

Ved å klikke på miniatyrbildet får du opp en skjerm som dette:

Mitt åtte år lange forsøk på å digitalisere 45 videokassetter. Del 2
Vise et enkelt klipp på en medieserver

Etter år med arbeid var det utrolig givende å gi familiemedlemmer muligheten til å se videoene våre i det samme brukervennlige YouTube-lignende grensesnittet som jeg opprinnelig ønsket.

Bonus: Reduser kostnadene til mindre enn $1 per måned

Du ser ikke hjemmevideoer ofte, bare noen få måneder. Familien min genererte til sammen rundt 20 timer med trafikk i løpet av et år, men serveren kjørte 15/99,7. Jeg betalte $XNUMX månedlig for en server som var nede XNUMX% av tiden.

På slutten av 2018 ga Google ut produktet Cloud Run. Killer-funksjonen kjørte Docker-beholdere så raskt at applikasjonen kunne svare på HTTP-forespørsler. Det vil si at serveren kunne forbli i standby-modus og starte bare når noen ville ha tilgang til den. For applikasjoner som kjøres sjeldent som mine, har kostnadene falt fra $15 per måned til noen få cent per år.

Av grunner jeg ikke lenger husker, fungerte ikke Cloud Run med MediaGoblin-bildet mitt. Men med bruken av Cloud Run husket jeg det Heroku tilbyr en lignende tjeneste gratis, og verktøyene deres er mye mer brukervennlige enn Googles.

Med en gratis applikasjonsserver er den eneste kostnaden datalagring. Googles standard regionale lagring koster 2,3 cent/GB. Videoarkivet tar opp 33 GB, så jeg betaler bare 77 cent i måneden.

Mitt åtte år lange forsøk på å digitalisere 45 videokassetter. Del 2
Denne løsningen koster bare $0,77 per måned

Tips til de som planlegger å prøve

Det er klart at prosessen tok meg lang tid. Men jeg håper denne artikkelen vil hjelpe deg å spare 80-90 % av innsatsen med å digitalisere og publisere hjemmevideoene dine. I en egen seksjon kan du finne detaljert steg-for-steg guide gjennom hele prosessen, men her er noen generelle tips:

  • Under digitaliserings- og redigeringsfasen, ta vare på så mye metadata som mulig.
    • Verdifull informasjon er ofte registrert på videokassettetiketter.
    • Hold styr på hvilket klipp som ble tatt fra hvilket bånd og i hvilken rekkefølge.
    • Skriv ned datoen for opptak, som kan vises på videoen.
  • Vurder å betale for profesjonelle digitaliseringstjenester.
    • du vil ekstremt det er vanskelig og dyrt å matche dem når det gjelder digitaliseringskvalitet.
    • Men hold deg unna et selskap som heter EverPresent (send meg en melding hvis du trenger detaljer).
  • Hvis du digitaliserer selv, kjøp en HDD.
    • Ukomprimert standardoppløsningsvideo tar 100–200 MB per minutt.
    • Jeg beholdt alt på min Synology DS412 + (10 TB).
  • Ta opp metadata i et vanlig format som ikke er knyttet til en bestemt applikasjon.
    • Klippbeskrivelser, tidskoder, datoer osv.
    • Hvis du lagrer metadata i et applikasjonsspesifikt format (eller enda verre, ikke lagrer det i det hele tatt), vil du ikke kunne gjøre om jobben hvis du bestemmer deg for å bruke en annen løsning.
    • Mens du redigerer, ser du mye nyttig metadata på videoen. Du vil miste dem hvis du ikke lagrer dem.
      • Hva skjer i videoen?
      • Hvem er registrert der?
      • Når ble dette tatt opp?
  • Merk favorittvideoene dine.
    • For å være ærlig er de fleste hjemmevideoer ganske kjedelige.
    • Jeg bruker "best of"-taggen på favorittklippene mine og åpner dem når jeg vil se morsomme videoer.
  • Organiser en helhetlig løsning så tidlig som mulig slik at prosessen går rett fra start til slutt.
    • Jeg prøvde å digitalisere alle kassettene først, deretter redigere alle kassettene osv.
    • Jeg skulle ønske jeg hadde startet med ett bånd og gjort alt arbeidet med det. Da ville jeg forstå hvilke avgjørelser og på hvilke stadier som påvirker det endelige resultatet.
  • Fortsett omkodingen til et minimum.
    • Hver gang du redigerer eller omkoder et klipp, reduserer du kvaliteten.
    • Digitaliser råopptakene dine med maksimal kvalitet, og omkod deretter hvert klipp nøyaktig én gang til formatet som nettlesere gjengir.
  • Bruk den enkleste løsningen for å publisere videoklipp.
    • I ettertid virker MediaGoblin som et altfor komplekst verktøy for det ganske enkle scenariet med å generere nettsider med et statisk sett med videofiler.
    • Hvis jeg skulle starte på nytt, ville jeg brukt en statisk nettstedsgenerator som Hugo, Jekyll eller Gridsomt.
  • Gjør installasjonen.
    • Videoredigering er en morsom måte å kombinere de beste øyeblikkene fra flere videoer.
    • Hovedsaken i redigering er musikk. For eksempel er temaet fantastisk Sakte snø fra The National, dette er min personlige oppdagelse.

Kilde: www.habr.com