Captura eficiente de pixels do vídeo
Eu estou procurando uma maneira eficaz de pegar dados de imagem de arquivos de vídeo. Eu estou atualmente testandoFilgraphManagerClass.GetCurrentImage()
deInterop.QuartzTypeLib
biblioteca. Isso faz o que eu preciso, mas é dolorosamente lento. Eu preciso processar todos os quadros de cada vídeo. Quais melhores opções eu tenho?
Requisitos
Deve ser preciso no quadro. <- Muito importante!Me dá acesso ao buffer de pixels decodificados (array deint
oubyte[]
), idealmente RGB24 ou RGB32.O buffer pode ser capturado em tempo real ou mais rápido. Eu não preciso exibir o vídeo, eu só preciso analisar os pixels.Lidar com arquivos mp4 (h264 / aac). Eu posso voltar a empacotar ou criar frames via AviSynth se necessário, mas nenhuma retranscoding pode estar envolvida.Qualquer sugestão seria bem vinda.
Algum código conforme solicitado:
FilgraphManagerClass graphClass = new FilgraphManagerClass();
graphClass.RenderFile(@"C:\tmp\tmp.avs");
int sz = (graphClass.Width * graphClass.Height + 10) * 4;
int[] buffer = new int[sz - 1];
Eu estou passando por cada quadro. Eu tenho algo parecido com isso no loop:
graphClass.GetCurrentImage(ref sz, out buffer[0]);
//DoStuff(buffer);
graphClass.CurrentPosition += graphClass.AvgTimePerFrame;