Captură și procesarea cadru-cu-cadru a semnalului video în mediul înconjurător

Captură și procesarea cadru-cu-cadru a semnalului video în mediul înconjurător

Biblioteca AviCap32.dll

  • capGetDriverDescriptionA [AviCap32.dll]
  • capCreateCaptureWindowA [AviCap32.dll]

Pentru a obține o listă cu dispozitivele acceptate și pentru a repeta driverele de dispozitive disponibile, utilizați metoda capGetDriverDescriptionA. Funcția returnează numele și versiunea driverului de dispozitiv la indexul specificat. Apoi, selectând driverul de dispozitiv corespunzător, trebuie să creați o fereastră în care semnalul va fi capturat de pe dispozitiv. Deoarece o funcție separată obține un singur cadru în AviCap32 nu există, atunci alternativa este de a copia conținutul ferestrei de frecvență dorită creată în obiectul Bitmap. este posibil să se utilizeze funcția de apel invers (funcția de apel invers) pentru a determina când cadrul de disponibilitate, este necesar să se trimită un mesaj la WM_CAP_SET_CALLBACK_FRAME creat fereastra. După crearea ferestrei, este inițializată conexiunea la driverul dispozitivului. Următoarea metodă are această sarcină:







În metoda Conectați în considerare, pot fi evidențiate mai multe puncte cheie:

După terminarea lucrului cu dispozitivul, este necesar să deconectați fereastra de la driver și, de asemenea, să distrugeți fereastra utilizată pentru captură. Pentru a face acest lucru, un mesaj WM_CAP_DRIVER_DISCONNECT este trimis la fereastră. deoarece parametrul indică identificatorul driverului de dispozitiv, deconectarea de la care este solicitată utilizând acest mesaj. Apoi este apelată funcția DestroyWindow.

Cadrul DirectShow

Ultimul pas al inițializării este configurarea ferestrei de captare. În metoda SetPreviewVisible, această fereastră este legată de fereastra părinte pe care va fi afișat semnalul. Dacă doriți, puteți ascunde fereastra.

Acum, ia în considerare metoda, care se bazează pe utilizarea unui filtru special care implementează interfața ISampleGrabber. Lista de dispozitive este obținută în același mod ca și în metoda utilizând fereastra de captare. Pentru a obține un cadru utilizând filtrul SampleGrabber, trebuie să creați un grafic care să includă trei filtre:







Metoda ConnectFilterToFilter conectează contactele de ieșire ale unui filtru la contactele de intrare ale unui alt filtru. Contacte Corelarea trebuie să mențină un parametru a trecut la tipul de informații mass-media, această condiție este verificată folosind metoda PinHasMediaType. Iterațiile Metoda peste contactele ConnectFilterToFilter filtrului sursă pentru metoda de lipire contact de ieșire este realizată cu un receptor filtru ConnectPinToFilter. care repetă peste toate contactele de intrare și stabilește o conexiune între contacte. Să începem inițializarea conexiunii la driverul dispozitivului. Aceasta se face prin următoarea metodă:

Cadrul pentru Fundația Media

Media Foundation, precum și DirectShow, concepute pe baza modelului Component Object (COM) -, prin urmare, necesitatea de a utiliza COM Interop când programarea în C #. Din nou, ca o simplificare a muncii manuale, este posibilă utilizarea bibliotecii finalizate MediaFoundation .Net [5]. Dar este de remarcat faptul că unele dintre metodele și interfețele bibliotecii se află în faza de testare, astfel încât nu sunt incluse în versiunea compilată - astfel încât să finalizeze lucrările necesare pentru a compila codul manual de bibliotecă specificat pavilion ALLOW_UNTESTED_INTERFACES.

Înainte de a începe să utilizați Media Foundation, trebuie să apelați metoda MFStartup pentru a inițializa cadrul și, când ați terminat, utilizați funcția MFShutdown.

Când ați terminat de lucru cu MediaFoundation, trebuie să eliberați toate obiectele COM utilizând apelul metodei Marshal.ReleaseComObject.

Captură și procesarea cadru-cu-cadru a semnalului video în mediul înconjurător

Fig. 1. Rezultatele măsurării productivității metodelor luate în considerare

Au fost selectați doi indicatori drept criterii de performanță: sarcina utilă și timpul mediu de acces la cadru. Valoarea încărcăturii utile, exprimată în unități convenționale, afișează cantitatea maximă de calcul efectuată pe cadrul primit. Graficul arată că AviCap32 poate oferi o sarcină utilă de 2 ori mai mică decât alte metode - motivul pentru aceasta este o scădere a performanței în timpul actualizării cadrului pe formular utilizând metoda Invoke. În același timp, timpul mediu de acces la cadru pentru AviCap32 este comparabil cu timpul de acces când se utilizează DirectShow. Aceasta înseamnă că eliminarea invocării apelurilor. puteți obține o valoare identică a sarcinii utile. În cazul Fundației Media, dimpotrivă, valoarea accesului la cadru este mai mare decât restul. Acest lucru se datorează faptului că cadrele nu sunt stocate în memoria cache din partea Fundației Media și când se solicită următorul cadru, timpul de așteptare este pierdut. Adăugând un flux suplimentar pentru cadrele de cache, este posibil să se reducă valoarea accesului la cadru.

Referințe







Trimiteți-le prietenilor: