I am looking for an effective way to grab image data off video files. I am currently testing FilgraphManagerClass.GetCurrentImage()
from the Interop.QuartzTypeLib
library. This does what I need but is painfully slow. I need to process all frames of each video. What better options do I have?
Requirements
- Must be frame accurate. <-- Very important!
- Gives me access to the decoded pixel buffer (array of
int
orbyte[]
), ideally RGB24 or RGB32. - The buffer can be grabbed in realtime or faster. I do not need to display the video, I only need to analyze the pixels.
- Handle mp4 files (h264/aac). I can rewrap or frame serve via AviSynth if needed but no retranscoding can be involved.
Any suggestions would be welcome.
Some code as requested:
FilgraphManagerClass graphClass = new FilgraphManagerClass();
graphClass.RenderFile(@"C:\tmp\tmp.avs");
int sz = (graphClass.Width * graphClass.Height + 10) * 4;
int[] buffer = new int[sz - 1];
I am then stepping through each frame. I have something like this in the loop:
graphClass.GetCurrentImage(ref sz, out buffer[0]);
//DoStuff(buffer);
graphClass.CurrentPosition += graphClass.AvgTimePerFrame;