To 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. Όλοι οι 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 που συνήθως τους χαρακτηρίζει, έχουν κι αυτοί την χρησιμότητά τους.
Και τώρα ήρθε η στιγμή να φτιάξουμε και εμείς ένα δικό μας player. Αυτό θα γίνει με τη C++. (VC++ 2008). Απαιτούνται οι εξής βιβλιοθήκες:
dshow.h, καθώς και winmm.lib, msvcrt.lib, strmiids.lib.
Επίσης χρειαζόμαστε και ένα video. Ας πάρουμε ένα έτοιμο από εδώ http://hubblesource.stsci.edu/sources/video/clips/details/images/centaur_2.mpg (10 mb - MPEG-2).
Ξεκινάμε γράφοντας τις πρώτες γραμμές στο VC ++ 2008.
#include <dshow.h>
Όταν ανοίγουμε οποιοδήποτε αρχείο 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. Όλοι οι 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 που συνήθως τους χαρακτηρίζει, έχουν κι αυτοί την χρησιμότητά τους.
Και τώρα ήρθε η στιγμή να φτιάξουμε και εμείς ένα δικό μας player. Αυτό θα γίνει με τη C++. (VC++ 2008). Απαιτούνται οι εξής βιβλιοθήκες:
dshow.h, καθώς και winmm.lib, msvcrt.lib, strmiids.lib.
Επίσης χρειαζόμαστε και ένα video. Ας πάρουμε ένα έτοιμο από εδώ http://hubblesource.stsci.edu/sources/video/clips/details/images/centaur_2.mpg (10 mb - MPEG-2).
Ξεκινάμε γράφοντας τις πρώτες γραμμές στο VC ++ 2008.
#include <dshow.h>
#pragma comment(lib, "winmm.lib")
#pragma comment(lib, "msvcrt.lib")
#pragma comment(lib, "strmiids.lib")
To δευτερο βημα ειναι να αρχικοποισουμε την COM libary μας αυτο γινεται ετσι.
HRESULT hr = CoInitialize(NULL);
if (FAILED(hr))
{
printf("ERROR - Could not initialize COM library");
return;
}
Το τριτο βημα ειναι η κατασκευή ενός, αρχικά κενού, γραφήματος (graph) που θα περιγράφει το μονοπάτι της αναπαραγωγής.
hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **)&pGraph);
ιf (FAILED(hr))
{
printf("ERROR - Could not create the Filter Graph Manager.");
return;
}
Το τεταρτο και τελευταιο βημα ειναι να κατασκευασουμε το γραφο μας ως εξεις.
hr = pGraph->RenderFile(L"C:\\http://hubblesource.stsci.edu/sources/video/clips/details/images/centaur_2.mpg", NULL);
Και τορα απλα αναπαραγωγη και ελενχος αν πιγε κατι στραβα.
if (SUCCEEDED(hr))
{
hr = pControl->Run();
if (SUCCEEDED(hr))
{
long evCode;
pEvent->WaitForCompletion(INFINITE, &evCode);
}
}
Και αυτα για σημερα ετσι αναπαραγεις με το DirectShow ενα video. Την επομενη φορα τηα βαλουμε και καποια controls. Πριν απο αυτο ομος θα δουμε τον κοδικα μας ολοκληρομενα.
#include <dshow.h>
#pragma comment(lib, "winmm.lib")
#pragma comment(lib, "msvcrt.lib")
#pragma comment(lib, "strmiids.lib")
void main(void)
{
ΙGraphBuilder *pGraph = NULL;
IMediaControl *pControl = NULL;
IMediaEvent *pEvent = NULL;
HRESULT hr = CoInitialize(NULL);
if (FAILED(hr))
{
printf("ERROR - Could not initialize COM library");
return;
}
hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **)&pGraph);
if (FAILED(hr))
{
printf("ERROR - Could not create the Filter Graph Manager.");
return;
}
hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);
hr = pGraph->RenderFile(L"http://hubblesource.stsci.edu/sources/video/clips/details/images/centaur_2.mpg", NULL);
if (SUCCEEDED(hr))
{
hr = pControl->Run();
if (SUCCEEDED(hr))
{
long evCode;
pEvent->WaitForCompletion(INFINITE, &evCode);
}
}
pControl->Release();
pEvent->Release();
pGraph->Release();
CoUninitialize();
}
πηγη
http://en.wikipedia.org/wiki/DirectShow (20.03.2010 01:43)
Δεν υπάρχουν σχόλια:
Δημοσίευση σχολίου