프로그램의 일부로 사용자 지정 비디오 파일에서 임의의 프레임을 몇 개 가져올 수 있어야합니다. 비디오 프로세싱 프로그래밍에 대한 경험이 없으므로 이것은 나에게 새로운 것입니다.DirectShow.net을 사용하여 비디오 프레임을 얻는 방법은 무엇입니까?
.Net을 사용하여 Windows XP에서이 작업을 수행하기 위해 DirectShow.net을 사용해야한다고 판단했으나이를 완료하는 방법을 알 수 없습니다. ISampleGrabber 인터페이스를 사용하려고하지만 모든 것을 알아낼 수 없어 예제를 찾을 수 없습니다.
인터넷에 DirectShow.net을 사용하는 예는 거의 없지만 .net을 사용하여 비디오에서 프레임을 가져온 사람은 분명합니다. 그래서 누군가가이 작업을 수행하는 샘플 코드를 알고 있는지 확인하려고합니다. 닫기. 이 코드와 함께 왔어요이 코드 프로젝트 기사와 함께 따라하려고
: 아니오 있기 때문에
// step 1
IGraphBuilder graphBuilder = (IGraphBuilder)new FilterGraph();
// step 2
IBaseFilter grabberBaseFilter;
ISampleGrabber sampleGrabber;
AMMediaType mt;
grabberBaseFilter = (IBaseFilter)new SampleGrabber();
sampleGrabber = (ISampleGrabber)grabberBaseFilter;
graphBuilder.AddFilter(grabberBaseFilter, "Grabber");
// step 3
mt = new AMMediaType();
mt.majorType = MediaType.Video;
mt.subType = MediaSubType.RGB24;
mt.formatType = FormatType.VideoInfo;
sampleGrabber.SetMediaType(mt);
graphBuilder.RenderFile(filename, null);
IMediaControl mediaControl = (IMediaControl)graphBuilder;
IMediaEvent mediaEventEx = (IMediaEvent)graphBuilder;
sampleGrabber.SetBufferSamples(true);
sampleGrabber.SetOneShot(true);
// step 4
mediaControl.Run();
EventCode evCode;
mediaEventEx.WaitForCompletion(int.MaxValue, out evCode);
AMMediaType connectedMediaType = new AMMediaType();
sampleGrabber.GetConnectedMediaType(connectedMediaType);
VideoInfoHeader videoHeader = (VideoInfoHeader)connectedMediaType.formatType;
BitmapInfo bitmapInfo = new BitmapInfo();
bitmapInfo.bmiHeader = videoHeader.BmiHeader;
// ::CreateDIBSection(0, &BitmapInfo, DIB_RGB_COLORS, &buffer, NULL, 0);
// legacy - GdiFlush();
// Copy the image into the buffer.
int size = 0;
sampleGrabber.GetCurrentBuffer(ref size, buffer);
부분 늘 컴파일 videoHeader 캐스트 라인과 끝의 GetCurrentBuffer 라인입니다 버퍼 변수 ...하지만 그것을 해결하기 위해 해야할지 모르겠다.
. 답변을 주셔서 감사합니다. –
IMediaDet에는 하나의 큰 문제가 있습니다. VIDEOINFOHEADER2 형식의 비디오는 지원하지 않습니다. – Yurec