Wydajne pobieranie pikseli z wideo
Szukam skutecznego sposobu pobierania danych obrazu z plików wideo. Obecnie testujęFilgraphManagerClass.GetCurrentImage()
zInterop.QuartzTypeLib
biblioteka. To robi to, czego potrzebuję, ale jest boleśnie powolne. Muszę przetworzyć wszystkie klatki każdego filmu. Jakie mam lepsze opcje?
Wymagania
Musi być dokładna ramka. <- Bardzo ważne!Daje mi dostęp do zdekodowanego bufora pikseli (tablicaint
lubbyte[]
), najlepiej RGB24 lub RGB32.Bufor można złapać w czasie rzeczywistym lub szybciej. Nie muszę wyświetlać wideo, muszę tylko przeanalizować piksele.Obsługa plików mp4 (h264 / aac). W razie potrzeby mogę przewinąć lub obsłużyć ramkę za pomocą AviSynth, ale nie można brać udziału w retranscoding.Wszelkie sugestie będą mile widziane.
Wymagany kod:
FilgraphManagerClass graphClass = new FilgraphManagerClass();
graphClass.RenderFile(@"C:\tmp\tmp.avs");
int sz = (graphClass.Width * graphClass.Height + 10) * 4;
int[] buffer = new int[sz - 1];
Następnie przechodzę przez każdą klatkę. Mam coś takiego w pętli:
graphClass.GetCurrentImage(ref sz, out buffer[0]);
//DoStuff(buffer);
graphClass.CurrentPosition += graphClass.AvgTimePerFrame;