Video και Audio

DirectShow και βασικές έννοιες video

10/11/2010 12:24 πμ | parsifal από parsifal


DirectShow και βασικές έννοιες video

 

__TOC__

 

 

 

Εισαγωγή

Στο παρόν άρθρο θα γίνει μία σύντομη εισαγωγή στον τρόπο που τα Microsoft Windows χειρίζονται την αναπαραγωγή αρχείων multimedia. Πριν από αυτό, θα προηγηθεί ένα μικρό γλωσσάρι με μερικές βασικές έννοιες που έχουν να κάνουν με το ψηφιακό video.

 

 

 

Μερικές βασικές έννοιες

Πολλοί χρήστες συγχέουν και ταυτίζουν κάποιες έννοιες στον κόσμο του ψηφιακού video και των multimedia αρχείων όπως stream, codec, container κλπ . Άλλες έννοιες δεν τις έχουν καν ακουστά ή δε γνωρίζουν τί σημαίνουν ακριβώς. Ας δούμε λίγο συνοπτικά μερικές από αυτές :

  • Stream : Μία ακολουθία ψηφιακών δεδομένων που αποτελεί και μία ξεχωριστή, σημασιολογικά, ομάδα πληροφορίας. Ένα ψηφιακό αρχείο πολυμέσων για παράδειγμα, περιέχει μία ομάδα δεδομένων για την κινούμενη εικόνα (το κατεξοχην video δηλαδή) και μία ομάδα δεδομένων για τον ήχο που ακούμε. Σε ορισμένα formats μπορούμε να έχουμε και επιπλέον streams όπως ένα stream υποτίτλων (σε μορφή bitmap εικόνων ή σε μορφή κειμένου). Άλλες πληροφορίες που απαιτούν μικρό σχετικά χώρο αποθήκευσης για να αναπαρασταθούν (όπως τίτλος, όνομα δημιουργού, κεφάλαια/chapters αν πρόκειται για ταινία, λόγος πλευρών ή aspect ratio που καθορίζει αυτόματο resize του video κατά τον κάθετο άξονα ως προς έναν λόγο σε σχέση με τα pixels του οριζόντιου άξονα κ.ά.) δεν είναι σκόπιμο να έχουν τη μορφή stream, αλλά μπορούν να αποθηκευθούν σε προκαθορισμένες κατά σύμβαση θέσεις μέσα στο αρχείο, ως μεταδεδομένα (metadata). Τα streams μπορούν να συνδυαστούν κατάλληλα σε ένα μοναδικό αρχείο με τη διαδικασία του multiplexing ή muxing (πολύπλεξη/πολυπλεξία)
  • Multiplexing/Muxing/Mux : Το κάθε format καθορίζει τον τρόπο με τον οποίον μπορούν και πρέπει να συνδυάζονται τα διαφορετικά streams για τη δημιουργία ενός αρχείου του συγκεκριμένου format. Συνήθως τα streams δεν τοποθετούνται χωροταξικά το ένα μετά το άλλο μέσα στο αρχείο με τυχαία σειρά, αλλά με interleaving. Δηλαδή με πολύ απλά λόγια, λίγο (πόσο λίγο; Όσα bytes προβλέπει το format) από το 1ο stream, μετά λίγο από το 2ο...κ.ο.κ. Στη συνέχεια, λίγο από το υπόλοιπο του 1ου stream, λίγο από το υπόλοιπο του 2ου...κ.ο.κ. Αυτό γίνεται για λόγους που έχουν να κάνουν κυρίως με τις απαιτήσεις που έχει η αναπαραγωγή σε πραγματικό χρόνο. Σκεφτείτε τί γίνεται όταν αναπαράγουμε μία ταινία από έναν σκληρό δίσκο. Θα πρέπει για κάθε δευτερόλεπτο ταινίας να προλαβαίνει ο δίσκος να διαβάζει και το τμήμα του video stream που αντιστοιχεί στο συγκεκριμένο δευτερόλεπτο, και το τμήμα του audio stream που αντιστοιχεί στο συγκεκριμένο δευτερόλεπτο, και το τμήμα του subtitle stream που αντιστοιχεί στο συγκεκριμένο δευτερόλεπτο. Αν τα streams ήταν τοποθετημένα το ένα μετά το άλλο μέσα στο αρχείο, η κεφαλή ανάγνωσης θα έπρεπε να κάνει πολλαπλές κινήσεις πέρα-δώθε για να προλάβει, κάτι που πέραν της καταπόνησης, παλαιότερα δημιουργούσε και θέμα επαρκούς ή όχι ταχύτητας. Το φαινόμενο θα ήταν ακόμη πιο έντονο σε έναν οδηγό οπτικών δίσκων CD/DVD. Επίσης, σε πηγές που η πληροφορία μας έρχεται με σειριακό τρόπο (οδηγοί μαγνητικών ταινιών όπως σε κάμερες DV, Internet multimedia streaming), μία τέτοια οργάνωση θα έκανε αδύνατη την αναπαραγωγή
  • Demultiplexing/Demuxing/Demux : Η αντίστροφη διαδικασία από την προηγούμενη. Μας επιτρέπει δηλαδή να διαχωρίσουμε (και να πάρουμε πιθανόν σε ξεχωριστά αρχεία) το κάθε διακριτό stream που περιέχεται σε ένα αρχείο πολυμέσων
  • Codec/CODEC (COmpressor/DECompressor) : Είναι το πρόγραμμα που μπορεί να κωδικοποιήσει μία αρχική ακολουθία ακωδικοποίητων (raw) δεδομένων σε ένα stream. Για παράδειγμα, ο XviD codec παίρνει ως είσοδο ένα raw video stream και παράγει ένα νέο video stream, κωδικοποιημένο με μία υλοποίηση του αλγορίθμου MPEG-4. Αυτό είναι ένα XviD video stream, το οποίο με τη σειρά του μπορεί να αποκωδικοποιηθεί είτε από τον ίδιο XviD codec είτε από άλλους MPEG-4 συμβατούς codecs. Ένας codec (έστω Α) μπορεί κάλλιστα να κωδικοποιήσει και ένα ήδη κωδικοποιημένο stream (έστω Β). Αυτό που γίνεται στην πραγματικότητα είναι ότι το Β αποκωδικοποιείται πρώτα από τον κατάλληλο codec Β' στο αντίστοιχο raw stream B'' και στον A «σερβίρεται» το B''. Για παράδειγμα, αυτό συμβαίνει όταν δίνουμε ένα αρχείο AVI σε ένα πρόγραμμα για να πάρουμε ως έξοδο ένα DVD
  • Μη απωλεστικοί (lossless) codecs : Οι codecs που μπορούν να κωδικοποιήσουν μία αρχική ακολουθία δεδομένων σε ένα νέο stream, χωρίς απώλεια πληροφορίας. Δηλαδή, κατά την αποκωδικοποίηση του stream, η ακολουθία δεδομένων που προκύπτει είναι bit προς bit ακριβώς η ίδια με την αρχική
  • Απωλεστικοί (lossy) codecs : Οι codecs που για να πετύχουν έναν ορισμένο λόγο συμπίεσης κατά την κωδικοποίηση, «πετούν» κάποιο ποσό πληροφορίας. Επομένως, το αποτέλεσμα της αποκωδικοποίησης του stream είναι διαφορετικό από την αρχική ακολουθία δεδομένων. Σε μερικές υλοποιήσεις, το ανθρώπινο αισθητήριο (όραση/ακοή) δε μπορεί να διακρίνει διαφορές, οπότε κάνουμε λόγο για διαφανή (transparent) κωδικοποίηση. Κατά κανόνα όμως, κάθε διαδοχική κωδικοποίηση με έναν απωλεστικό codec οδηγεί σε συνεχή πτώση (degradation) της φαινόμενης ποιότητας, γι' αυτό είναι προτιμότερο να χρησιμοποιούμε όποτε είναι δυνατόν υλικό στην αρχική του μορφή και να αποφεύγουμε διαδικασίες επανακωδικοποίησης. Π.χ. γιατί να μετατρέπουμε ένα AVI σε DVD, όταν μπορούμε να το αποφύγουμε αναβαθμίζοντας σε ένα DVD player συμβατό με αυτά τα AVI; Το φαινόμενο του degradation μπορεί να παρομοιαστεί με την απώλεια ποιότητας (κάποιοι θα το θυμούνται αυτό) από τη διαδοχική αντιγραφή κασσετών ήχου, όπου το κάθε αντίγραφο χρησιμοποιείτο ως βάση για την παραγωγή του επομένου. Ακόμη πιο απλό παράδειγμα : το παιχνίδι «Σπασμένο Τηλέφωνο» που παίζαμε μικροί!
  • Container/Format : Μία προδιαγραφή που καθορίζει τί είδους και πόσα streams μπορούν να περιέχονται σε ένα αρχείο του συγκεκριμένου format και με ποιον τρόπο μπορούν να πολυπλεχθούν αυτά μέσα στο αρχείο. Δεν προσφέρουν όλα τα containers την ίδια ευελιξία. Για παράδειγμα, το MPG container δεν επιτρέπει την ύπαρξη πολλαπλών XviD video stream μέσα στο αρχείο, αλλά μόνο ένα MPEG-1 ή μόνο ένα MPEG-2 video stream. Το AVI format επιτρέπει μέχρι ένα video stream που μπορεί να είναι είτε XviD είτε DivX είτε ένα κάποιο από μία τεράστια ποικιλία διαφορετικών επιτρεπόμενων video streams. Το MKV (Matroska) format από την άλλη, επιτρέπει πολλαπλά video, audio, subtitle streams μέσα στο ίδιο αρχείο

 

 

 

DirectShow

Τί είναι;

Είναι μία τεχνολογία που εισήγαγε η Microsoft για να δώσει στους software developers έναν standard τρόπο χειρισμού και αναπαραγωγής multimedia αρχείων στα λειτουργικά της συστήματα. Ο τελικός χρήστης φυσικά δεν βλέπει την εσωτερική λειτουργία του DirectShow, αλλά για όσους ενδιαφέρονται, ακολουθεί μία ματιά «κάτω από το καπώ».

 

 

Πώς λειτουργεί;

Όταν ανοίγουμε οποιοδήποτε αρχείο multimedia με έναν οποιονδήποτε software player (ή άλλη εφαρμογή όπως π.χ. το δημοφιλές Subtitle Workshop) που βασίζεται στο DirectShow για να λειτουργήσει, συμβαίνουν επιγραμματικά τα εξής:

  • Κατασκευή ενός, αρχικά κενού, γραφήματος (graph) που θα περιγράφει το μονοπάτι της αναπαραγωγής
  • Αναζήτηση στο Μητρώο/Registry του συστήματος για ένα φίλτρο source, που να μπορεί να διαβάσει (parsing) το συγκεκριμένο container (AVI, MPG, MKV, MP4 κλπ). Προσθήκη του φίλτρου στο γράφημα
  • Αναζήτηση για ένα φίλτρο splitter που να μπορεί να δεχτεί την έξοδο του source φίλτρου και να διαχωρίσει το αρχείο στα διάφορα streams που βρίσκονται πολυπλεγμένα (multiplexed) μέσα σε αυτό. Ο splitter θα εφαρμόσει δηλαδή το απαραίτητο demultiplexing όταν ξεκινήσει η αναπαραγωγή. Προσθήκη του στο γράφημα και σύνδεσή του με την έξοδο του φίλτρου source
  • Για κάθε διαφορετικό stream που δίνει στην έξοδό του το φίλτρο splitter, γίνεται αναζήτηση για ένα φίλτρο decoder που μπορεί να αποκωδικοποίησει την πληροφορία του stream. Προσθήκη τους στο γράφημα και σύνδεση στις αντίστοιχες εξόδους του splitter
  • Για κάθε αποκωδικοποιημένη έξοδο των διάφορων decoders, γίνεται αναζήτηση για ένα φίλτρο renderer που αναλαμβάνει να οδηγήσει την έξοδο στην κατάλληλη συσκευή αναπαραγωγής (για την ακρίβεια, στον driver της συσκευής ή στο τμήμα του DirectX που μεσολαβεί πριν από τον driver). Π.χ. το αποκωδικοποιημένο (raw) video είναι έτοιμο να οδηγηθεί στην κάρτα γραφικών, ο αποκωδικοποιημένος (raw) ήχος στην κάρτα/onboard chip ήχου κ.ο.κ. Προσθήκη των renderers στο γράφημα και σύνδεσή τους στις εξόδους των decoders

 

Γενικά, στο σύστημά μας μπορεί να υπάρχουν περισσότερα από ένα DirectShow φίλτρα που είναι ικανά να κάνουν ακριβώς την ίδια δουλειά. Π.χ. για ένα AVI container μπορεί να έχουμε τον default splitter των Windows και κάποιον άλλον splitter γενικής χρήσης που δέχεται AVI. Η απόφαση για το ποιο από τα δύο φίλτρα θα συνδεθεί στο γράφημα γίνεται βάσει ενός συστήματος προτεραιοτήτων που αποθηκεύεται στη Registry. Η προτεραιότητα του κάθε φίλτρου ονομάζεται merit.

 

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

 

010.png

 

Όταν ανοίγουμε ένα αρχείο multimedia στην DirectShow-based εφαρμογή μας, αυτή «ζητά» από το DirectShow να «χτίσει» ένα γράφημα για το συγκεκριμένο αρχείο, ώστε να της υποδείξει τις κατάλληλες συνδέσεις και ενέργειες που περιγράφονται από το μονοπάτι αναπαραγωγής στο γράφημα.

 

 

Όλοι οι players και οι εφαρμογές video λειτουργούν έτσι;

Η απάντηση είναι «Όχι». Το DirectShow διευκολύνει από αρκετές απόψεις τα πράγματα για τους video application developers, αλλά υπάρχουν και εφαρμογές που δεν το χρησιμοποιούν. Δύο πολύ γνωστές είναι οι video players VLC και MPlayer for Windows. Είναι αναμενόμενο κι όλας, από τη στιγμή που οι προαναφερθέντες players είναι cross-platform εφαρμογές και στο Linux ή στο Mac OS δεν υπάρχει το DirectShow. Τέτοιοι players λοιπόν αναλαμβάνουν εξ ολοκλήρου την όλη διαδικασία της αναπαραγωγής χωρίς εξωτερική βοήθεια. Με λίγα λόγια, δεν εξαρτώνται καθόλου από την ύπαρξη codec και filters για την υποστήριξη των διαφόρων formats και streams. Ο απαραίτητος κώδικας για την επιτυχή αναπαραγωγή αυτών παρέχεται από τον ίδιο τον player. Αυτός είναι και ο λόγος που όσο φορτωμένο και να είναι ένα σύστημα με codecs, codec packs κλπ. και όσα προβλήματα και να έχουν δημιουργήσει στην επιτυχή αναπαραγωγή ορισμένων video files από άλλους, DirectShow-based players, οι αυτόνομοι players όπως ο VLC δε θα πρέπει να έχουν προβλήματα στο να αναπαράγουν τα συγκεκριμένα αρχεία. Από αυτήν την άποψη, παρά το μη εκλεπτυσμένο user interface που συνήθως τους χαρακτηρίζει, έχουν κι αυτοί την χρησιμότητά τους.

 

 

 

Μερικά χρήσιμα links

 

 

 

Ιστορικό αλλαγών

  • 20090314 - Αρχική έκδοση. Προέκυψε με μεταφορά των αντίστοιχων τμημάτων από το άρθρο Video playback σε Windows (parsifal)