Căutarea mea de opt ani de a digitaliza 45 de casete video. Partea 2

Prima parte descrie încercarea dificilă de a digitaliza videoclipurile vechi de familie și de a le împărți în scene separate. După procesarea tuturor clipurilor, am vrut să le organizez vizionarea online la fel de convenabil ca pe YouTube. Deoarece acestea sunt amintiri personale de familie, acestea nu pot fi postate chiar pe YouTube. Avem nevoie de o găzduire mai privată, care să fie atât convenabilă, cât și sigură.

Pasul 3. Publicați

ClipBucket, o clonă YouTube open source pe care o puteți instala pe propriul server

In primul rand am incercat ClipBucket, care se numește o clonă YouTube open source pe care o puteți instala pe serverul dvs.

Căutarea mea de opt ani de a digitaliza 45 de casete video. Partea 2

În mod surprinzător, ClipBucket nu are instrucțiuni de instalare. Mulțumită management extern я automatizat procesul de instalare via ansiblu, un instrument de gestionare a configurației serverului.

O parte din dificultate a fost că scripturile de instalare ClipBucket au fost complet sparte. Pe vremea aceea eu a lucrat la Google și, în conformitate cu termenii contractului, nu aveam dreptul de a contribui la clona open source a YouTube, dar eu a postat un raport de eroaredin care era uşor să se facă corecturile necesare. Au trecut luni și tot nu au înțeles care este problema. În schimb, au adăugat totul mai mult decât erori în fiecare lansare.

ClipBucket a lucrat la un model de consultanță - și-au lansat codul gratuit și au taxat pentru ajutor la implementare. Treptat, mi-am dat seama că o companie care câștigă bani din asistență plătită, probabil, nu este foarte interesată ca clienții să instaleze singuri produsul.

MediaGoblin, o alternativă mai modernă

După câteva luni de frustrare cu ClipBucket, am revizuit opțiunile disponibile și am găsit spiridușul media.

Căutarea mea de opt ani de a digitaliza 45 de casete video. Partea 2
spiridușul media este o platformă de partajare media autonomă

MediaGoblin are o mulțime de bunătăți. Spre deosebire de ClipBucket în PHP inestetic, MediaGoblin este scris în Python, un limbaj cu care am multă experiență în scris cod. Mânca Linia de comandă, ceea ce facilitează automatizarea descărcărilor video. Cel mai important, vine MediaGoblin Imagine Docker, care elimină orice problemă cu instalarea.

Docher este o tehnologie care creează un mediu autonom pentru o aplicație care funcționează oriunde. Folosesc Docker în multe dintre proiectele mele.

Dificultatea surprinzătoare de a redockeriza MediaGoblin

Am presupus că implementarea unei imagini docker MediaGoblin ar fi o sarcină trivială. Ei bine, nu prea a mers așa.

Imaginea finită nu avea două funcții necesare:

  • autentificare
    • MediaGoblin creează un portal media public în mod implicit și aveam nevoie de o modalitate de a restricționa accesul străinilor.
  • Transcodare
    • De fiecare dată când încarci un videoclip, MediaGoblin încearcă să-l re-codifice pentru streaming optim. Dacă videoclipul este inițial gata pentru streaming, transcodarea degradează calitatea.
    • MediaGoblin oferă dezactivarea transcodării prin opțiunile de configurare, dar nu este posibil să faceți acest lucru într-o imagine Docker existentă.

Ei bine, nicio problemă. Imaginea Docker vine cu sursa deschisa, Asa ca poti reconstruiește-l singur.

Din păcate, imaginea Docker nu mai este construită din curent Depozitul MediaGoblin. Am încercat să-l sincronizez cu versiunea din ultima versiune reușită, dar nici asta nu a funcționat. Chiar dacă am folosit exact același cod, dependențele externe MediaGoblin s-au schimbat, rupând construcția. Zeci de ore mai târziu, am rulat procesul de construire MediaGoblin de 10-15 minute din nou și din nou până când a funcționat în sfârșit.

Același lucru s-a întâmplat câteva luni mai târziu. În total, în ultimii câțiva ani, lanțul de dependențe MediaGoblin mi-a rupt construcția de mai multe ori, iar ultima dată când s-a întâmplat a fost tocmai când scriam acest articol. Am ajuns sa postez propria furcă a MediaGoblin c dependențe codificate greu și versiunile de bibliotecă specificate în mod explicit. Cu alte cuvinte, în loc de pretenția dubioasă că MediaGoblin funcționează cu orice versiune țelină >= 3.0, am instalat o dependență specifică de versiune țelină 4.2.1, pentru că am testat MediaGoblin cu această versiune. Se pare că produsul are nevoie mecanism de construcție reproductibildar nu am făcut-o încă.

Oricum, după multe ore de luptă, am reușit în sfârșit să construiesc și să configurez MediaGoblin într-o imagine Docker. Era deja ușor sări peste transcodarea inutilă и instalați Nginx pentru autentificare.

Pasul 4. Gazduire

Deoarece MediaGoblin rula Docker pe mașina mea locală, următorul pas a fost implementarea pe un server cloud, astfel încât familia să poată viziona videoclipul.

MediaGoblin și problema de stocare video

Există multe platforme care preiau o imagine Docker și o găzduiesc pe o adresă URL publică. Problema este că, pe lângă aplicația în sine, trebuiau postate 33 GB de fișiere video. A fost posibil să le codificați într-o imagine docker, dar s-a dovedit a fi greoaie și urâtă. Modificarea unei linii de configurare ar necesita o redistribuire a 33 GB de date.

Când am folosit ClipBucket, am rezolvat problema cu gcsfuse - un utilitar care permite sistemului de operare să încarce directoare în stocarea în cloud Google Cloud ca căi obișnuite către sistemul de fișiere. Am găzduit fișierele video pe Google Cloud și am folosit gcsfuse pentru a le afișa ca fișiere locale în ClipBucket.

Diferența a fost că ClipBucket rula într-o mașină virtuală reală, în timp ce MediaGoblin rula într-un container Docker. Aici, montarea fișierelor din stocarea în cloud s-a dovedit a fi mult mai dificilă. Am petrecut zeci de ore rezolvând toate problemele și am scris despre asta întreaga postare pe blog.

Căutarea mea de opt ani de a digitaliza 45 de casete video. Partea 2
Integrarea inițială a MediaGoblin cu stocarea Google Cloud, pe care am spus în 2018

După câteva săptămâni de reglare a tuturor componentelor, totul a funcționat. Fără să modific codul MediaGoblin, trișez pentru a-l face să citească și să scrie fișiere media în stocarea în cloud Google.

Singura problemă a fost că MediaGoblin a început să lucreze indecent încet. A durat 20 de secunde pentru a încărca miniaturi video pe pagina de pornire. Dacă ați sărit înainte în timp ce vizionați un videoclip, MediaGoblin a făcut o pauză nesfârșită de 10 secunde înainte de a relua redarea.

Problema principală a fost că videoclipurile și imaginile au ajuns la utilizator într-un mod lung și opus. Au trebuit să treacă de la stocarea în cloud Google prin gcsfuse la MediaGoblin, Nginx - și abia apoi au intrat în browserul utilizatorului. Principalul blocaj a fost gcsfuse, care nu este optimizat pentru performanță rapidă. Dezvoltatorii avertizează despre întârzierile mari ale utilitarului chiar pe pagina principală a proiectului:

Căutarea mea de opt ani de a digitaliza 45 de casete video. Partea 2
avertismente despre performanta slaba în documentația gcsfuse

În mod ideal, browserul ar trebui să extragă fișiere direct din Google Cloud, ocolind toate straturile intermediare. Cum pot face acest lucru fără să mă aprofundez în baza de cod MediaGoblin și să adaug o logică complexă de integrare Google Cloud?

truc sub_filter în nginx

Din fericire, am găsit totuși o soluție ușoară puțin urât. Am adăugat la configurația default.conf în Nginx un astfel de filtru:

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

În configurația mea, Nginx a funcționat ca un proxy între MediaGoblin și utilizatorul final. Directiva de mai sus îi spune lui Nginx să caute și să înlocuiască toate răspunsurile HTML MediaGoblin înainte de a le furniza utilizatorului final. Nginx înlocuiește toate căile relative către fișierele media MediaGoblin cu adrese URL din stocarea în cloud Google.

De exemplu, MediaGoblin generează acest cod HTML:

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

Nginx modifică răspunsul:

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

Acum totul funcționează așa cum ar trebui:

Căutarea mea de opt ani de a digitaliza 45 de casete video. Partea 2
Nginx rescrie răspunsurile de la MediaGoblin, astfel încât clienții să poată solicita fișiere media direct din stocarea în cloud Google

Cea mai bună parte a soluției mele este că nu necesită nicio modificare a codului MediaGoblin. Directiva Nginx pe două linii integrează perfect MediaGoblin și Google Cloud, chiar dacă cele două servicii nu știu nimic unul despre celălalt.

Nota: Această soluție necesită ca fișierele din Google Cloud Storage să fie citite de toată lumea. Pentru a reduce riscul accesului neautorizat, folosesc un nume de grup aleator lung (de exemplu, mediagoblin-39dpduhfz1wstbprmyk5ak29) și verificați dacă politica de control al accesului a compartimentului nu permite utilizatorilor neautorizați să afișeze conținutul directorului.

Produs final

În acest moment, aveam o soluție completă, funcțională. MediaGoblin a rulat cu plăcere în propriul său container pe Google Cloud Platform, așa că nu a trebuit să fie corectat sau actualizat frecvent. Totul în procesul meu a fost automatizat și reproductibil, permițând editări simple sau derulări înapoi la versiunile anterioare.

Familiei mele i-a plăcut foarte mult cât de ușor este să vizionezi videoclipuri. Cu ajutorul hack-ului Nginx descris mai sus, lucrul cu video a devenit la fel de rapid ca pe YouTube.

Ecranul de vizualizare arată astfel:

Căutarea mea de opt ani de a digitaliza 45 de casete video. Partea 2
Conținutul catalogului de videoclipuri de familie după eticheta „Cel mai bun”

Făcând clic pe miniatură, apare următorul ecran:

Căutarea mea de opt ani de a digitaliza 45 de casete video. Partea 2
Vizualizarea unui clip individual pe un server media

După mulți ani de muncă, am fost incredibil de încântat să le ofer rudelor posibilitatea de a ne viziona videoclipurile în aceeași interfață convenabilă ca pe YouTube, pe care mi-am dorit-o inițial.

Bonus: Reducerea costurilor la mai puțin de 1 USD pe lună

Vizionați rar videoclipuri de acasă, doar la câteva luni. Familia mea a generat colectiv aproximativ 20 de ore de trafic pe an, dar serverul funcționa 15/99,7. Am plătit XNUMX USD lunar pentru un server care a scăzut în XNUMX% din timp.

La sfârșitul anului 2018, Google a lansat un produs Cloud Run. Caracteristica ucigașă rula containerele Docker atât de repede încât aplicația putea răspunde la solicitările HTTP. Adică, serverul ar putea rămâne în modul de așteptare - și să pornească numai atunci când cineva dorea să meargă la el. Pentru aplicațiile utilizate rar, precum a mea, costurile au trecut de la 15 USD pe lună la câțiva cenți pe an.

Din motive pe care nu le amintesc, Cloud Run nu a funcționat cu imaginea mea MediaGoblin. Dar odată cu apariția Cloud Run, mi-am amintit asta Heroku oferă un serviciu similar gratuit, iar instrumentele lor sunt mult mai convenabile decât cele ale Google.

Cu un server de aplicații gratuit, singura cheltuială este stocarea datelor. Stocarea regională standard de la Google costă 2,3 cenți/GB. Arhiva video este de 33 GB, așa că plătesc doar 77 de cenți pe lună.

Căutarea mea de opt ani de a digitaliza 45 de casete video. Partea 2
Această soluție costă doar 0,77 USD pe lună

Sfaturi pentru cei care vor încerca

Evident, procesul mi-a luat mult timp. Dar sper că acest articol vă va ajuta să economisiți 80-90% din eforturile dvs. de digitizare și publicare video de acasă. Într-o secțiune separată puteți găsi ghid detaliat pas cu pas pe tot parcursul procesului, dar iată câteva sfaturi generale:

  • Salvați cât mai multe metadate posibil în timpul fazei de digitizare și editare.
    • Informațiile valoroase sunt adesea înregistrate pe etichetele casetelor video.
    • Înregistrați ce clip a fost luat din ce casetă și în ce ordine.
    • Notați data filmării, care poate fi indicată pe videoclip.
  • Luați în considerare plata pentru servicii profesionale de digitalizare.
    • Veți чрезвычайно este dificil și costisitor să le potriviți în ceea ce privește calitatea digitalizării.
    • Dar stai departe de o companie numită EverPresent (anunțați-mă dacă aveți nevoie de mai multe detalii).
  • Dacă faceți singur digitizarea, cumpărați un HDD.
    • Videoclipul necomprimat cu definiție standard durează 100-200 MB pe minut.
    • Am păstrat totul pe mine Sinologie DS412 + (10 TB).
  • Scrieți metadate într-un format comun care nu este legat de o anumită aplicație.
    • Descrieri ale clipurilor, coduri de timp, date etc.
    • Dacă salvați metadatele într-un format specific aplicației (sau mai rău, nu salvați deloc), nu veți putea reface munca dacă decideți să utilizați o altă soluție.
    • În timpul editării, vedeți o mulțime de metadate utile pe videoclip. Le vei pierde dacă nu le salvezi.
      • Ce se întâmplă în videoclip?
      • Cine este înregistrat acolo?
      • Când a fost înregistrat?
  • Etichetează videoclipurile tale preferate.
    • Sincer să fiu, majoritatea conținutului video de acasă este destul de plictisitor.
    • Aplic eticheta „cel mai bun din” clipurilor mele preferate și le deschid atunci când vreau să văd videoclipuri amuzante.
  • Organizați o soluție cuprinzătoare cât mai devreme posibil, astfel încât procesul să meargă imediat de la început până la sfârșit.
    • Am încercat să digitalizez mai întâi toate casetele, apoi să editez toate casetele etc.
    • Păcat că nu am început cu o casetă și nu am făcut toată treaba cu ea. Atunci aș înțelege ce decizii și în ce etape afectează rezultatul final.
  • Minimizați recodificarea.
    • De fiecare dată când editați sau re-codați un clip, îi degradați calitatea.
    • Digitalizați materialul brut la calitate maximă, apoi transcodați fiecare clip exact o dată în formatul pe care browser-ul îl redă în mod nativ.
  • Utilizați cea mai simplă soluție posibilă pentru postarea de clipuri video.
    • În retrospectivă, MediaGoblin pare un instrument prea complex pentru un scenariu destul de simplu de generare de pagini web cu un set static de fișiere video.
    • Dacă ar fi să o iau de la capăt, aș folosi un generator de site static, cum ar fi Hugo, Jekyll sau Minunat.
  • Faceți un montaj.
    • Editarea video este o modalitate distractivă de a combina cele mai bune momente din mai multe videoclipuri.
    • Principalul lucru în editare este muzica. De exemplu, tema este uimitoare Zăpadă lentă de la The National, aceasta este descoperirea mea personală.

Sursa: www.habr.com