45 videokaseti dijitalleştirmeye yönelik sekiz yıllık arayışım. Bölüm 2

İlk bölüm, eski aile videolarını dijital hale getirme ve onları ayrı sahnelere ayırma konusundaki zorlu arayışı anlatıyor.. Tüm klipleri işledikten sonra, görüntülemelerini çevrimiçi olarak YouTube'daki kadar uygun bir şekilde düzenlemek istedim. Bunlar ailenin kişisel anıları olduğu için YouTube'da yayınlanamaz. Hem kullanışlı hem de güvenli olan daha özel bir barındırmaya ihtiyacımız var.

Adım 3. Yayınla

Kendi sunucunuza kurabileceğiniz açık kaynaklı bir YouTube klonu olan ClipBucket

Her şeyden önce denedim KlipBucketkendisine sunucunuza yükleyebileceğiniz açık kaynaklı bir YouTube klonu adını verir.

45 videokaseti dijitalleştirmeye yönelik sekiz yıllık arayışım. Bölüm 2

Şaşırtıcı bir şekilde, ClipBucket herhangi bir kurulum talimatına sahip değildir. Sayesinde dış yönetim я kurulum sürecini otomatikleştirdi üzerinden yanıtlayıcı ', bir sunucu yapılandırma yönetimi aracı.

Zorluğun bir kısmı, ClipBucket kurulum komut dosyalarının tamamen bozuk olmasıydı. o zaman ben Google'da çalıştı ve sözleşme şartlarına göre YouTube'un açık kaynak klonuna katkıda bulunma hakkım yoktu, ancak ben bir hata raporu yayınladıgerekli düzeltmeleri yapmak kolaydı. Aylar geçti ve hala sorunun ne olduğunu anlamadılar. Bunun yerine, her şeyi eklediler daha fazla her sürümde hatalar.

ClipBucket bir danışmanlık modeli üzerinde çalıştı - kodlarını ücretsiz olarak yayınladılar ve dağıtım için yardım için ücret aldılar. Yavaş yavaş, ücretli destekten para kazanan bir şirketin, müşterilerin ürünü kendilerinin kurmasını sağlamakla muhtemelen pek ilgilenmediğini fark ettim.

MediaGoblin, daha modern bir alternatif

ClipBucket ile birkaç aylık hayal kırıklığından sonra, mevcut seçenekleri gözden geçirdim ve buldum medya cin.

45 videokaseti dijitalleştirmeye yönelik sekiz yıllık arayışım. Bölüm 2
medya cin bağımsız bir medya paylaşım platformudur

MediaGoblin'in pek çok özelliği var. Çirkin PHP'deki ClipBucket'in aksine MediaGoblin, kod yazarken çok fazla deneyimim olan Python'da yazılmıştır. Yemek yemek komut satırı arayüzü, bu da video indirme işlemlerini otomatikleştirmeyi kolaylaştırır. En önemlisi, MediaGoblin devreye giriyor liman işçisi resmi, bu da kurulumla ilgili sorunları ortadan kaldırır.

liman işçisi her yerde çalışan bir uygulama için bağımsız bir ortam oluşturan bir teknolojidir. Docker'ı kullanıyorum projelerimin çoğu.

MediaGoblin'i Yeniden Depolamanın Şaşırtıcı Zorluğu

Bir MediaGoblin liman işçisi görüntüsünü konuşlandırmanın önemsiz bir görev olacağını varsaydım. Pekala, pek öyle yürümedi.

Bitmiş görüntünün iki gerekli işlevi yoktu:

  • kimlik doğrulama
    • MediaGoblin, varsayılan olarak bir genel medya portalı oluşturuyor ve dışarıdan gelenlerin erişimini kısıtlamak için bir yola ihtiyacım vardı.
  • kod dönüştürme

Peki, mesele yok o zaman. Docker görüntüsü ile birlikte gelir açık kaynak, Böylece yapabilirsiniz kendin yeniden inşa et.

Ne yazık ki, Docker görüntüsü artık mevcut MediaGoblin deposu. Son başarılı yapıdaki sürümle senkronize etmeye çalıştım ama bu da işe yaramadı. Tam olarak aynı kodu kullanmama rağmen, MediaGoblin dış bağımlılıkları değişerek yapıyı bozdu. Düzinelerce saat sonra, sonunda işe yarayana kadar 10-15 dakikalık MediaGoblin oluşturma sürecini tekrar tekrar çalıştırdım.

Birkaç ay sonra da aynı şey oldu. Toplamda, geçtiğimiz birkaç yılda, MediaGoblin bağımlılık zinciri yapımı birkaç kez bozdu ve en son bu makaleyi yazarken oldu. göndermeyi bitirdim MediaGoblin'in kendi çatalı c sabit kodlanmış bağımlılıklar ve açıkça belirtilen kitaplık sürümleri. Başka bir deyişle, MediaGoblin'in herhangi bir sürümle çalıştığına dair şüpheli iddia yerine kereviz >= 3.0, sürüme özel bağımlılık kurdum kereviz 4.2.1, çünkü MediaGoblin'i bu sürümle test ettim. Ürün ihtiyacı gibi görünüyor tekrarlanabilir yapı mekanizmasıama henüz yapmadım.

Her neyse, saatlerce uğraştıktan sonra, sonunda MediaGoblin'i bir Docker görüntüsünde oluşturup yapılandırabildim. zaten kolaydı gereksiz kod dönüştürmeyi atla и kimlik doğrulama için Nginx'i kurun.

Adım 4. Barındırma

MediaGoblin, Docker'ı yerel makinemde çalıştırdığından, sonraki adım, ailenin videoyu izleyebilmesi için bir bulut sunucusuna dağıtım yapmaktı.

MediaGoblin ve video depolama sorunu

Docker görüntüsünü alan ve onu genel bir URL'de barındıran birçok platform vardır. İşin püf noktası, uygulamanın kendisine ek olarak 33 GB video dosyasının yayınlanması gerektiğidir. Onları bir liman işçisi görüntüsüne sabit olarak kodlamak mümkündü, ancak hantal ve çirkin olduğu ortaya çıktı. Bir yapılandırma satırının değiştirilmesi, 33 GB verinin yeniden dağıtılmasını gerektirir.

ClipBucket'ı kullandığımda sorunu şu şekilde çözdüm: gcsfuse - işletim sisteminin, dosya sistemine giden normal yollar olarak Google Cloud bulut depolama alanına dizinler yüklemesine izin veren bir yardımcı program. Video dosyalarını Google Cloud'da barındırdım ve onları ClipBucket'ta yerel dosyalar olarak göstermek için gcsfuse kullandım.

Aradaki fark, ClipBucket'in gerçek bir sanal makinede, MediaGoblin'in ise bir Docker kapsayıcısında çalışmasıydı. Burada, dosyaları bulut depolama alanından bağlamanın çok daha zor olduğu ortaya çıktı. Tüm sorunları çözmek için onlarca saat harcadım ve bunun hakkında yazdım tüm blog gönderisi.

45 videokaseti dijitalleştirmeye yönelik sekiz yıllık arayışım. Bölüm 2
MediaGoblin'in Google Cloud depolama ile ilk entegrasyonu; 2018'de söylendi

Tüm bileşenleri birkaç hafta ayarladıktan sonra her şey işe yaradı. MediaGoblin kodunda herhangi bir değişiklik yapmadan, medya dosyalarını okuyup Google bulut depolama alanına yazmasını sağlamak için hile yapıyorum.

Tek sorun, MediaGoblin'in uygunsuz bir şekilde yavaş çalışmaya başlamasıydı. Video küçük resimlerinin ana sayfaya yüklenmesi tam 20 saniye sürdü. Video izlerken ileri atlarsanız, MediaGoblin oynatmaya devam etmeden önce sonsuz 10 saniye durakladı.

Asıl sorun, videoların ve resimlerin kullanıcıya uzun, dolambaçlı bir yoldan gitmesiydi. Google bulut depolama alanından gcsfuse aracılığıyla MediaGoblin, Nginx'e gitmeleri gerekiyordu - ve ancak o zaman kullanıcının tarayıcısına girdiler. Ana darboğaz, hızlı performans için optimize edilmemiş gcsfuse idi. Geliştiriciler, projenin ana sayfasında yardımcı programdaki büyük gecikmeler konusunda uyarıyor:

45 videokaseti dijitalleştirmeye yönelik sekiz yıllık arayışım. Bölüm 2
Uyarılar düşük performans hakkında gcsfuse belgelerinde

İdeal olarak, tarayıcı tüm ara katmanları atlayarak dosyaları doğrudan Google Cloud'dan çekmelidir. MediaGoblin kod tabanının derinliklerine inmeden ve karmaşık Google Cloud entegrasyon mantığı eklemeden bunu nasıl yapabilirim?

nginx'te sub_filter hilesi

Neyse ki kolay bir çözüm buldum ama hafifçe çirkin. Nginx'te default.conf yapılandırmasına ekledim böyle bir filtre:

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

Kurulumumda Nginx, MediaGoblin ile son kullanıcı arasında bir proxy görevi gördü. Yukarıdaki yönerge, Nginx'e tüm MediaGoblin HTML yanıtlarını son kullanıcıya sunmadan önce aramasını ve değiştirmesini söyler. Nginx, MediaGoblin medya dosyalarına giden tüm ilgili yolları Google bulut depolama alanındaki URL'lerle değiştirir.

Örneğin, MediaGoblin şu HTML'yi oluşturur:

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

Nginx yanıtı değiştirir:

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

Şimdi her şey olması gerektiği gibi çalışıyor:

45 videokaseti dijitalleştirmeye yönelik sekiz yıllık arayışım. Bölüm 2
Nginx, müşterilerin medya dosyalarını doğrudan Google bulut depolama alanından isteyebilmesi için MediaGoblin'den gelen yanıtları yeniden yazar

Çözümümün en iyi yanı, MediaGoblin kodunda herhangi bir değişiklik gerektirmemesi. İki satırlık Nginx yönergesi, iki hizmet birbiri hakkında hiçbir şey bilmese de MediaGoblin ve Google Cloud'u sorunsuz bir şekilde entegre eder.

Dikkat: Bu çözüm, Google Cloud Storage'daki dosyaların herkes tarafından okunabilmesini gerektirir. Yetkisiz erişim riskini azaltmak için uzun bir rasgele grup adı kullanıyorum (örneğin, mediagoblin-39dpduhfz1wstbprmyk5ak29) ve klasörün erişim denetimi ilkesinin yetkisiz kullanıcıların dizinin içeriğini görüntülemesine izin vermediğini doğrulayın.

Son ürün

Bu noktada eksiksiz, çalışan bir çözümüm vardı. MediaGoblin, Google Cloud Platform'da kendi kapsayıcısında mutlu bir şekilde çalıştı, bu nedenle sık sık yama yapılması veya güncellenmesi gerekmiyordu. Sürecimdeki her şey otomatik ve tekrarlanabilirdi, bu da basit düzenlemelere veya önceki sürümlere geri dönüşlere izin veriyordu.

Ailem video izlemenin ne kadar kolay olduğunu gerçekten çok sevdi. Yukarıda açıklanan Nginx hack'inin yardımıyla, video ile çalışmak YouTube'daki kadar hızlı hale geldi.

Görünüm ekranı şöyle görünür:

45 videokaseti dijitalleştirmeye yönelik sekiz yıllık arayışım. Bölüm 2
"En iyi" etiketine göre aile videoları kataloğunun içeriği

Küçük resme tıklamak aşağıdaki ekranı getirir:

45 videokaseti dijitalleştirmeye yönelik sekiz yıllık arayışım. Bölüm 2
Tek bir klibi bir medya sunucusunda görüntüleme

Yıllarca çalıştıktan sonra, akrabalarımıza videolarımızı başlangıçta istediğim YouTube'dakiyle aynı kullanışlı arayüzde izleme fırsatı vermekten inanılmaz derecede memnun kaldım.

Bonus: Ayda 1 doların altına düşen maliyet indirimi

Ev videolarını nadiren, yalnızca birkaç ayda bir izliyorsunuz. Ailem toplu olarak yılda yaklaşık 20 saat trafik oluşturdu, ancak sunucu 15/99,7 çalışıyordu. Zamanın %XNUMX'sini kapatan bir sunucu için aylık XNUMX dolar ödedim.

2018'in sonunda Google bir ürün yayınladı Bulut Çalıştırması. Katil özellik, Docker kapsayıcılarını o kadar hızlı çalıştırıyordu ki, uygulama HTTP isteklerine yanıt verebiliyordu. Yani, sunucu bekleme modunda kalabilir ve yalnızca biri ona gitmek istediğinde başlayabilir. Benimki gibi seyrek kullanılan uygulamalar için maliyetler ayda 15 dolardan yılda birkaç sente çıktı.

Hatırlamadığım nedenlerden dolayı Cloud Run, MediaGoblin imajımla çalışmadı. Ancak Cloud Run'ın gelişiyle şunu hatırladım Heroku benzer bir hizmeti ücretsiz olarak sunuyor ve araçları Google'ınkinden çok daha kullanışlı.

Ücretsiz bir uygulama sunucusu ile tek masraf veri depolamadır. Google'ın standart bölgesel depolama maliyeti 2,3 sent/GB'dir. Video arşivi 33 GB yani ayda sadece 77 sent ödüyorum.

45 videokaseti dijitalleştirmeye yönelik sekiz yıllık arayışım. Bölüm 2
Bu çözümün maliyeti ayda yalnızca 0,77 ABD dolarıdır

Deneyecek olanlar için ipuçları

Açıkçası süreç uzun sürdü. Ancak umarım bu makale, ev videonuzu dijitalleştirme ve yayınlama çabalarınızdan %80-90 oranında tasarruf etmenize yardımcı olur. Ayrı bir bölümde bulabilirsiniz ayrıntılı adım adım kılavuz süreç boyunca, ancak işte bazı genel ipuçları:

  • Dijitalleştirme ve düzenleme aşamasında mümkün olduğunca fazla meta veri kaydedin.
    • Değerli bilgiler genellikle video kaset etiketlerine kaydedilir.
    • Hangi klibin hangi kasetten ve hangi sırayla çekildiğini kaydedin.
    • Videoda belirtilmiş olabilecek çekim tarihini not edin.
  • Profesyonel sayısallaştırma hizmetleri için ödeme yapmayı düşünün.
    • Olacaksın чрезвычайно dijitalleştirme kalitesi açısından bunları eşleştirmek zor ve pahalıdır.
    • Ancak EverPresent adlı bir şirketten uzak durun (daha fazla ayrıntıya ihtiyacınız olursa bana bildirin).
  • Dijitalleştirmeyi kendiniz yapıyorsanız, bir HDD satın alın.
    • Sıkıştırılmamış standart tanımlı video dakikada 100-200 MB alır.
    • her şeyi üzerimde tuttum Synology DS412 + (10 TB).
  • Belirli bir uygulamaya bağlı olmayan bazı genel formatlarda meta veri yazın.
    • Klip açıklamaları, zaman kodları, tarihler vb.
    • Meta verileri uygulamaya özel bir biçimde kaydederseniz (veya daha kötüsü hiç kaydetmezseniz), başka bir çözüm kullanmaya karar verirseniz işi yeniden yapamazsınız.
    • Düzenleme yaparken, videoda pek çok yararlı meta veri görürsünüz. Onları kurtarmazsanız kaybedersiniz.
      • Videoda neler oluyor?
      • Orada kim kayıtlı?
      • Ne zaman kaydedildi?
  • En sevdiğiniz videoları etiketleyin.
    • Dürüst olmak gerekirse, çoğu ev videosu içeriği oldukça sıkıcıdır.
    • En sevdiğim kliplere "en iyi" etiketini yapıştırıyorum ve komik videolar izlemek istediğimde açıyorum.
  • Kapsamlı bir çözümü olabildiğince erken organize edin, böylece süreç baştan sona hemen devam eder.
    • Önce tüm kasetleri dijitalleştirmeye, ardından tüm kasetleri düzenlemeye vb. çalıştım.
    • Tek bir kasetle başlayıp tüm işi onunla yapmamış olmam çok kötü. O zaman hangi kararların ve hangi aşamalarda nihai sonucu etkilediğini anlardım.
  • Yeniden kodlamayı en aza indirin.
    • Bir klibi her düzenlediğinizde veya yeniden kodladığınızda, kalitesini düşürürsünüz.
    • Ham görüntüleri maksimum kalitede dijitalleştirin, ardından her bir klibin kodunu tarayıcıların yerel olarak oynattığı biçime tam olarak bir kez dönüştürün.
  • Video klipleri yayınlamak için mümkün olan en basit çözümü kullanın.
    • Geriye dönüp bakıldığında MediaGoblin, statik bir dizi video dosyasıyla web sayfaları oluşturmaya yönelik oldukça basit bir senaryo için aşırı karmaşık bir araç gibi görünüyor.
    • Baştan başlasaydım, aşağıdaki gibi statik bir site oluşturucu kullanırdım: Hugo, Jekyll veya Izgara.
  • Bir montaj yapın.
    • Video düzenleme, birden fazla videodaki en iyi anları birleştirmenin eğlenceli bir yoludur.
    • Düzenlemede ana şey müziktir. mesela konu harika yavaş kar The National'dan, bu benim kişisel keşfim.

Kaynak: habr.com