Πώς λειτουργεί ένας κωδικοποιητής βίντεο; Μέρος 2. Τι, γιατί, πώς

Το πρώτο μέρος: Βασικά στοιχεία εργασίας με βίντεο και εικόνες

Πώς λειτουργεί ένας κωδικοποιητής βίντεο; Μέρος 2. Τι, γιατί, πώς

Τι; Ο κωδικοποιητής βίντεο είναι ένα κομμάτι λογισμικού/υλισμικού που συμπιέζει ή/και αποσυμπιέζει το ψηφιακό βίντεο.

Για ποιο λόγο; Παρά ορισμένους περιορισμούς τόσο ως προς το εύρος ζώνης όσο και
και όσον αφορά τον χώρο αποθήκευσης δεδομένων, η αγορά απαιτεί βίντεο όλο και υψηλότερης ποιότητας. Θυμάστε πώς στην τελευταία ανάρτηση υπολογίσαμε το απαιτούμενο ελάχιστο για 30 καρέ ανά δευτερόλεπτο, 24 bit ανά pixel, με ανάλυση 480x240; Λάβαμε 82,944 Mbit/s χωρίς συμπίεση. Η συμπίεση είναι επί του παρόντος ο μόνος τρόπος για γενική μετάδοση HD/FullHD/4K σε οθόνες τηλεόρασης και στο Διαδίκτυο. Πώς επιτυγχάνεται αυτό; Τώρα ας δούμε εν συντομία τις κύριες μεθόδους.

Πώς λειτουργεί ένας κωδικοποιητής βίντεο; Μέρος 2. Τι, γιατί, πώς

Η μετάφραση έγινε με την υποστήριξη της EDISON Software.

Είμαστε αρραβωνιασμένοι ενσωμάτωση συστημάτων βιντεοεπιτήρησηςΚαι αναπτύσσουμε μικροτομογράφο.

Codec vs Container

Ένα συνηθισμένο λάθος που κάνουν οι αρχάριοι είναι να συγχέουν τον ψηφιακό κωδικοποιητή βίντεο και το ψηφιακό κοντέινερ βίντεο. Ένα δοχείο είναι μια συγκεκριμένη μορφή. Ένα περιτύλιγμα που περιέχει μεταδεδομένα βίντεο (και πιθανώς ήχο). Το συμπιεσμένο βίντεο μπορεί να θεωρηθεί ως ωφέλιμο φορτίο κοντέινερ.

Συνήθως, η επέκταση ενός αρχείου βίντεο υποδεικνύει τον τύπο του κοντέινερ. Για παράδειγμα, το αρχείο video.mp4 είναι πιθανώς ένα κοντέινερ MPEG-4 Μέρος 14, και το πιο πιθανό είναι ένα αρχείο με το όνομα video.mkv ματριόσκα. Για να είστε απόλυτα σίγουροι για τη μορφή κωδικοποιητή και κοντέινερ, μπορείτε να χρησιμοποιήσετε FFmpeg ή MediaInfo.

Μια μικρή ιστορία

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

Κωδικοποιητής βίντεο H.261 εμφανίστηκε το 1990 (τεχνικά - το 1988) και δημιουργήθηκε για να λειτουργεί με ρυθμό μεταφοράς δεδομένων 64 Kbps. Χρησιμοποιούσε ήδη ιδέες όπως υποδειγματοληψία χρώματος, μακρομπλόκ κ.λπ. Το πρότυπο κωδικοποιητή βίντεο δημοσιεύτηκε το 1995 H.263, που αναπτύχθηκε μέχρι το 2001.

Η πρώτη έκδοση ολοκληρώθηκε το 2003 H.264 / AVC. Την ίδια χρονιά, το TrueMotion κυκλοφόρησε τον δωρεάν κωδικοποιητή βίντεο με απώλειες που ονομάζεται VP3. Η Google αγόρασε την εταιρεία το 2008, απελευθερώνοντας VP8 την ίδια χρονιά. Τον Δεκέμβριο του 2012, η ​​Google κυκλοφόρησε VP9, και υποστηρίζεται περίπου στα ¾ της αγοράς του προγράμματος περιήγησης (συμπεριλαμβανομένων των φορητών συσκευών).

AV1 είναι ένας νέος δωρεάν κωδικοποιητής βίντεο ανοιχτού κώδικα που αναπτύχθηκε από την Συμμαχία για Ανοιχτά Μέσα (AO Media), που περιλαμβάνει τις πιο διάσημες εταιρείες, όπως: Google, Mozilla, Microsoft, Amazon, Netflix, AMD, ARM, NVidia, Intel και Cisco. Η πρώτη έκδοση του κωδικοποιητή, 0.1.0, δημοσιεύτηκε στις 7 Απριλίου 2016.

Γέννηση του AV1

Στις αρχές του 2015, η Google εργαζόταν VP10Το Xiph (το οποίο ανήκει στη Mozilla) εργαζόταν Νταάλα, και η Cisco δημιούργησε το δικό της δωρεάν κωδικοποιητή βίντεο που ονομάζεται Thor.

Τότε MPEG LA ανακοινώθηκαν για πρώτη φορά ετήσια όρια για HEVC (H.265) και ένα τέλος 8 φορές υψηλότερο από το H.264, αλλά σύντομα άλλαξαν ξανά τους κανόνες:

χωρίς ετήσιο όριο,
τέλος περιεχομένου (0,5% των εσόδων) και
το μοναδιαίο τέλος είναι περίπου 10 φορές υψηλότερο από το H.264.

Συμμαχία για τα Ανοιχτά Μέσα δημιουργήθηκε από εταιρείες διαφορετικών τομέων: κατασκευαστές εξοπλισμού (Intel, AMD, ARM, Nvidia, Cisco), παρόχους περιεχομένου (Google, Netflix, Amazon), δημιουργούς προγραμμάτων περιήγησης (Google, Mozilla) και άλλους.

Οι εταιρείες είχαν έναν κοινό στόχο - έναν κωδικοποιητή βίντεο χωρίς δικαιώματα. Στη συνέχεια εμφανίζεται AV1 με πολύ απλούστερη άδεια ευρεσιτεχνίας. Ο Timothy B. Terryberry έκανε μια εκπληκτική παρουσίαση που έγινε η αφετηρία του τρέχοντος concept AV1 και του μοντέλου αδειοδότησης.

Θα εκπλαγείτε αν μάθετε ότι μπορείτε να αναλύσετε τον κωδικοποιητή AV1 μέσω ενός προγράμματος περιήγησης (όσοι ενδιαφέρονται μπορούν να απευθυνθούν στο aomanalyzer.org).

Πώς λειτουργεί ένας κωδικοποιητής βίντεο; Μέρος 2. Τι, γιατί, πώς

Καθολικός κωδικοποιητής

Ας δούμε τους κύριους μηχανισμούς στους οποίους βασίζεται ο καθολικός κωδικοποιητής βίντεο. Οι περισσότερες από αυτές τις έννοιες είναι χρήσιμες και χρησιμοποιούνται σε σύγχρονους κωδικοποιητές όπως π.χ VP9, AV1 и HEVC. Σας προειδοποιώ ότι πολλά από τα πράγματα που εξηγούνται θα απλοποιηθούν. Μερικές φορές θα χρησιμοποιηθούν παραδείγματα πραγματικού κόσμου (όπως με το H.264) για την επίδειξη της τεχνολογίας.

1ο βήμα - διαχωρισμός της εικόνας

Το πρώτο βήμα είναι να χωρίσετε το πλαίσιο σε πολλές ενότητες, υποενότητες και όχι μόνο.

Πώς λειτουργεί ένας κωδικοποιητής βίντεο; Μέρος 2. Τι, γιατί, πώς

Για τι? Υπάρχουν πολλοί λόγοι. Όταν χωρίζουμε μια εικόνα, μπορούμε να προβλέψουμε με μεγαλύτερη ακρίβεια το διάνυσμα της κίνησης χρησιμοποιώντας μικρά τμήματα για μικρά κινούμενα μέρη. Ενώ για στατικό φόντο μπορείτε να περιοριστείτε σε μεγαλύτερα τμήματα.

Οι κωδικοποιητές οργανώνουν συνήθως αυτές τις ενότητες σε ενότητες (ή κομμάτια), μακρομπλόκ (ή μπλοκ δέντρων κωδικοποίησης) και πολλαπλές υποενότητες. Το μέγιστο μέγεθος αυτών των κατατμήσεων ποικίλλει, το HEVC το ορίζει σε 64x64 ενώ το AVC χρησιμοποιεί 16x16 και τα υποδιαμερίσματα μπορούν να χωριστούν σε μεγέθη 4x4.

Θυμάστε τους τύπους κουφωμάτων από το τελευταίο άρθρο;! Το ίδιο μπορεί να εφαρμοστεί και σε μπλοκ, ώστε να έχουμε ένα θραύσμα Ι, ένα μπλοκ Β, ένα μακρομπλόκ P κ.λπ.

Για όσους θέλουν να εξασκηθούν, παρακολουθήστε πώς χωρίζεται η εικόνα σε ενότητες και υποενότητες. Για να το κάνετε αυτό, μπορείτε να χρησιμοποιήσετε αυτό που ήδη αναφέρθηκε στο προηγούμενο άρθρο. Intel Video Pro Analyzer (αυτή που πληρώνεται, αλλά με δωρεάν δοκιμαστική έκδοση που περιορίζεται στα πρώτα 10 καρέ). Ενότητες που αναλύονται εδώ VP9:

Πώς λειτουργεί ένας κωδικοποιητής βίντεο; Μέρος 2. Τι, γιατί, πώς

2ο βήμα - πρόβλεψη

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

3ο βήμα - μεταμόρφωση

Μόλις έχουμε ένα υπολειπόμενο μπλοκ (προβλεπόμενο τμήμα → πραγματικό τμήμα), είναι δυνατό να το μετασχηματίσουμε με τέτοιο τρόπο ώστε να γνωρίζουμε ποια pixel μπορούν να απορριφθούν διατηρώντας τη συνολική ποιότητα. Υπάρχουν ορισμένοι μετασχηματισμοί που παρέχουν την ακριβή συμπεριφορά.

Αν και υπάρχουν και άλλες μέθοδοι, ας τις δούμε πιο αναλυτικά. διακριτό συνημιτονικό μετασχηματισμό (DCT - από διακριτό συνημιτονικό μετασχηματισμό). Κύριες λειτουργίες του DCT:

  • Μετατρέπει μπλοκ εικονοστοιχείων σε μπλοκ συντελεστών συχνότητας ίσου μεγέθους.
  • Συμπυκνώνει την ισχύ για να βοηθήσει στην εξάλειψη του χωρικού πλεονασμού.
  • Παρέχει αναστρεψιμότητα.

2 Φεβρουαρίου 2017 Sintra R.J. (Cintra, RJ) και Bayer F.M. (Bayer FM) δημοσίευσε ένα άρθρο σχετικά με έναν μετασχηματισμό που μοιάζει με DCT για συμπίεση εικόνας που απαιτεί μόνο 14 προσθήκες.

Μην ανησυχείτε αν δεν καταλαβαίνετε τα οφέλη κάθε είδους. Τώρα ας χρησιμοποιήσουμε συγκεκριμένα παραδείγματα για να δούμε την πραγματική τους αξία.

Ας πάρουμε αυτό το μπλοκ pixel 8x8:

Πώς λειτουργεί ένας κωδικοποιητής βίντεο; Μέρος 2. Τι, γιατί, πώς

Αυτό το μπλοκ αποδίδεται στην ακόλουθη εικόνα 8 επί 8 pixel:

Πώς λειτουργεί ένας κωδικοποιητής βίντεο; Μέρος 2. Τι, γιατί, πώς

Εφαρμόστε το DCT σε αυτό το μπλοκ pixel και λάβετε ένα μπλοκ συντελεστών 8x8:

Πώς λειτουργεί ένας κωδικοποιητής βίντεο; Μέρος 2. Τι, γιατί, πώς

Και αν αποδώσουμε αυτό το μπλοκ συντελεστών, θα λάβουμε την ακόλουθη εικόνα:

Πώς λειτουργεί ένας κωδικοποιητής βίντεο; Μέρος 2. Τι, γιατί, πώς

Όπως μπορείτε να δείτε, δεν μοιάζει με την αρχική εικόνα. Μπορείτε να δείτε ότι ο πρώτος συντελεστής είναι πολύ διαφορετικός από όλους τους άλλους. Αυτός ο πρώτος συντελεστής είναι γνωστός ως συντελεστής DC, ο οποίος αντιπροσωπεύει όλα τα δείγματα στον πίνακα εισόδου, κάτι σαν μέσο όρο.

Αυτό το μπλοκ συντελεστών έχει μια ενδιαφέρουσα ιδιότητα: διαχωρίζει στοιχεία υψηλής συχνότητας από αυτά χαμηλής συχνότητας.

Πώς λειτουργεί ένας κωδικοποιητής βίντεο; Μέρος 2. Τι, γιατί, πώς

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

Η συχνότητα αναφέρεται στο πόσο γρήγορα αλλάζει το σήμα.

Ας προσπαθήσουμε να εφαρμόσουμε τη γνώση που αποκτήθηκε στην περίπτωση δοκιμής μετατρέποντας την αρχική εικόνα στη συχνότητά της (μπλοκ συντελεστών) χρησιμοποιώντας DCT και στη συνέχεια απορρίπτοντας μέρος των λιγότερο σημαντικών συντελεστών.

Πρώτα το μετατρέπουμε στον τομέα συχνότητας.

Πώς λειτουργεί ένας κωδικοποιητής βίντεο; Μέρος 2. Τι, γιατί, πώς

Στη συνέχεια, απορρίπτουμε μέρος (67%) των συντελεστών, κυρίως το κάτω δεξιό μέρος.

Πώς λειτουργεί ένας κωδικοποιητής βίντεο; Μέρος 2. Τι, γιατί, πώς

Τέλος, ανακατασκευάζουμε την εικόνα από αυτό το απορριφθέν μπλοκ συντελεστών (θυμηθείτε, πρέπει να είναι αντιστρέψιμο) και τη συγκρίνουμε με το πρωτότυπο.

Πώς λειτουργεί ένας κωδικοποιητής βίντεο; Μέρος 2. Τι, γιατί, πώς

Βλέπουμε ότι μοιάζει με την αρχική εικόνα, αλλά υπάρχουν πολλές διαφορές από την αρχική. Πετάξαμε 67,1875% και παρόλα αυτά πήραμε κάτι που μοιάζει με το πρωτότυπο. Ήταν δυνατό να απορρίψουμε πιο προσεκτικά τους συντελεστές για να αποκτήσουμε μια εικόνα ακόμα καλύτερης ποιότητας, αλλά αυτό είναι ένα επόμενο θέμα.

Κάθε συντελεστής δημιουργείται χρησιμοποιώντας όλα τα pixel

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

Πώς λειτουργεί ένας κωδικοποιητής βίντεο; Μέρος 2. Τι, γιατί, πώς

Μπορείτε επίσης να προσπαθήσετε να οπτικοποιήσετε το DCT κοιτάζοντας έναν απλό σχηματισμό εικόνας που βασίζεται σε αυτό. Για παράδειγμα, εδώ είναι το σύμβολο A που δημιουργείται χρησιμοποιώντας κάθε βάρος συντελεστή:

Πώς λειτουργεί ένας κωδικοποιητής βίντεο; Μέρος 2. Τι, γιατί, πώς

4ο βήμα - κβαντοποίηση

Αφού πετάξουμε κάποιους συντελεστές στο προηγούμενο βήμα, στο τελευταίο βήμα (μετασχηματισμός) εκτελούμε μια ειδική μορφή κβαντοποίησης. Σε αυτό το στάδιο είναι αποδεκτό να χαθούν πληροφορίες. Ή, πιο απλά, θα κβαντοποιήσουμε τους συντελεστές για να επιτύχουμε συμπίεση.

Πώς μπορείτε να κβαντίσετε ένα μπλοκ συντελεστών; Μία από τις απλούστερες μεθόδους είναι η ομοιόμορφη κβαντοποίηση, όταν παίρνουμε ένα μπλοκ, το διαιρούμε με μία τιμή (με το 10) και στρογγυλοποιούμε το αποτέλεσμα.

Πώς λειτουργεί ένας κωδικοποιητής βίντεο; Μέρος 2. Τι, γιατί, πώς

Μπορούμε να αντιστρέψουμε αυτό το μπλοκ συντελεστών; Ναι, μπορούμε, πολλαπλασιάζοντας με την ίδια τιμή με την οποία διαιρέσαμε.

Πώς λειτουργεί ένας κωδικοποιητής βίντεο; Μέρος 2. Τι, γιατί, πώς

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

Βήμα 5 - κωδικοποίηση εντροπίας

Αφού έχουμε κβαντοποιήσει τα δεδομένα (μπλοκ εικόνας, θραύσματα, πλαίσια), μπορούμε ακόμα να τα συμπιέσουμε χωρίς απώλειες. Υπάρχουν πολλοί αλγοριθμικοί τρόποι συμπίεσης δεδομένων. Θα ρίξουμε μια γρήγορη ματιά σε μερικά από αυτά, για μια βαθύτερη κατανόηση, μπορείτε να διαβάσετε το βιβλίο Understanding Compression: Data Compression for Modern Developers ("Κατανόηση της συμπίεσης: Συμπίεση δεδομένων για σύγχρονους προγραμματιστές").

Κωδικοποίηση βίντεο με χρήση VLC

Ας πούμε ότι έχουμε μια ροή χαρακτήρων: a, e, r и t. Η πιθανότητα (που κυμαίνεται από 0 έως 1) για το πόσο συχνά κάθε χαρακτήρας εμφανίζεται σε μια ροή παρουσιάζεται σε αυτόν τον πίνακα.

a e r t
Πιθανότητα 0,3 0,3 0,2 0,2

Μπορούμε να αντιστοιχίσουμε μοναδικούς δυαδικούς κωδικούς (κατά προτίμηση μικρούς) στους πιο πιθανούς και μεγαλύτερους κωδικούς στους λιγότερο πιθανούς.

a e r t
Πιθανότητα 0,3 0,3 0,2 0,2
Δυάδικος κώδικας 0 10 110 1110

Συμπιέζουμε τη ροή, υποθέτοντας ότι θα καταλήξουμε να ξοδέψουμε 8 bit για κάθε χαρακτήρα. Χωρίς συμπίεση, θα χρειάζονταν 24 bit ανά χαρακτήρα. Εάν αντικαταστήσετε κάθε χαρακτήρα με τον κωδικό του, κερδίζετε οικονομία!

Το πρώτο βήμα είναι να κωδικοποιήσετε τον χαρακτήρα e, που ισούται με 10, και ο δεύτερος χαρακτήρας είναι a, το οποίο προστίθεται (όχι με μαθηματικό τρόπο): [10][0], και τέλος ο τρίτος χαρακτήρας t, που κάνει την τελική συμπιεσμένη ροή bit ίση με [10][0][1110] ή 1001110, το οποίο απαιτεί μόνο 7 bit (3,4 φορές λιγότερο χώρο από το πρωτότυπο).

Λάβετε υπόψη ότι κάθε κωδικός πρέπει να είναι ένας μοναδικός κωδικός με πρόθεμα. Αλγόριθμος Huffman θα σας βοηθήσει να βρείτε αυτούς τους αριθμούς. Αν και αυτή η μέθοδος δεν είναι χωρίς ελαττώματα, υπάρχουν κωδικοποιητές βίντεο που εξακολουθούν να προσφέρουν αυτήν την αλγοριθμική μέθοδο για συμπίεση.

Τόσο ο κωδικοποιητής όσο και ο αποκωδικοποιητής πρέπει να έχουν πρόσβαση σε έναν πίνακα συμβόλων με τους δυαδικούς κωδικούς τους. Επομένως, είναι επίσης απαραίτητο να στείλετε έναν πίνακα ως είσοδο.

Αριθμητική κωδικοποίηση

Ας πούμε ότι έχουμε μια ροή χαρακτήρων: a, e, r, s и t, και η πιθανότητα τους παρουσιάζεται σε αυτόν τον πίνακα.

a e r s t
Πιθανότητα 0,3 0,3 0,15 0,05 0,2

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

Πώς λειτουργεί ένας κωδικοποιητής βίντεο; Μέρος 2. Τι, γιατί, πώς

Τώρα ας κωδικοποιήσουμε μια ροή τριών χαρακτήρων: τρώνε.

Πρώτα επιλέξτε τον πρώτο χαρακτήρα e, το οποίο βρίσκεται στην υποπεριοχή από 0,3 έως 0,6 (δεν συμπεριλαμβάνεται). Παίρνουμε αυτό το υποεύρος και το διαιρούμε ξανά στις ίδιες αναλογίες όπως πριν, αλλά για αυτό το νέο εύρος.

Πώς λειτουργεί ένας κωδικοποιητής βίντεο; Μέρος 2. Τι, γιατί, πώς

Ας συνεχίσουμε να κωδικοποιούμε τη ροή μας τρώνε. Τώρα πάρτε τον δεύτερο χαρακτήρα a, το οποίο βρίσκεται στο νέο υποεύρος από 0,3 έως 0,39 και, στη συνέχεια, πάρτε τον τελευταίο μας χαρακτήρα t και επαναλαμβάνοντας ξανά την ίδια διαδικασία, παίρνουμε το τελικό υποεύρος από 0,354 έως 0,372.

Πώς λειτουργεί ένας κωδικοποιητής βίντεο; Μέρος 2. Τι, γιατί, πώς

Απλώς πρέπει να επιλέξουμε έναν αριθμό στο τελευταίο υποεύρος από 0,354 έως 0,372. Ας επιλέξουμε 0,36 (αλλά μπορείτε να επιλέξετε οποιονδήποτε άλλο αριθμό σε αυτό το υποεύρος). Μόνο με αυτόν τον αριθμό θα μπορέσουμε να επαναφέρουμε την αρχική μας ροή. Είναι σαν να σχεδιάζαμε μια γραμμή μέσα στα εύρη για να κωδικοποιήσουμε τη ροή μας.

Πώς λειτουργεί ένας κωδικοποιητής βίντεο; Μέρος 2. Τι, γιατί, πώς

Η αντίστροφη λειτουργία (δηλαδή, αποκρυπτογράφηση) είναι εξίσου απλό: με τον αριθμό μας 0,36 και το αρχικό μας εύρος, μπορούμε να εκτελέσουμε την ίδια διαδικασία. Αλλά τώρα, χρησιμοποιώντας αυτόν τον αριθμό, προσδιορίζουμε τη ροή που κωδικοποιείται χρησιμοποιώντας αυτόν τον αριθμό.

Με το πρώτο εύρος, παρατηρούμε ότι ο αριθμός μας αντιστοιχεί στο slice, επομένως αυτός είναι ο πρώτος μας χαρακτήρας. Τώρα διαιρούμε ξανά αυτό το υπο-εύρος ακολουθώντας την ίδια διαδικασία όπως πριν. Εδώ μπορείτε να δείτε ότι το 0,36 αντιστοιχεί στο σύμβολο a, και αφού επαναλάβουμε τη διαδικασία φτάσαμε στον τελευταίο χαρακτήρα t (σχηματίζοντας την αρχική μας κωδικοποιημένη ροή τρώνε).

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

Αρκετά κομψό, έτσι δεν είναι; Όποιος βρήκε αυτή τη λύση ήταν έξυπνος. Ορισμένοι κωδικοποιητές βίντεο χρησιμοποιούν αυτήν την τεχνική (ή τουλάχιστον την προσφέρουν ως επιλογή).

Η ιδέα είναι να συμπιέσουμε χωρίς απώλειες ένα κβαντισμένο ρεύμα bit. Σίγουρα από αυτό το άρθρο λείπουν πολλές λεπτομέρειες, λόγοι, συμβιβασμούς κ.λπ. Αλλά αν είστε προγραμματιστής, θα πρέπει να γνωρίζετε περισσότερα. Οι νέοι κωδικοποιητές προσπαθούν να χρησιμοποιήσουν διαφορετικούς αλγόριθμους κωδικοποίησης εντροπίας όπως π.χ ANS.

Βήμα 6 - μορφή bitstream

Αφού κάνετε όλα αυτά, το μόνο που μένει είναι να αποσυσκευάσετε τα συμπιεσμένα πλαίσια στο πλαίσιο των βημάτων που εκτελούνται. Ο αποκωδικοποιητής πρέπει να ενημερώνεται ρητά για τις αποφάσεις που λαμβάνονται από τον κωδικοποιητή. Ο αποκωδικοποιητής πρέπει να διαθέτει όλες τις απαραίτητες πληροφορίες: βάθος bit, χρωματικός χώρος, ανάλυση, πληροφορίες πρόβλεψης (διανύσματα κίνησης, πρόβλεψη κατευθυντικής INTER), προφίλ, επίπεδο, ρυθμός καρέ, τύπος καρέ, αριθμός καρέ και πολλά άλλα.

Θα ρίξουμε μια γρήγορη ματιά στο bitstream H.264. Το πρώτο μας βήμα είναι να δημιουργήσουμε μια ελάχιστη ροή bit H.264 (Το FFmpeg από προεπιλογή προσθέτει όλες τις επιλογές κωδικοποίησης όπως π.χ. SEI NAL — θα μάθουμε τι είναι λίγο παρακάτω). Μπορούμε να το κάνουμε αυτό χρησιμοποιώντας το δικό μας αποθετήριο και το FFmpeg.

./s/ffmpeg -i /files/i/minimal.png -pix_fmt yuv420p /files/v/minimal_yuv420.h264

Αυτή η εντολή θα δημιουργήσει μια ακατέργαστη ροή bit H.264 με ένα πλαίσιο ανάλυσης 64×64, με χρωματικό χώρο YUV420. Σε αυτήν την περίπτωση, η παρακάτω εικόνα χρησιμοποιείται ως πλαίσιο.

Πώς λειτουργεί ένας κωδικοποιητής βίντεο; Μέρος 2. Τι, γιατί, πώς

H.264 bitstream

Πρότυπο AVC (H.264) καθορίζει ότι οι πληροφορίες θα αποστέλλονται σε μακροπλαίσια (με την έννοια του δικτύου), που ονομάζονται ΝΑΛ (αυτό είναι ένα επίπεδο αφαίρεσης δικτύου). Ο κύριος στόχος του NAL είναι να παρέχει μια "φιλική στον ιστό" παρουσίαση βίντεο. Αυτό το πρότυπο θα πρέπει να λειτουργεί σε τηλεοράσεις (με ροή), στο Διαδίκτυο (βασισμένο σε πακέτα).

Πώς λειτουργεί ένας κωδικοποιητής βίντεο; Μέρος 2. Τι, γιατί, πώς

Υπάρχει ένας δείκτης συγχρονισμού για τον καθορισμό των ορίων των στοιχείων NAL. Κάθε διακριτικό συγχρονισμού περιέχει μια τιμή 0x00 0x00 0x01, εκτός από την πρώτη κιόλας, η οποία ισούται με 0x00 0x00 0x00 0x01. Αν εκτοξεύσουμε hexdump για τη ροή bit H.264 που δημιουργήθηκε, προσδιορίζουμε τουλάχιστον τρία μοτίβα NAL στην αρχή του αρχείου.

Πώς λειτουργεί ένας κωδικοποιητής βίντεο; Μέρος 2. Τι, γιατί, πώς

Όπως αναφέρθηκε, ο αποκωδικοποιητής πρέπει να γνωρίζει όχι μόνο τα δεδομένα εικόνας, αλλά και τις λεπτομέρειες του βίντεο, το πλαίσιο, τα χρώματα, τις παραμέτρους που χρησιμοποιούνται και πολλά άλλα. Το πρώτο byte κάθε NAL ορίζει την κατηγορία και τον τύπο του.

Αναγνωριστικό τύπου NAL Περιγραφή
0 Άγνωστος τύπος
1 Κωδικοποιημένο θραύσμα εικόνας χωρίς IDR
2 Κωδικοποιημένη ενότητα δεδομένων φέτας A
3 Κωδικοποιημένη ενότητα δεδομένων φέτας B
4 Κωδικοποιημένη ενότητα δεδομένων φέτας C
5 Κωδικοποιημένο θραύσμα IDR μιας εικόνας IDR
6 Περισσότερες πληροφορίες για την επέκταση SEI
7 Σύνολο παραμέτρων ακολουθίας SPS
8 Σύνολο παραμέτρων εικόνας PPS
9 Διαχωριστής πρόσβασης
10 Τέλος ακολουθίας
11 Τέλος του νήματος
... ...

Συνήθως το πρώτο NAL ενός bitstream είναι PLC. Αυτός ο τύπος NAL είναι υπεύθυνος για την ενημέρωση σχετικά με κοινές μεταβλητές κωδικοποίησης όπως προφίλ, επίπεδο, ανάλυση κ.λπ.

Εάν παραλείψουμε τον πρώτο δείκτη συγχρονισμού, μπορούμε να αποκωδικοποιήσουμε το πρώτο byte για να μάθουμε ποιος τύπος NAL είναι πρώτος.

Για παράδειγμα, το πρώτο byte μετά το διακριτικό συγχρονισμού είναι 01100111, όπου το πρώτο κομμάτι (0) βρίσκεται στο πεδίο forbidden_zero_bit. Επόμενα 2 bit (11) μας λέει το πεδίο nal_ref_idc, που υποδεικνύει εάν αυτό το NAL είναι πεδίο αναφοράς ή όχι. Και τα υπόλοιπα 5 bit (00111) μας λέει το πεδίο nal_unit_type, σε αυτήν την περίπτωση είναι το μπλοκ SPS (7) NAL.

Δεύτερο byte (δυαδικό=01100100, εξάγωνο=0x64, Δεκέμβριος=100) στο SPS NAL είναι το πεδίο profile_idc, που δείχνει το προφίλ που χρησιμοποίησε ο κωδικοποιητής. Σε αυτή την περίπτωση, χρησιμοποιήθηκε ένα περιορισμένο υψηλό προφίλ (δηλαδή, ένα υψηλό προφίλ χωρίς αμφίδρομη υποστήριξη τμήματος Β).

Πώς λειτουργεί ένας κωδικοποιητής βίντεο; Μέρος 2. Τι, γιατί, πώς

Αν κοιτάξετε την προδιαγραφή bitstream H.264 για το SPS NAL, θα βρούμε πολλές τιμές για το όνομα, την κατηγορία και την περιγραφή της παραμέτρου. Για παράδειγμα, ας δούμε τα πεδία pic_width_in_mbs_minus_1 и pic_height_in_map_units_minus_1.

Όνομα παραμέτρου Κατηγορία Περιγραφή
pic_width_in_mbs_minus_1 0 ue(v)
pic_height_in_map_units_minus_1 0 ue(v)

Εάν εκτελέσουμε κάποιες μαθηματικές πράξεις με τις τιμές αυτών των πεδίων, θα λάβουμε ανάλυση. Κάποιος μπορεί να αναπαραστήσει 1920 x 1080 χρησιμοποιώντας pic_width_in_mbs_minus_1 με τιμή 119 ((119 + 1) * macroblock_size = 120 * 16 = 1920). Και πάλι, για να εξοικονομήσουμε χώρο, αντί να κωδικοποιήσουμε το 1920, το κάναμε με το 119.

Εάν συνεχίσουμε να ελέγχουμε το βίντεο που δημιουργήσαμε σε δυαδική μορφή (για παράδειγμα: xxd -b -c 11 v/minimal_yuv420.h264), τότε μπορείτε να μεταβείτε στο τελευταίο NAL, που είναι το ίδιο το πλαίσιο.

Πώς λειτουργεί ένας κωδικοποιητής βίντεο; Μέρος 2. Τι, γιατί, πώς

Εδώ βλέπουμε τις πρώτες 6 τιμές του byte: 01100101 10001000 10000100 00000000 00100001 11111111. Δεδομένου ότι το πρώτο byte είναι γνωστό ότι υποδεικνύει τον τύπο NAL, σε αυτήν την περίπτωση (00101) είναι ένα τμήμα IDR (5) και, στη συνέχεια, μπορείτε να το εξερευνήσετε περαιτέρω:

Πώς λειτουργεί ένας κωδικοποιητής βίντεο; Μέρος 2. Τι, γιατί, πώς

Χρησιμοποιώντας τις πληροφορίες προδιαγραφών, θα είναι δυνατή η αποκωδικοποίηση του τύπου θραύσματος (slice_type) και αριθμός πλαισίου (πλαισίου_αριθμός) μεταξύ άλλων σημαντικών τομέων.

Για να λάβετε τις τιμές ορισμένων πεδίων (ue(v), me(v), se(v) ή te(v)), πρέπει να αποκωδικοποιήσουμε το θραύσμα χρησιμοποιώντας έναν ειδικό αποκωδικοποιητή με βάση εκθετικός κώδικας Golomb. Αυτή η μέθοδος είναι πολύ αποτελεσματική για την κωδικοποίηση τιμών μεταβλητών, ειδικά όταν υπάρχουν πολλές προεπιλεγμένες τιμές.

Σημασίες slice_type и πλαισίου_αριθμός αυτού του βίντεο είναι 7 (θραύσμα I) και 0 (πρώτο καρέ).

Ένα bitstream μπορεί να θεωρηθεί ως πρωτόκολλο. Εάν θέλετε να μάθετε περισσότερα για το bitstream, θα πρέπει να ανατρέξετε στις προδιαγραφές ITU H.264. Εδώ είναι ένα μακροδιάγραμμα που δείχνει πού βρίσκονται τα δεδομένα εικόνας (YUV σε συμπιεσμένη μορφή).

Πώς λειτουργεί ένας κωδικοποιητής βίντεο; Μέρος 2. Τι, γιατί, πώς

Μπορούν να εξεταστούν και άλλα bitstreams, όπως π.χ VP9, H.265 (HEVC) ή ακόμα και το νέο μας καλύτερο bitstream AV1. Είναι όλα παρόμοια; Όχι, αλλά μόλις καταλάβετε τουλάχιστον ένα, είναι πολύ πιο εύκολο να κατανοήσετε τα υπόλοιπα.

Θέλετε να εξασκηθείτε; Εξερευνήστε τη ροή bit H.264

Μπορείτε να δημιουργήσετε ένα βίντεο ενός καρέ και να χρησιμοποιήσετε το MediaInfo για να εξετάσετε τη ροή bit H.264. Στην πραγματικότητα, τίποτα δεν σας εμποδίζει να κοιτάξετε ακόμη και τον πηγαίο κώδικα που αναλύει τη ροή bit H.264 (AVC).

Πώς λειτουργεί ένας κωδικοποιητής βίντεο; Μέρος 2. Τι, γιατί, πώς

Για εξάσκηση, μπορείτε να χρησιμοποιήσετε το Intel Video Pro Analyzer (είπα ήδη ότι το πρόγραμμα είναι πληρωμένο, αλλά υπάρχει δωρεάν δοκιμαστική έκδοση με όριο 10 καρέ;).

Πώς λειτουργεί ένας κωδικοποιητής βίντεο; Μέρος 2. Τι, γιατί, πώς

Αναθεώρηση

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

Πώς λειτουργεί ένας κωδικοποιητής βίντεο; Μέρος 2. Τι, γιατί, πώς

Προηγουμένως, υπολογίστηκε ότι θα απαιτούνταν 139 GB χώρου στο δίσκο για την αποθήκευση ενός αρχείου βίντεο διάρκειας μίας ώρας σε ποιότητα 720p και 30 fps. Εάν χρησιμοποιήσετε τις μεθόδους που αναφέρονται σε αυτό το άρθρο (ενδιάμεσες και εσωτερικές προβλέψεις, μετασχηματισμός, κβαντοποίηση, κωδικοποίηση εντροπίας κ.λπ.), τότε μπορείτε να επιτύχετε (με βάση το γεγονός ότι ξοδεύουμε 0,031 bit ανά pixel), ένα βίντεο αρκετά ικανοποιητική ποιότητα, καταλαμβάνοντας μόνο 367,82 MB, όχι 139 GB μνήμης.

Πώς επιτυγχάνει το H.265 καλύτερο λόγο συμπίεσης από το H.264;

Τώρα που γνωρίζουμε περισσότερα για το πώς λειτουργούν οι κωδικοποιητές, είναι πιο εύκολο να κατανοήσουμε πώς οι νεότεροι κωδικοποιητές μπορούν να προσφέρουν υψηλότερες αναλύσεις με λιγότερα bit.

Αν συγκρίνουμε AVC и HEVC, αξίζει να θυμόμαστε ότι αυτή είναι σχεδόν πάντα μια επιλογή μεταξύ μεγαλύτερου φορτίου CPU και αναλογίας συμπίεσης.

HEVC έχει περισσότερες επιλογές ενότητας (και υποενότητας) από AVC, περισσότερες εσωτερικές οδηγίες πρόβλεψης, βελτιωμένη κωδικοποίηση εντροπίας και πολλά άλλα. Όλες αυτές οι βελτιώσεις έχουν γίνει H.265 ικανό να συμπιέζει 50% περισσότερο από H.264.

Πώς λειτουργεί ένας κωδικοποιητής βίντεο; Μέρος 2. Τι, γιατί, πώς

Το πρώτο μέρος: Βασικά στοιχεία εργασίας με βίντεο και εικόνες

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο