Min otte-årige søgen efter at digitalisere 45 videokassetter. Del 2

Den første del beskriver den svære søgen efter at digitalisere gamle familievideoer og opdele dem i separate scener.. Efter at have behandlet alle klippene ville jeg organisere deres visning online lige så bekvemt som på YouTube. Da der er tale om personlige minder om familien, kan de ikke lægges på YouTube selv. Vi har brug for en mere privat hosting, der er både praktisk og sikker.

Trin 3: Udgivelse

ClipBucket, en open source YouTube-klon, der kan installeres på din egen server

Det første jeg prøvede ClipBucket, som kalder sig en open source YouTube-klon, som du kan installere på din server.

Min otte-årige søgen efter at digitalisere 45 videokassetter. Del 2

Overraskende nok har ClipBucket ingen installationsinstruktioner. Tak til til ekstern ledelse я automatiserede installationsprocessen via Ansible, et serverkonfigurationsstyringsværktøj.

En del af vanskeligheden var, at ClipBucket installationsscripts var fuldstændig ødelagte. Dengang jeg arbejdet hos Google og i henhold til vilkårene i kontrakten havde jeg ikke ret til at bidrage til open source YouTube-klonen, men jeg indsendt en fejlrapport, hvorfra de nødvendige rettelser let kunne foretages. Der gik måneder, og de forstod stadig ikke, hvad problemet var. I stedet tilføjede de alt mere end fejl i hver udgivelse.

ClipBucket opererede på en konsulentmodel - de frigav deres kode gratis og opkrævede betaling for implementeringsassistance. Det gik efterhånden op for mig, at en virksomhed, der tjener penge på betalt support, nok ikke er særlig interesseret i, at kunderne selv installerer produktet.

MediaGoblin, et mere moderne alternativ

Efter måneders frustration med ClipBucket undersøgte jeg de tilgængelige muligheder og fandt Mediegoblin.

Min otte-årige søgen efter at digitalisere 45 videokassetter. Del 2
Mediegoblin er en offline mediedelingsplatform

MediaGoblin har en masse lækkerier. I modsætning til ClipBucket i grimme PHP, er MediaGoblin skrevet i Python, et sprog jeg har meget erfaring med kodning. Spise kommandolinjegrænseflade, som giver dig mulighed for nemt at automatisere videodownload. Vigtigst af alt kommer MediaGoblin med Docker billede, hvilket eliminerer eventuelle installationsproblemer.

Docker er en teknologi, der skaber et selvstændigt miljø, så en applikation kan køre hvor som helst. Jeg bruger Docker i mange af hans projekter.

Den overraskende vanskelighed ved at re-dockere MediaGoblin

Jeg antog, at implementering af MediaGoblin docker-billedet ville være en triviel opgave. Nå, sådan gik det ikke helt.

Det færdige billede indeholdt ikke to nødvendige funktioner:

  • autentificering
    • MediaGoblin opretter som standard en offentlig medieportal, og jeg havde brug for en måde at begrænse adgangen til udenforstående.
  • Omkodning
    • Hver gang du downloader en video, forsøger MediaGoblin at omkode den for optimal streaming. Hvis videoen i første omgang er klar til streaming, forringer omkodning kvaliteten.
    • MediaGoblin leverer deaktivering af omkodning via konfigurationsmuligheder, men dette kan ikke gøres i et eksisterende Docker-billede.

Nå, intet problem. Docker-billedet følger med åben kildekode, så det er muligt bygge det selv om.

Desværre er Docker-billedet ikke længere bygget fra det nuværende. MediaGoblin repository. Jeg forsøgte at synkronisere den med versionen fra den sidste vellykkede build, men det mislykkedes også. Selvom jeg brugte nøjagtig samme kode, ændrede MediaGoblins eksterne afhængigheder sig, hvilket brød bygningen. Efter snesevis af timer kørte jeg gennem den 10-15 minutters MediaGoblin byggeproces igen og igen, indtil det endelig virkede.

Et par måneder senere skete det samme. I alt har MediaGoblin-afhængighedskæden brudt min opbygning flere gange i løbet af de sidste par år, og sidste gang det skete, var lige mens jeg skrev denne artikel. Jeg har endelig offentliggjort egen gaffel af MediaGoblin c hårdkodede afhængigheder og eksplicit specificerede versioner af biblioteker. Med andre ord, i stedet for den tvivlsomme påstand om, at MediaGoblin fungerer med enhver version selleri >= 3.0, jeg installerede en specifik versionsafhængighed selleri 4.2.1fordi jeg testede MediaGoblin med denne version. Det ser ud til, at produktet har brug for reproducerbar byggemekanisme, men jeg har ikke gjort det endnu.

Anyway, efter mange timers kamp, ​​var jeg endelig i stand til at bygge og konfigurere MediaGoblin i et Docker-billede. Det var allerede nemt der spring over unødvendig omkodning и installer Nginx til godkendelse.

Trin 4. Hosting

Da MediaGoblin kørte Docker på min lokale computer, var næste trin at implementere den til en skyserver, så familien kunne se videoen.

MediaGoblin og videolagringsproblemet

Der er mange platforme, der tager et Docker-billede og hoster det på en offentlig URL. Fangsten er, at der udover selve appen skulle udgives 33 GB videofiler. Det var muligt at hårdkode dem til et Docker-billede, men det ville være besværligt og grimt. Ændring af en konfigurationslinje ville kræve omfordeling af 33 GB data.

Da jeg brugte ClipBucket løste jeg problemet med gcsfuse - et værktøj, der gør det muligt for operativsystemet at uploade mapper til Google Cloud-skylageret som almindelige stier til filsystemet. Jeg hostede videofilerne på Google Cloud og brugte gcsfuse til at få dem til at blive vist i ClipBucket som lokale filer.

Forskellen var, at ClipBucket kørte i en rigtig virtuel maskine, mens MediaGoblin kørte i en Docker-container. Her viste det sig at montere filer fra skylageret at være meget vanskeligere. Jeg brugte snesevis af timer på at løse alle problemerne og skrev om det hele blogindlægget.

Min otte-årige søgen efter at digitalisere 45 videokassetter. Del 2
MediaGoblins indledende integration med Google Cloud storage, som jeg taler om fortalt i 2018

Efter flere ugers justering af alle komponenterne virkede alt. Uden at lave nogen ændringer i MediaGoblins kode, snød jeg den til at læse og skrive mediefiler til Googles skylager.

Det eneste problem var, at MediaGoblin blev uanstændigt langsom. Det tog hele 20 sekunder for videominiaturebilleder at indlæse på startsiden. Hvis du sprang frem, mens du så en video, ville MediaGoblin holde pause i endeløse 10 sekunder, før du genoptog afspilningen.

Hovedproblemet var, at videoerne og billederne tog en lang rundkørsel til brugeren. De skulle gå fra Google cloud storage gennem gcsfuse til MediaGoblin, Nginx - og først derefter kom de til brugerens browser. Den vigtigste flaskehals var gcsfuse, som ikke er optimeret til hastighed. Udviklerne advarer om store forsinkelser i værkets drift lige på projektets hovedside:

Min otte-årige søgen efter at digitalisere 45 videokassetter. Del 2
Rediger advarsler om lav ydeevne i gcsfuse-dokumentationen

Ideelt set skal browseren hente filer direkte fra Google Cloud og omgå eventuelle mellemliggende lag. Hvordan kan du gøre dette uden at dykke ned i MediaGoblin-kodebasen eller tilføje kompleks Google Cloud-integrationslogik?

Sub_filter trick i nginx

Heldigvis fandt jeg dog en simpel løsning немного grim. Jeg tilføjede standard.conf-konfigurationen i Nginx sådan et filter:

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

I min opsætning fungerede Nginx som en proxy mellem MediaGoblin og slutbrugeren. Ovenstående direktiv instruerer Nginx om at søge og erstatte alle MediaGoblin HTML-svar, før de serveres til slutbrugeren. Nginx erstatter alle relative stier til MediaGoblin-mediefiler med URL'er fra Googles skylager.

For eksempel genererer MediaGoblin HTML som dette:

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

Nginx ændrer 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 fungerer alt som forventet:

Min otte-årige søgen efter at digitalisere 45 videokassetter. Del 2
Nginx omskriver svar fra MediaGoblin, så klienter kan anmode om mediefiler direkte fra Googles skylager

Det bedste ved min løsning er, at det ikke kræver nogen ændringer i MediaGoblin-koden. Nginx' to-line direktiv integrerer problemfrit MediaGoblin og Google Cloud, selvom tjenesterne absolut intet ved om hinanden.

Bemærk: Denne løsning kræver, at filer i Google cloud storage kan læses af alle. For at reducere risikoen for uautoriseret adgang bruger jeg et langt, tilfældigt bucket-navn (f.eks. mediagoblin-39dpduhfz1wstbprmyk5ak29) og bekræft, at bøttens adgangskontrolpolitik ikke tillader uautoriserede brugere at vise indholdet af biblioteket.

Slutprodukt

På dette tidspunkt havde jeg en komplet, fungerende løsning. MediaGoblin kørte glad i sin egen container på Googles cloud-platform, så det behøvede ikke at blive patchet eller opdateret ofte. Alt i min proces var automatiseret og reproducerbart, hvilket gav mulighed for enkle redigeringer eller rollbacks til tidligere versioner.

Min familie kunne virkelig godt lide, hvor nemt det var at se videoerne. Ved hjælp af Nginx-hacket beskrevet ovenfor blev arbejdet med videoer lige så hurtigt som på YouTube.

Visningsskærmen ser sådan ud:

Min otte-årige søgen efter at digitalisere 45 videokassetter. Del 2
Indhold af familievideokataloget efter tag "Bedst"

Ved at klikke på miniaturebilledet får du en skærm som denne:

Min otte-årige søgen efter at digitalisere 45 videokassetter. Del 2
Visning af et enkelt klip på en medieserver

Efter mange års arbejde var det utroligt givende at give familiemedlemmer mulighed for at se vores videoer i den samme brugervenlige YouTube-lignende grænseflade, som jeg oprindeligt ønskede.

Bonus: Reducer omkostningerne til mindre end $1 pr. måned

Du ser ikke hjemmevideoer ofte, kun hver par måneder. Min familie genererede tilsammen omkring 20 timers trafik på et år, men serveren kørte 15/99,7. Jeg betalte $XNUMX månedligt for en server, der var nede XNUMX% af tiden.

I slutningen af ​​2018 frigav Google produktet Cloud Run. Killer-funktionen kørte Docker-containere så hurtigt, at applikationen kunne reagere på HTTP-anmodninger. Det vil sige, at serveren kunne forblive i standbytilstand og kun starte, når nogen ville have adgang til den. For sjældent kørende applikationer som mine er omkostningerne faldet fra $15 pr. måned til et par cents om året.

Af grunde, jeg ikke længere husker, virkede Cloud Run ikke med mit MediaGoblin-billede. Men med fremkomsten af ​​Cloud Run huskede jeg det Heroku tilbyder en lignende tjeneste gratis, og deres værktøjer er meget mere brugervenlige end Googles.

Med en gratis applikationsserver er den eneste omkostning datalagring. Googles standard regionale lagerplads koster 2,3 cents/GB. Videoarkivet fylder 33 GB, så jeg betaler kun 77 øre om måneden.

Min otte-årige søgen efter at digitalisere 45 videokassetter. Del 2
Denne løsning koster kun $0,77 pr. måned

Tips til dem, der planlægger at prøve

Det er klart, at processen tog mig lang tid. Men jeg håber, at denne artikel vil hjælpe dig med at spare 80-90 % af indsatsen med at digitalisere og udgive dine hjemmevideoer. I et separat afsnit kan du finde detaljeret trin-for-trin guide gennem hele processen, men her er nogle generelle tips:

  • Under digitaliserings- og redigeringsfasen skal du bevare så mange metadata som muligt.
    • Værdifuld information er ofte optaget på videokassetteetiketter.
    • Hold styr på, hvilket klip der blev optaget fra hvilket bånd og i hvilken rækkefølge.
    • Skriv datoen for optagelsen ned, som kan vises på videoen.
  • Overvej at betale for professionelle digitaliseringsydelser.
    • Du vil ekstremt det er svært og dyrt at matche dem med hensyn til digitaliseringskvalitet.
    • Men hold dig væk fra et firma, der hedder EverPresent (send mig, hvis du har brug for detaljer).
  • Hvis du selv laver digitalisering, skal du købe en HDD.
    • Ukomprimeret standardopløsningsvideo tager 100-200 MB pr. minut.
    • Jeg beholdt alt på min Synology DS412 + (10 TB).
  • Optag metadata i et almindeligt format, der ikke er knyttet til en bestemt applikation.
    • Klipbeskrivelser, tidskoder, datoer mv.
    • Hvis du gemmer metadata i et applikationsspecifikt format (eller endnu værre, slet ikke gemmer dem), vil du ikke kunne gentage jobbet, hvis du beslutter dig for at bruge en anden løsning.
    • Mens du redigerer, ser du en masse nyttige metadata på videoen. Du vil miste dem, hvis du ikke gemmer dem.
      • Hvad sker der i videoen?
      • Hvem er registreret der?
      • Hvornår blev dette optaget?
  • Marker dine yndlingsvideoer.
    • For at være ærlig er de fleste hjemmevideoer ret kedelige.
    • Jeg anvender "best of"-tagget på mine yndlingsklip og åbner dem, når jeg vil se sjove videoer.
  • Organiser en samlet løsning så tidligt som muligt, så processen går lige fra start til slut.
    • Jeg forsøgte først at digitalisere alle båndene, derefter redigere alle båndene osv.
    • Jeg ville ønske, jeg havde startet med et bånd og gjort alt arbejdet med det. Så ville jeg forstå, hvilke beslutninger og på hvilke stadier der påvirker det endelige resultat.
  • Hold omkodning til et minimum.
    • Hver gang du redigerer eller omkoder et klip, reducerer du dets kvalitet.
    • Digitaliser dine rå optagelser i maksimal kvalitet, og omkod derefter hvert klip nøjagtigt én gang til det format, som browsere naturligt gengiver.
  • Brug den enkleste løsning til at publicere videoklip.
    • Set i bakspejlet virker MediaGoblin som et alt for komplekst værktøj til det ret simple scenarie med at generere websider med et statisk sæt videofiler.
    • Hvis jeg startede forfra, ville jeg bruge en statisk webstedsgenerator som Hugo, Jekyll eller Gridsomt.
  • Udfør installationen.
    • Videoredigering er en sjov måde at kombinere de bedste øjeblikke fra flere videoer.
    • Det vigtigste ved redigering er musik. For eksempel er temaet fantastisk Langsom sne fra The National, dette er min personlige opdagelse.

Kilde: www.habr.com