Η οκταετής προσπάθειά μου να ψηφιοποιήσω 45 βιντεοκασέτες. Μέρος 2

Το πρώτο μέρος περιγράφει τη δύσκολη προσπάθεια ψηφιοποίησης παλιών οικογενειακών βίντεο και διάσπασής τους σε ξεχωριστές σκηνές.. Μετά την επεξεργασία όλων των κλιπ, ήθελα να οργανώσω την προβολή τους στο διαδίκτυο τόσο βολικά όσο στο YouTube. Δεδομένου ότι πρόκειται για προσωπικές αναμνήσεις της οικογένειας, δεν μπορούν να αναρτηθούν στο ίδιο το YouTube. Χρειαζόμαστε μια πιο ιδιωτική φιλοξενία που να είναι βολική και ασφαλής.

Βήμα 3: Δημοσίευση

ClipBucket, ένας κλώνος YouTube ανοιχτού κώδικα που μπορεί να εγκατασταθεί στον δικό σας διακομιστή

Το πρώτο πράγμα που δοκίμασα ClipBucket, που αυτοαποκαλείται κλώνος YouTube ανοιχτού κώδικα που μπορείτε να εγκαταστήσετε στον διακομιστή σας.

Η οκταετής προσπάθειά μου να ψηφιοποιήσω 45 βιντεοκασέτες. Μέρος 2

Παραδόξως, το ClipBucket δεν έχει οδηγίες εγκατάστασης. Χάρη σε προς την εξωτερική διαχείριση я αυτοματοποιήθηκε η διαδικασία εγκατάστασης μέσω Πιθανό, ένα εργαλείο διαχείρισης διαμόρφωσης διακομιστή.

Μέρος της δυσκολίας ήταν ότι τα σενάρια εγκατάστασης του ClipBucket ήταν εντελώς σπασμένα. Εκείνη την εποχή εγώ εργάστηκε στην Google και σύμφωνα με τους όρους της σύμβασης δεν είχα το δικαίωμα να συνεισφέρω στον κλώνο YouTube ανοιχτού κώδικα, αλλά εγώ δημοσίευσε μια αναφορά σφάλματος, από το οποίο θα μπορούσαν εύκολα να γίνουν οι απαραίτητες διορθώσεις. Πέρασαν μήνες, και ακόμα δεν καταλάβαιναν ποιο ήταν το πρόβλημα. Αντίθετα πρόσθεσαν τα πάντα περισσότερο από σφάλματα σε κάθε έκδοση.

Το ClipBucket λειτουργούσε με ένα μοντέλο συμβουλευτικής—κυκλοφόρησαν τον κώδικά τους δωρεάν και χρεώθηκαν για βοήθεια κατά την ανάπτυξη. Σταδιακά συνειδητοποίησα ότι μια εταιρεία που κερδίζει χρήματα από πληρωμένη υποστήριξη πιθανότατα δεν ενδιαφέρεται πολύ να εγκαθιστούν οι ίδιοι οι πελάτες το προϊόν.

MediaGoblin, μια πιο σύγχρονη εναλλακτική

Μετά από μήνες απογοήτευσης με το ClipBucket, έψαξα τις διαθέσιμες επιλογές και βρήκα MediaGoblin.

Η οκταετής προσπάθειά μου να ψηφιοποιήσω 45 βιντεοκασέτες. Μέρος 2
MediaGoblin είναι μια πλατφόρμα κοινής χρήσης πολυμέσων εκτός σύνδεσης

Το MediaGoblin έχει πολλά καλούδια. Σε αντίθεση με το ClipBucket στην αντιαισθητική PHP, το MediaGoblin είναι γραμμένο σε Python, μια γλώσσα με την οποία έχω μεγάλη εμπειρία κωδικοποίησης. Τρώω διεπαφή γραμμής εντολών, που σας επιτρέπει να αυτοματοποιείτε εύκολα τη λήψη βίντεο. Το πιο σημαντικό, συνοδεύεται από το MediaGoblin Εικόνα Docker, το οποίο εξαλείφει τυχόν προβλήματα εγκατάστασης.

Λιμενεργάτης είναι μια τεχνολογία που δημιουργεί ένα αυτόνομο περιβάλλον για την εκτέλεση μιας εφαρμογής οπουδήποτε. Χρησιμοποιώ το Docker στο πολλά από τα έργα του.

Η εκπληκτική δυσκολία της επαναπροσαρμογής του MediaGoblin

Υπέθεσα ότι η ανάπτυξη της εικόνας docker του MediaGoblin θα ήταν μια ασήμαντη εργασία. Λοιπόν, αυτό δεν λειτούργησε ακριβώς έτσι.

Η ολοκληρωμένη εικόνα δεν περιείχε δύο απαραίτητες λειτουργίες:

  • Έλεγχος ταυτότητας
    • Το MediaGoblin δημιουργεί μια δημόσια πύλη πολυμέσων από προεπιλογή και χρειαζόμουν έναν τρόπο να περιορίσω την πρόσβαση σε ξένους.
  • Διακωδικοποίηση
    • Κάθε φορά που κάνετε λήψη ενός βίντεο, το MediaGoblin προσπαθεί να το διακωδικοποιήσει για βέλτιστη ροή. Εάν το βίντεο είναι αρχικά έτοιμο για ροή, η διακωδικοποίηση υποβαθμίζει την ποιότητα.
    • Το MediaGoblin παρέχει απενεργοποίηση της διακωδικοποίησης μέσω επιλογών διαμόρφωσης, αλλά αυτό δεν μπορεί να γίνει σε μια υπάρχουσα εικόνα Docker.

Λοιπόν, κανένα πρόβλημα. Η εικόνα Docker συνοδεύεται από ανοιχτή πηγή, άρα είναι δυνατό το ξαναφτιάξτε μόνοι σας.

Δυστυχώς, η εικόνα Docker δεν είναι πλέον κατασκευασμένη από την τρέχουσα. Αποθετήριο MediaGoblin. Προσπάθησα να το συγχρονίσω με την έκδοση από την τελευταία επιτυχημένη κατασκευή, αλλά και αυτό απέτυχε. Παρόλο που χρησιμοποίησα τον ίδιο ακριβώς κώδικα, οι εξωτερικές εξαρτήσεις του MediaGoblin άλλαξαν, σπάζοντας την κατασκευή. Μετά από δεκάδες ώρες, έτρεξα στη διαδικασία δημιουργίας του MediaGoblin 10-15 λεπτών ξανά και ξανά μέχρι να δουλέψει τελικά.

Λίγους μήνες αργότερα έγινε το ίδιο. Συνολικά, η αλυσίδα εξάρτησης MediaGoblin έχει σπάσει την κατασκευή μου αρκετές φορές τα τελευταία δύο χρόνια και η τελευταία φορά που συνέβη ήταν μόλις έγραφα αυτό το άρθρο. Τελικά δημοσίευσα δικό του πιρούνι του MediaGoblin c σκληρά κωδικοποιημένες εξαρτήσεις και ρητά καθορισμένες εκδόσεις βιβλιοθηκών. Με άλλα λόγια, αντί του αμφίβολου ισχυρισμού ότι το MediaGoblin λειτουργεί με οποιαδήποτε έκδοση σέλινο >= 3.0, εγκατέστησα μια συγκεκριμένη εξάρτηση έκδοσης σέλινο 4.2.1επειδή δοκίμασα το MediaGoblin με αυτήν την έκδοση. Φαίνεται ότι το προϊόν χρειάζεται αναπαραγώγιμος μηχανισμός κατασκευής, αλλά δεν το έχω κάνει ακόμα.

Τέλος πάντων, μετά από πολλές ώρες αγώνα, κατάφερα τελικά να δημιουργήσω και να διαμορφώσω το MediaGoblin σε μια εικόνα Docker. Εκεί ήταν ήδη εύκολο παραλείψτε την περιττή διακωδικοποίηση и εγκαταστήστε το Nginx για έλεγχο ταυτότητας.

Βήμα 4. Φιλοξενία

Εφόσον το MediaGoblin εκτελούσε το Docker στον τοπικό μου υπολογιστή, το επόμενο βήμα ήταν να το αναπτύξω σε έναν διακομιστή cloud, ώστε η οικογένεια να μπορεί να παρακολουθήσει το βίντεο.

MediaGoblin και το πρόβλημα αποθήκευσης βίντεο

Υπάρχουν πολλές πλατφόρμες που λαμβάνουν μια εικόνα Docker και τη φιλοξενούν σε μια δημόσια διεύθυνση URL. Το αλίευμα είναι ότι εκτός από την ίδια την εφαρμογή, έπρεπε να δημοσιευτούν 33 GB αρχείων βίντεο. Ήταν δυνατή η σκληρή κωδικοποίηση τους σε μια εικόνα Docker, αλλά αυτό θα ήταν δυσκίνητο και άσχημο. Η αλλαγή μιας γραμμής διαμόρφωσης θα απαιτούσε εκ νέου ανάπτυξη 33 GB δεδομένων.

Όταν χρησιμοποίησα το ClipBucket έλυσα το πρόβλημα με gcsfuse - ένα βοηθητικό πρόγραμμα που επιτρέπει στο λειτουργικό σύστημα να ανεβάζει καταλόγους στο Google Cloud αποθήκευσης cloud ως κανονικές διαδρομές προς το σύστημα αρχείων. Φιλοξενούσα τα αρχεία βίντεο στο Google Cloud και χρησιμοποίησα το gcsfuse για να τα κάνω να εμφανίζονται στο ClipBucket ως τοπικά αρχεία.

Η διαφορά ήταν ότι το ClipBucket έτρεχε σε μια πραγματική εικονική μηχανή, ενώ το MediaGoblin σε ένα κοντέινερ Docker. Εδώ, η τοποθέτηση αρχείων από την αποθήκευση cloud αποδείχθηκε πολύ πιο δύσκολη. Πέρασα δεκάδες ώρες λύνοντας όλα τα προβλήματα και έγραψα για αυτό ολόκληρο το blog post.

Η οκταετής προσπάθειά μου να ψηφιοποιήσω 45 βιντεοκασέτες. Μέρος 2
Η αρχική ενσωμάτωση του MediaGoblin με τον χώρο αποθήκευσης Google Cloud, για τον οποίο μιλάω είπε το 2018

Μετά από αρκετές εβδομάδες προσαρμογής όλων των εξαρτημάτων, όλα λειτούργησαν. Χωρίς να κάνω καμία αλλαγή στον κώδικα του MediaGoblin, τον εξαπάτησα να διαβάζω και να γράφω αρχεία πολυμέσων στο Google cloud storage.

Το μόνο πρόβλημα ήταν ότι το MediaGoblin έγινε αισχρά αργό. Χρειάστηκαν 20 ολόκληρα δευτερόλεπτα για να φορτωθούν οι μικρογραφίες βίντεο στην αρχική σελίδα. Αν πηδούσατε μπροστά ενώ παρακολουθούσατε ένα βίντεο, το MediaGoblin θα σταματούσε για ατελείωτα 10 δευτερόλεπτα πριν συνεχίσει την αναπαραγωγή.

Το κύριο πρόβλημα ήταν ότι τα βίντεο και οι φωτογραφίες έκαναν μια μακρά, κυκλική διαδρομή προς τον χρήστη. Έπρεπε να περάσουν από τον χώρο αποθήκευσης cloud της Google μέσω του gcsfuse στο MediaGoblin, Nginx - και μόνο τότε έφτασαν στο πρόγραμμα περιήγησης του χρήστη. Το κύριο σημείο συμφόρησης ήταν το gcsfuse, το οποίο δεν είναι βελτιστοποιημένο για ταχύτητα. Οι προγραμματιστές προειδοποιούν για μεγάλες καθυστερήσεις στη λειτουργία του βοηθητικού προγράμματος απευθείας στην κεντρική σελίδα του έργου:

Η οκταετής προσπάθειά μου να ψηφιοποιήσω 45 βιντεοκασέτες. Μέρος 2
Προειδοποιήσεις σχετικά με χαμηλή απόδοση στην τεκμηρίωση του gcsfuse

Στην ιδανική περίπτωση, το πρόγραμμα περιήγησης θα πρέπει να ανακτά αρχεία απευθείας από το Google Cloud, παρακάμπτοντας τυχόν ενδιάμεσα επίπεδα. Πώς μπορείτε να το κάνετε αυτό χωρίς να βουτήξετε στη βάση κώδικα MediaGoblin ή να προσθέσετε πολύπλοκη λογική ενσωμάτωσης στο Google Cloud;

Κόλπο Sub_filter στο nginx

Ευτυχώς όμως βρήκα μια απλή λύση немного άσχημος. Πρόσθεσα στη διαμόρφωση default.conf στο Nginx ένα τέτοιο φίλτρο:

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

Στην εγκατάσταση μου, το Nginx ενήργησε ως διακομιστής μεσολάβησης μεταξύ του MediaGoblin και του τελικού χρήστη. Η παραπάνω οδηγία δίνει εντολή στο Nginx να αναζητήσει και να αντικαταστήσει όλες τις απαντήσεις HTML MediaGoblin πριν τις εμφανίσει στον τελικό χρήστη. Το Nginx αντικαθιστά όλες τις σχετικές διαδρομές στα αρχεία πολυμέσων MediaGoblin με διευθύνσεις URL από την αποθήκευση cloud της Google.

Για παράδειγμα, το MediaGoblin δημιουργεί 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 αλλάζει την απάντηση:

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

Τώρα όλα πάνε όπως αναμενόταν:

Η οκταετής προσπάθειά μου να ψηφιοποιήσω 45 βιντεοκασέτες. Μέρος 2
Το Nginx ξαναγράφει τις απαντήσεις από το MediaGoblin, ώστε οι πελάτες να μπορούν να ζητούν αρχεία πολυμέσων απευθείας από το Google cloud storage

Το καλύτερο μέρος της λύσης μου είναι ότι δεν απαιτεί αλλαγές στον κώδικα MediaGoblin. Η οδηγία δύο γραμμών του Nginx ενσωματώνει απρόσκοπτα το MediaGoblin και το Google Cloud, παρόλο που οι υπηρεσίες δεν γνωρίζουν απολύτως τίποτα η μία για την άλλη.

Σημείωση: Αυτή η λύση απαιτεί τα αρχεία στον χώρο αποθήκευσης cloud της Google να είναι αναγνώσιμα από όλους. Για να μειώσω τον κίνδυνο μη εξουσιοδοτημένης πρόσβασης, χρησιμοποιώ ένα μακρύ, τυχαίο όνομα κάδου (π.χ. mediagoblin-39dpduhfz1wstbprmyk5ak29) και βεβαιωθείτε ότι η πολιτική ελέγχου πρόσβασης του κάδου δεν επιτρέπει σε μη εξουσιοδοτημένους χρήστες να εμφανίζουν τα περιεχόμενα του καταλόγου.

Τελικό προϊόν

Σε αυτό το σημείο είχα μια ολοκληρωμένη, λειτουργική λύση. Το MediaGoblin έτρεξε με χαρά στο δικό του κοντέινερ στην πλατφόρμα cloud της Google, επομένως δεν χρειαζόταν να επιδιορθώνεται ή να ενημερώνεται συχνά. Τα πάντα στη διαδικασία μου ήταν αυτοματοποιημένα και αναπαραγόμενα, επιτρέποντας απλές επεξεργασίες ή επαναλήψεις σε προηγούμενες εκδόσεις.

Στην οικογένειά μου άρεσε πολύ το πόσο εύκολο ήταν να παρακολουθώ τα βίντεο. Με τη βοήθεια του hack Nginx που περιγράφεται παραπάνω, η εργασία με βίντεο έγινε τόσο γρήγορη όσο στο YouTube.

Η οθόνη προβολής μοιάζει με αυτό:

Η οκταετής προσπάθειά μου να ψηφιοποιήσω 45 βιντεοκασέτες. Μέρος 2
Περιεχόμενα του οικογενειακού καταλόγου βίντεο ανά ετικέτα "Best"

Κάνοντας κλικ στη μικρογραφία εμφανίζεται μια οθόνη όπως αυτή:

Η οκταετής προσπάθειά μου να ψηφιοποιήσω 45 βιντεοκασέτες. Μέρος 2
Προβολή ενός μόνο κλιπ σε διακομιστή πολυμέσων

Μετά από χρόνια δουλειάς, ήταν απίστευτα ικανοποιητικό να δίνουμε στα μέλη της οικογένειας την ευκαιρία να παρακολουθήσουν τα βίντεό μας στην ίδια φιλική προς το χρήστη διεπαφή όπως το YouTube που ήθελα αρχικά.

Μπόνους: Μειώστε το κόστος σε λιγότερο από 1 $ ανά μήνα

Δεν βλέπετε συχνά βίντεο από το σπίτι, μόνο κάθε λίγους μήνες. Η οικογένειά μου παρήγαγε συλλογικά περίπου 20 ώρες κίνησης το χρόνο, αλλά ο διακομιστής λειτουργούσε 15 ώρες το 99,7ωρο. Πλήρωνα XNUMX $ μηνιαίως για έναν διακομιστή που ήταν μειωμένος κατά XNUMX% των περιπτώσεων.

Στα τέλη του 2018, η Google κυκλοφόρησε το προϊόν Cloud Run. Η δυνατότητα killer εκτελούσε κοντέινερ Docker τόσο γρήγορα που η εφαρμογή μπορούσε να ανταποκριθεί σε αιτήματα HTTP. Δηλαδή, ο διακομιστής μπορούσε να παραμείνει σε κατάσταση αναμονής και να ξεκινήσει μόνο όταν κάποιος ήθελε να έχει πρόσβαση σε αυτόν. Για εφαρμογές που εκτελούνται σπάνια, όπως η δική μου, το κόστος έχει πέσει από 15 $ το μήνα σε μερικά σεντς το χρόνο.

Για λόγους που δεν θυμάμαι πλέον, το Cloud Run δεν λειτουργούσε με την εικόνα μου MediaGoblin. Αλλά με την έλευση του Cloud Run το θυμήθηκα Heroku προσφέρει μια παρόμοια υπηρεσία δωρεάν και τα εργαλεία τους είναι πολύ πιο φιλικά προς το χρήστη από αυτά της Google.

Με έναν δωρεάν διακομιστή εφαρμογών, το μόνο κόστος είναι η αποθήκευση δεδομένων. Ο τυπικός περιφερειακός αποθηκευτικός χώρος της Google κοστίζει 2,3 σεντ/GB. Το αρχείο βίντεο καταλαμβάνει 33 GB, επομένως πληρώνω μόνο 77 σεντς το μήνα.

Η οκταετής προσπάθειά μου να ψηφιοποιήσω 45 βιντεοκασέτες. Μέρος 2
Αυτή η λύση κοστίζει μόνο 0,77 $ ανά μήνα

Συμβουλές για όσους σχεδιάζουν να δοκιμάσουν

Προφανώς η διαδικασία μου πήρε πολύ χρόνο. Ελπίζω όμως ότι αυτό το άρθρο θα σας βοηθήσει να εξοικονομήσετε το 80-90% της προσπάθειας ψηφιοποίησης και δημοσίευσης των βίντεο του σπιτιού σας. Σε ξεχωριστή ενότητα μπορείτε να βρείτε αναλυτικός οδηγός βήμα προς βήμα σε όλη τη διαδικασία, αλλά εδώ είναι μερικές γενικές συμβουλές:

  • Κατά τη φάση της ψηφιοποίησης και της επεξεργασίας, διατηρήστε όσο το δυνατόν περισσότερα μεταδεδομένα.
    • Πολύτιμες πληροφορίες καταγράφονται συχνά σε ετικέτες βιντεοκασέτας.
    • Παρακολουθήστε ποιο κλιπ γυρίστηκε από ποια κασέτα και με ποια σειρά.
    • Σημειώστε την ημερομηνία λήψης, η οποία μπορεί να εμφανίζεται στο βίντεο.
  • Εξετάστε το ενδεχόμενο να πληρώσετε για επαγγελματικές υπηρεσίες ψηφιοποίησης.
    • Εσύ θα υπερβολικά είναι δύσκολο και ακριβό να τα ταιριάξουμε ως προς την ποιότητα ψηφιοποίησης.
    • Αλλά μείνετε μακριά από μια εταιρεία που ονομάζεται EverPresent (στείλτε μου μήνυμα αν χρειάζεστε λεπτομέρειες).
  • Εάν κάνετε μόνοι σας ψηφιοποίηση, αγοράστε έναν σκληρό δίσκο.
    • Το μη συμπιεσμένο βίντεο τυπικής ευκρίνειας διαρκεί 100-200 MB ανά λεπτό.
    • Τα κράτησα όλα στα δικά μου Synology DS412 + (10 TB).
  • Καταγράψτε τα μεταδεδομένα σε κάποια κοινή μορφή που δεν συνδέεται με μια συγκεκριμένη εφαρμογή.
    • Περιγραφές κλιπ, κωδικοί ώρας, ημερομηνίες κ.λπ.
    • Εάν αποθηκεύσετε μεταδεδομένα σε μορφή συγκεκριμένης εφαρμογής (ή χειρότερα, μην τα αποθηκεύσετε καθόλου), δεν θα μπορείτε να επαναλάβετε την εργασία εάν αποφασίσετε να χρησιμοποιήσετε διαφορετική λύση.
    • Καθώς επεξεργάζεστε, βλέπετε πολλά χρήσιμα μεταδεδομένα στο βίντεο. Θα τα χάσεις αν δεν τα σώσεις.
      • Τι συμβαίνει στο βίντεο;
      • Ποιος είναι εγγεγραμμένος εκεί;
      • Πότε ηχογραφήθηκε αυτό;
  • Σημειώστε τα αγαπημένα σας βίντεο.
    • Για να είμαι ειλικρινής, τα περισσότερα οικιακά βίντεο είναι αρκετά βαρετά.
    • Εφαρμόζω την ετικέτα "best of" στα αγαπημένα μου κλιπ και τα ανοίγω όταν θέλω να δω αστεία βίντεο.
  • Οργανώστε μια ολοκληρωμένη λύση όσο το δυνατόν νωρίτερα, ώστε η διαδικασία να πάει κατευθείαν από την αρχή μέχρι το τέλος.
    • Προσπάθησα να ψηφιοποιήσω πρώτα όλες τις κασέτες, μετά να επεξεργαστώ όλες τις κασέτες κ.λπ.
    • Μακάρι να είχα ξεκινήσει με μια κασέτα και να είχα κάνει όλη τη δουλειά με αυτήν. Τότε θα καταλάβαινα ποιες αποφάσεις και σε ποια στάδια επηρεάζουν το τελικό αποτέλεσμα.
  • Κρατήστε την επανακωδικοποίηση στο ελάχιστο.
    • Κάθε φορά που επεξεργάζεστε ή επανακωδικοποιείτε ένα κλιπ, μειώνετε την ποιότητά του.
    • Ψηφιοποιήστε το ακατέργαστο πλάνα σας στη μέγιστη ποιότητα και, στη συνέχεια, μετακωδικοποιήστε κάθε κλιπ ακριβώς μία φορά στη μορφή που αποδίδουν εγγενώς τα προγράμματα περιήγησης.
  • Χρησιμοποιήστε την απλούστερη δυνατή λύση για τη δημοσίευση βίντεο κλιπ.
    • Εκ των υστέρων, το MediaGoblin φαίνεται σαν ένα υπερβολικά πολύπλοκο εργαλείο για το αρκετά απλό σενάριο της δημιουργίας ιστοσελίδων με ένα στατικό σύνολο αρχείων βίντεο.
    • Αν ξεκινούσα από την αρχή, θα χρησιμοποιούσα μια γεννήτρια στατικών τοποθεσιών όπως Hugo, Jekyll ή Πλέγμα.
  • Κάντε την εγκατάσταση.
    • Η επεξεργασία βίντεο είναι ένας διασκεδαστικός τρόπος για να συνδυάσετε τις καλύτερες στιγμές από πολλά βίντεο.
    • Το κύριο πράγμα στο μοντάζ είναι η μουσική. Για παράδειγμα, το θέμα είναι εκπληκτικό Αργό χιόνι από το National, αυτή είναι η προσωπική μου ανακάλυψη.

Πηγή: www.habr.com